Skip to content

Meeting repo registry: spec + parser + seeded registry (#11) - #32

Open
michaeloboyle wants to merge 2 commits into
mainfrom
feature/repo-registry-spec
Open

Meeting repo registry: spec + parser + seeded registry (#11)#32
michaeloboyle wants to merge 2 commits into
mainfrom
feature/repo-registry-spec

Conversation

@michaeloboyle

Copy link
Copy Markdown
Collaborator

What

Turns "repos people introduced in AF meetings" into a maintained, public-safe registry — the candidate pool for Issue #11 and the target list for OIA assessment. Each entry is attributed to its introducer (earliest speaker, not the owner) and its first-seen date.

Spec-first (RGBDD)

  • features/repo-registry.feature (Gherkin, house style) makes the judgment calls explicit: introducer = earliest speaker; curated Feb–Apr seed merges with automated passes (earliest date wins); public-safe output (no PII); unparsed sources reported, not dropped.
  • test/repo-registry.test.js — 11 tests mapping 1:1 to the scenarios.

Implementation

  • lib/repo-registry.js — pure buildRegistry() (deterministic; no Date/random) + toPublicRegistry() (whitelisted fields + PII guard). Extraction via GitHub URLs and a known-project lexicon; earliest-speaker attribution; URL/lexicon dedupe; seed merge.
  • scripts/build-repo-registry.mjs — CLI. Reads the curated seed + an optional --sources <dir>. Raw transcripts stay in PKM (internal) and are passed at runtime, never committed — only the public-safe projection lands here.
  • data/meeting-repos-seed.json — 18 curated Feb–Apr entries from member-intelligence.
  • data/meeting-repos.json — the generated registry: 18 repos, and the 9 May–Jul Google Meet transcripts listed under not_yet_parsed (coverage honesty — completing them needs those transcripts as text).

Verification (behavioral, not deploy-state)

  • Full suite 129 → 140, all green.
  • Red-first: tests failed with ERR_MODULE_NOT_FOUND before the lib existed.
  • Mutation-checked: inverting the earliest-wins sort makes the attribution test fail; the PII guard is proven to fire on a phone leaked into a whitelisted field.
  • Registry output confirmed email/phone-free.

Known limits (stated, not hidden)

  • Member-intel introducers are association-inferred pending verification against raw chat lines (flagged via source: member-intel).
  • Owners left null where unverified carry an owner-unverified flag rather than a guess.
  • This is the data source for the upcoming committee Prism's "repos" lens.

🤖 Generated with Claude Code

michaeloboyle and others added 2 commits July 13, 2026 10:10
Gherkin spec for the meeting repo-registry parser (Issue #11 candidate pool /
OIA-attractor target list). Makes the judgment calls explicit: introducer =
earliest speaker not owner; curated Feb-Apr seed merges with automated passes
(earliest date wins); public-safe output (no PII); unparsed sources reported
not dropped. No implementation yet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…s part of #11)

Parser that turns repos introduced in AF meetings into a public-safe registry,
each entry attributed to its INTRODUCER (earliest speaker, not owner) and
first-seen date. Implements features/repo-registry.feature (spec-first).

- lib/repo-registry.js: pure buildRegistry() (deterministic) + toPublicRegistry()
  (whitelisted fields, PII guard). Extraction via GitHub URLs + a known-project
  lexicon; earliest-speaker attribution; URL/lexicon dedupe; seed merge.
- test/repo-registry.test.js: 11 tests mapping 1:1 to the feature scenarios.
  Red-first, and mutation-checked (inverting earliest-wins fails the test;
  PII guard proven to fire on a leaked phone).
- scripts/build-repo-registry.mjs: CLI. Reads the curated seed + optional
  --sources dir (raw transcripts stay in PKM, passed at runtime, never committed).
- data/meeting-repos-seed.json: 18 curated Feb-Apr entries from member-intel.
- data/meeting-repos.json: generated registry (18 repos; 9 May-Jul Meet
  transcripts reported as not_yet_parsed, not silently dropped).

Full suite 129 -> 140, all green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 13, 2026 15:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a “meeting repo registry” pipeline that turns meeting chat/transcript inputs plus a curated seed into a deterministic registry, along with a public-safe projection and a CLI that writes data/meeting-repos.json for use as an OSS committee candidate pool (Issue #11).

Changes:

  • Adds a Gherkin spec and a matching Node test suite for registry extraction, attribution, dedupe, public-safe output, and reporting of unparsed sources.
  • Implements the registry builder (buildRegistry) and a public projection (toPublicRegistry) plus a lexicon of known projects.
  • Adds a CLI to generate the public registry JSON from the seed and optional runtime-provided transcript sources, and commits the initial seed + generated output.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
features/repo-registry.feature Defines the expected registry behavior and output contract (spec-first).
lib/repo-registry.js Implements registry construction + public-safe projection + lexicon.
scripts/build-repo-registry.mjs CLI to generate data/meeting-repos.json from seed and optional sources.
test/repo-registry.test.js Tests mapping to the Gherkin scenarios for extraction/merge/dedupe/output.
data/meeting-repos-seed.json Curated seed entries + provenance + not-yet-parsed list.
data/meeting-repos.json Generated public registry output committed to the repo.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/repo-registry.js
Comment on lines +10 to +14
export const LEXICON = [
{ canonical: 'agenticsorg/OIA-Model', name: 'OIA-Model', aliases: ['OIA-Model'], owner: 'agenticsorg', url: 'https://github.com/agenticsorg/OIA-Model' },
{ canonical: 'CraftsMan-Labs/SimpleAgents', name: 'SimpleAgents', aliases: ['SimpleAgents'], owner: 'CraftsMan-Labs', url: 'https://github.com/CraftsMan-Labs/SimpleAgents' },
{ canonical: 'ruvnet/RuVector', name: 'RuVector', aliases: ['RuVector'], owner: 'ruvnet', url: 'https://github.com/ruvnet/RuVector' },
{ canonical: 'ruvnet/ruflo', name: 'ruflo', aliases: ['ruflo'], owner: 'ruvnet', url: 'https://github.com/ruvnet/ruflo' },
Comment on lines +1 to +6
// Tests for the meeting repo registry parser.
// Implements features/repo-registry.feature. Introducer = earliest speaker.
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { buildRegistry, toPublicRegistry, LEXICON } from '../lib/repo-registry.js';

Comment on lines +14 to +18
import { readFile, writeFile, readdir } from 'node:fs/promises';
import { existsSync } from 'node:fs';
import { join, basename } from 'node:path';
import { buildRegistry, toPublicRegistry, LEXICON } from '../lib/repo-registry.js';


async function loadSources(dir) {
if (!dir || !existsSync(dir)) return [];
const files = (await readdir(dir)).filter((f) => /\.(txt|md)$/i.test(f));
Comment on lines +8 to +10
// files. Each file's date is taken from a leading YYYY-MM-DD in its name.
// Raw transcripts live in PKM (internal) and are NOT committed here; pass
// the dir at runtime. Without it, the registry is built from the seed.
# AF meeting chats/transcripts + AF-Member-Intelligence (Feb-Jul 2026);
# OIA-as-attractor plan (2026-07-13) -- the registry is the warm-lead
# target list of repos to assess against OIA.
# Status: RED (no implementation)
Comment thread lib/repo-registry.js
return { entries, report: { parsed_sources: sources.length, not_yet_parsed: [...notYetParsed] } };
}

/** Project entries to the public-safe shape (whitelisted fields, PII-checked). */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants