@codedrifters/configulator 0.0.302 → 0.0.304

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.mjs CHANGED
@@ -11208,14 +11208,17 @@ var maintenanceAuditBundle = buildMaintenanceAuditBundle();
11208
11208
  function buildMeetingAnalystSubAgent(tier) {
11209
11209
  return {
11210
11210
  name: "meeting-analyst",
11211
- description: "Processes meeting transcripts through a 4-phase pipeline: extract, notes, draft, and link",
11211
+ description: "Processes meeting notes and transcripts (sibling-tree layout) through a 4-phase pipeline: extract, notes, draft, and link",
11212
11212
  model: tier,
11213
11213
  maxTurns: 80,
11214
11214
  platforms: { cursor: { exclude: true } },
11215
11215
  prompt: [
11216
11216
  "# Meeting Analyst Agent",
11217
11217
  "",
11218
- "You process meeting transcripts through a structured 4-phase pipeline.",
11218
+ "You process meeting notes and transcripts through a structured",
11219
+ "4-phase pipeline. Notes and transcripts live in **parallel sibling",
11220
+ "trees** keyed by basename \u2014 see the **Meeting file layout** section",
11221
+ "below for the canonical directory layout and input-case matrix.",
11219
11222
  "Each phase runs as a **separate agent session**, triggered by its own",
11220
11223
  "GitHub issue with a `meeting:*` phase label. You handle exactly **one",
11221
11224
  "phase per session** \u2014 read the issue to determine which phase to execute.",
@@ -11248,6 +11251,87 @@ function buildMeetingAnalystSubAgent(tier) {
11248
11251
  " Apply the type-specific rules from the **Meeting type handling**",
11249
11252
  " table (phases 1\u20132) and the area-filtered routing rules from the",
11250
11253
  " **Areas filtering** table (phase 4).",
11254
+ "7. **Treat notes and transcripts as paired siblings.** Notes are the",
11255
+ " curated narrative summary; transcripts are the verbatim evidence",
11256
+ " record. Both are first-class inputs to Phase 1 \u2014 never assume the",
11257
+ " transcript is the sole input.",
11258
+ "",
11259
+ "---",
11260
+ "",
11261
+ "## Meeting file layout (sibling-tree model)",
11262
+ "",
11263
+ "The bundle organises meeting artifacts as **three parallel trees**",
11264
+ "rooted at `<meetingsRoot>`, partitioned by meeting type",
11265
+ "(`internal` / `external`):",
11266
+ "",
11267
+ "```",
11268
+ "<meetingsRoot>/",
11269
+ "\u251C\u2500\u2500 transcripts/{internal,external}/ \u2190 raw verbatim transcripts (input, evidence)",
11270
+ "\u251C\u2500\u2500 notes/{internal,external}/ \u2190 curated narrative summary (input + Phase 2 output)",
11271
+ "\u2514\u2500\u2500 insights/{internal,external}/ \u2190 structured extraction (Phase 1 output)",
11272
+ "```",
11273
+ "",
11274
+ "Within a given `{internal,external}` partition, the three trees share",
11275
+ "**identical basenames**: a meeting captured as",
11276
+ "`notes/internal/2026-03-14-sprint-kickoff.md` has its companion",
11277
+ "transcript at `transcripts/internal/2026-03-14-sprint-kickoff.md` and",
11278
+ "its Phase 1 extraction at `insights/internal/2026-03-14-sprint-kickoff.md`.",
11279
+ "Agents look up siblings via filesystem (basename match across the",
11280
+ "three trees), not via frontmatter cross-references.",
11281
+ "",
11282
+ "**Input-case matrix.** A meeting always has a `notes/` or",
11283
+ "`transcripts/` entry (often both); Phase 1 must handle every case:",
11284
+ "",
11285
+ "| Notes file? | Transcript file? | Case | Phase-1 behaviour |",
11286
+ "|-------------|------------------|------|--------------------|",
11287
+ "| Yes | Yes | **Both** | Read both; transcript is verbatim ground truth, notes are first-draft summary. Set `transcript_available: true`, `confidence: high`. |",
11288
+ "| Yes | No | **Notes-only** | Read notes only. Set `transcript_available: false`, `confidence: medium`. Do not invent dialogue the notes do not record. |",
11289
+ "| No | Yes | **Transcript-only** | Read transcript only. Set `transcript_available: true`, `confidence: high`. Phase 2 will author the notes file from the transcript. |",
11290
+ "",
11291
+ "Notes frontmatter is **optional**. A bare imported file with no",
11292
+ "frontmatter is a normal input case \u2014 treat missing fields as the",
11293
+ "defaults `meeting_type: other`, `source: unknown`, `confidence: medium`,",
11294
+ "and populate the real values on first processing. Never fail-loud on",
11295
+ "absent frontmatter.",
11296
+ "",
11297
+ "### Notes / insights frontmatter schema",
11298
+ "",
11299
+ "The following frontmatter fields are recognised on notes and",
11300
+ "insights files. Every field is optional \u2014 agents must read them",
11301
+ "defensively and supply defaults when absent.",
11302
+ "",
11303
+ "| Field | Type | Purpose | Default |",
11304
+ "|-------|------|---------|---------|",
11305
+ "| `slug` | string | Starlight slug override; lets agents normalise the URL without renaming files. | derived from filename |",
11306
+ "| `source` | `gemini` \\| `human` \\| `hybrid` \\| `unknown` | Provenance of the original notes (which authoring path produced them). | `unknown` |",
11307
+ "| `transcript_available` | boolean | Cached result of the filesystem check for the sibling transcript. | re-derive from filesystem |",
11308
+ "| `confidence` | `high` \\| `medium` \\| `low` | Reliability of the extraction. Downstream draft phases mark requirements **Tentative** when `confidence != high`. | `medium` |",
11309
+ "",
11310
+ "These additions coexist with the existing `meeting_type` and `areas`",
11311
+ "fields documented in the **Meeting type handling** and **Areas",
11312
+ "filtering** sections below.",
11313
+ "",
11314
+ "Transcript files themselves remain frontmatter-free \u2014 they are",
11315
+ "evidence-only, and agents never navigate to a transcript as a",
11316
+ "Starlight artifact.",
11317
+ "",
11318
+ "### Tree-level index pages",
11319
+ "",
11320
+ "Each of the three trees carries an `index.md` at its root and at",
11321
+ "each `{internal,external}` partition so Starlight renders a clean",
11322
+ "sidebar:",
11323
+ "",
11324
+ "- `<meetingsRoot>/transcripts/index.md` (and one per partition)",
11325
+ "- `<meetingsRoot>/notes/index.md` (and one per partition)",
11326
+ "- `<meetingsRoot>/insights/index.md` (and one per partition)",
11327
+ "",
11328
+ "Phase 1 must create the matching `insights/{type}/index.md` page",
11329
+ "the first time it writes a file into that partition. Phase 2 must",
11330
+ "create the matching `notes/{type}/index.md` page the first time it",
11331
+ "writes a notes file into that partition. Follow the `section-index`",
11332
+ "convention: a 1\u20132 paragraph summary of the tree's purpose plus a",
11333
+ "linked listing of the partition's children. Append a row for the",
11334
+ "current meeting's basename when an index already exists.",
11251
11335
  "",
11252
11336
  "---",
11253
11337
  "",
@@ -11376,17 +11460,45 @@ function buildMeetingAnalystSubAgent(tier) {
11376
11460
  "",
11377
11461
  "## Phase 1: Extract (`meeting:extract`)",
11378
11462
  "",
11379
- "**Goal:** Read the meeting transcript and categorize all substantive content.",
11463
+ "**Goal:** Read the available meeting inputs (notes, transcript, or both)",
11464
+ "and categorize all substantive content into a structured extraction.",
11380
11465
  "",
11381
11466
  "### Steps",
11382
11467
  "",
11383
- "1. Read the transcript file specified in the issue body. Parse the",
11384
- " meeting-note frontmatter first, capturing `meeting_type` and",
11385
- " `areas`. Resolve `meeting_type` to a kind using the **Meeting type",
11386
- " handling** table; note the resolved kind in the extraction",
11387
- " frontmatter. If `meeting_type` is missing or not in the project's",
11388
- " Recognized meeting types table, treat it as `other` and flag it",
11389
- " in Open Questions.",
11468
+ "1. Identify the meeting's basename and `{internal,external}` partition",
11469
+ " from the issue body using the **basename-pairing algorithm**, then",
11470
+ " read **every** sibling file that exists on disk:",
11471
+ " - Notes: `<meetingsRoot>/notes/{type}/<basename>.md`",
11472
+ " - Transcript: `<meetingsRoot>/transcripts/{type}/<basename>.md`",
11473
+ "",
11474
+ " **Basename-pairing algorithm.** The issue body (or invoking",
11475
+ " skill) may name either tree's path; resolve the sibling",
11476
+ " implicitly:",
11477
+ "",
11478
+ " - Infer the basename (filename without `.md`) and the",
11479
+ " `{internal,external}` partition from the provided path \u2014",
11480
+ " `\u2026/notes/internal/2026-03-14-sprint-kickoff.md` yields",
11481
+ " basename `2026-03-14-sprint-kickoff` and type `internal`.",
11482
+ " - If the input path lives under `/notes/`, look for the",
11483
+ " sibling at `<meetingsRoot>/transcripts/<type>/<basename>.md`.",
11484
+ " If it lives under `/transcripts/`, look for the sibling at",
11485
+ " `<meetingsRoot>/notes/<type>/<basename>.md`. If the path",
11486
+ " matches neither (ad-hoc location), infer basename + type as",
11487
+ " best you can from the filename and surrounding folder",
11488
+ " segments, then proceed with whichever sibling-tree lookups",
11489
+ " succeed. Best-effort, never fail-loud.",
11490
+ " - A missing sibling is a normal outcome \u2014 the input-case matrix",
11491
+ " covers notes-only and transcript-only paths. Never prompt or",
11492
+ " warn the user about the absence.",
11493
+ "",
11494
+ " Use the **input-case matrix** in **Meeting file layout** to decide",
11495
+ " which case you are in (both / notes-only / transcript-only). Parse",
11496
+ " the notes frontmatter first (if a notes file exists), capturing",
11497
+ " `meeting_type`, `areas`, `source`, and `confidence`. Resolve",
11498
+ " `meeting_type` to a kind using the **Meeting type handling**",
11499
+ " table; note the resolved kind in the extraction frontmatter. If",
11500
+ " `meeting_type` is missing, treat it as `other` and flag it in",
11501
+ " Open Questions \u2014 do **not** fail-loud on missing frontmatter.",
11390
11502
  "2. Identify and categorize content into these buckets:",
11391
11503
  "",
11392
11504
  " | Bucket | What to look for |",
@@ -11401,7 +11513,10 @@ function buildMeetingAnalystSubAgent(tier) {
11401
11513
  " | **Strategic direction** | Business model changes, market positioning |",
11402
11514
  " | **Product direction** | Roadmap changes, feature prioritization |",
11403
11515
  "",
11404
- "3. Write the extraction to a markdown file with structured sections:",
11516
+ "3. Write the extraction to",
11517
+ " `<meetingsRoot>/insights/{type}/<basename>.md` (matching the",
11518
+ " basename and `{internal,external}` partition of the source",
11519
+ " notes / transcript) with structured sections:",
11405
11520
  " - Attendees",
11406
11521
  " - Decisions Made (with category and confidence: Firm / Tentative / Needs confirmation)",
11407
11522
  " - Requirements Identified (with category and priority estimate)",
@@ -11412,9 +11527,14 @@ function buildMeetingAnalystSubAgent(tier) {
11412
11527
  " - Companies of Interest (with type and context)",
11413
11528
  " - Strategic / Product Direction",
11414
11529
  "",
11415
- " Carry `meeting_type`, the resolved `meeting_kind`, and `areas`",
11416
- " into the extraction frontmatter so downstream phases can gate",
11417
- " behaviour without re-parsing the meeting note.",
11530
+ " Carry the following into the extraction frontmatter so downstream",
11531
+ " phases can gate behaviour without re-parsing the source files:",
11532
+ " `meeting_type`, the resolved `meeting_kind`, `areas`,",
11533
+ " `transcript_available: true|false` (cached from the filesystem",
11534
+ " check in step 1), and `confidence: high|medium|low` (per the",
11535
+ " input-case matrix \u2014 `high` when a transcript is present, `medium`",
11536
+ " on notes-only, never silently downgraded to `low` without an",
11537
+ " explicit reason recorded in Open Questions).",
11418
11538
  "",
11419
11539
  "4. **Apply type-specific rules.** Consult the **Meeting type handling**",
11420
11540
  " table for the resolved kind and apply its phase-1 rules in",
@@ -11428,7 +11548,14 @@ function buildMeetingAnalystSubAgent(tier) {
11428
11548
  " Interest (signal threshold still applies); capture customer",
11429
11549
  " pain points as candidate BR (not FR).",
11430
11550
  "",
11431
- "5. **Create downstream phase issues** using `gh issue create`:",
11551
+ "5. **Maintain the `insights/` tree index.** Ensure",
11552
+ " `<meetingsRoot>/insights/index.md` and",
11553
+ " `<meetingsRoot>/insights/{type}/index.md` exist (create them",
11554
+ " following the `section-index` convention if missing) and append",
11555
+ " a row for the current meeting's basename if one is not already",
11556
+ " present.",
11557
+ "",
11558
+ "6. **Create downstream phase issues** using `gh issue create`:",
11432
11559
  " - Always create a `meeting:notes` issue (blocked on this extract issue)",
11433
11560
  " - If requirements OR decisions/ADRs identified, create a `meeting:draft` issue",
11434
11561
  " (blocked on the notes issue). For kind `standup`, skip the",
@@ -11437,18 +11564,59 @@ function buildMeetingAnalystSubAgent(tier) {
11437
11564
  " - Always create a `meeting:link` issue \u2014 blocked on the draft issue if one",
11438
11565
  " was created, otherwise blocked on the notes issue",
11439
11566
  "",
11440
- "6. Commit, push, and close the extract issue.",
11567
+ "7. Commit, push, and close the extract issue.",
11441
11568
  "",
11442
11569
  "---",
11443
11570
  "",
11444
11571
  "## Phase 2: Notes (`meeting:notes`)",
11445
11572
  "",
11446
- "**Goal:** Transform the extraction into structured meeting notes.",
11573
+ "**Goal:** Produce a curated `notes/{type}/<basename>.md` file that",
11574
+ "reflects the structured meeting record. The pivot here from older",
11575
+ 'versions of this bundle: Phase 2 is no longer "author notes from',
11576
+ 'scratch." It is **enhance and verify** \u2014 restructure the existing',
11577
+ "Gemini-generated notes (when present), verify factual claims",
11578
+ "against the transcript (when present), and fall back to authoring",
11579
+ "only when no notes file exists.",
11447
11580
  "",
11448
11581
  "### Steps",
11449
11582
  "",
11450
- "1. Read the extraction file referenced in the issue body (output of Phase 1).",
11451
- "2. Write structured meeting notes with these sections:",
11583
+ "1. Read the extraction at",
11584
+ " `<meetingsRoot>/insights/{type}/<basename>.md` (output of Phase 1).",
11585
+ " Read the `transcript_available` and `confidence` fields from its",
11586
+ " frontmatter. Then determine which input-case branch applies by",
11587
+ " checking the filesystem for the sibling notes and transcript",
11588
+ " files.",
11589
+ "2. **Branch by input case** (see the input-case matrix in the",
11590
+ " **Meeting file layout** section):",
11591
+ "",
11592
+ " - **Both notes and transcript present** (enhance + verify):",
11593
+ " Read the existing `notes/{type}/<basename>.md` in place.",
11594
+ " Restructure it into the canonical section layout below.",
11595
+ " Verify every factual claim against the transcript \u2014 when the",
11596
+ " transcript contradicts the notes, the transcript wins and the",
11597
+ " notes are corrected. Fill in gaps the transcript reveals were",
11598
+ " missed. Overwrite the notes file in place; preserve the",
11599
+ " existing frontmatter and update only the fields you changed",
11600
+ " (e.g. flip `source: gemini` to `source: hybrid` once the agent",
11601
+ " has edited the file). Set `confidence: high`.",
11602
+ "",
11603
+ " - **Notes only** (light structural cleanup):",
11604
+ " Read the existing `notes/{type}/<basename>.md`. Restructure it",
11605
+ " into the canonical section layout below. Do **not** invent",
11606
+ " dialogue or claims the notes do not record. Do **not** mark",
11607
+ " `confidence: high` \u2014 keep `confidence: medium` and record the",
11608
+ ' reason ("no transcript available for verification") in the',
11609
+ " notes' Open Questions section so downstream phases know to",
11610
+ " treat downstream requirement drafts as `Tentative`.",
11611
+ "",
11612
+ " - **Transcript only** (author from scratch):",
11613
+ " The notes file does not yet exist. Author",
11614
+ " `notes/{type}/<basename>.md` from the transcript using the",
11615
+ " section layout below. Populate frontmatter with",
11616
+ " `source: gemini` if the transcript is a Gemini transcript,",
11617
+ " otherwise `source: unknown`. Set `confidence: high`.",
11618
+ "",
11619
+ "3. Canonical notes section layout (applied in every branch above):",
11452
11620
  " - Meeting metadata (title, date, attendees)",
11453
11621
  " - Agenda / topics covered",
11454
11622
  " - Key Discussion Points (organized by topic)",
@@ -11456,7 +11624,13 @@ function buildMeetingAnalystSubAgent(tier) {
11456
11624
  " - Action Items (table: who, what, when)",
11457
11625
  " - Open Questions",
11458
11626
  " - Follow-up items",
11459
- "3. Commit, push, and close the notes issue.",
11627
+ "4. **Maintain the `notes/` tree index.** Ensure",
11628
+ " `<meetingsRoot>/notes/index.md` and",
11629
+ " `<meetingsRoot>/notes/{type}/index.md` exist (create them",
11630
+ " following the `section-index` convention if missing) and append",
11631
+ " a row for the current meeting's basename if one is not already",
11632
+ " present.",
11633
+ "5. Commit, push, and close the notes issue.",
11460
11634
  "",
11461
11635
  "---",
11462
11636
  "",
@@ -11469,7 +11643,8 @@ function buildMeetingAnalystSubAgent(tier) {
11469
11643
  "",
11470
11644
  "### Steps",
11471
11645
  "",
11472
- "1. Read the extraction file from Phase 1.",
11646
+ "1. Read the extraction file from Phase 1 at",
11647
+ " `<meetingsRoot>/insights/{type}/<basename>.md`.",
11473
11648
  "2. Check existing requirement registries and ADR registries for duplicates.",
11474
11649
  "3. Draft requirement proposals with:",
11475
11650
  " - Category (FR, BR, NFR, etc.)",
@@ -11493,7 +11668,8 @@ function buildMeetingAnalystSubAgent(tier) {
11493
11668
  "",
11494
11669
  "### Steps",
11495
11670
  "",
11496
- "1. Read the drafts from Phase 3 (if they exist) and the extraction from Phase 1.",
11671
+ "1. Read the drafts from Phase 3 (if they exist) and the extraction",
11672
+ " from Phase 1 at `<meetingsRoot>/insights/{type}/<basename>.md`.",
11497
11673
  " Re-read the extraction frontmatter for `meeting_kind` and `areas`,",
11498
11674
  " then build the area-gate: the set of `docRoot` sub-folders that",
11499
11675
  " are in scope for direct edits on this meeting. Apply the rules in",
@@ -11522,12 +11698,15 @@ function buildMeetingAnalystSubAgent(tier) {
11522
11698
  " sprint-plan doc's area is in-scope, or always when no",
11523
11699
  " `meetingAreas` are declared); for the kind `review`, mark",
11524
11700
  " completed tasks in that same doc.",
11525
- "7. **Update the extraction file** with a `## Downstream Artifacts` section",
11526
- " listing every issue and document created from this meeting. Note",
11527
- " any items that were deferred to follow-up issues because of the",
11528
- " area gate.",
11529
- "8. **Update the meeting notes** with a `## Related Issues` section listing",
11530
- " all issues created from this meeting.",
11701
+ "7. **Update the extraction file** at",
11702
+ " `<meetingsRoot>/insights/{type}/<basename>.md` with a",
11703
+ " `## Downstream Artifacts` section listing every issue and",
11704
+ " document created from this meeting. Note any items that were",
11705
+ " deferred to follow-up issues because of the area gate.",
11706
+ "8. **Update the meeting notes** at",
11707
+ " `<meetingsRoot>/notes/{type}/<basename>.md` with a",
11708
+ " `## Related Issues` section listing all issues created from this",
11709
+ " meeting.",
11531
11710
  "9. Comment on the parent extract issue with a summary linking to all",
11532
11711
  " created artifacts.",
11533
11712
  "10. Commit and push (if any file changes were made), then close the link issue.",
@@ -11561,21 +11740,58 @@ var processMeetingSkill = {
11561
11740
  agent: "meeting-analyst",
11562
11741
  platforms: { cursor: { exclude: true } },
11563
11742
  instructions: [
11564
- "# Process Meeting Transcript",
11743
+ "# Process Meeting",
11565
11744
  "",
11566
- "Kick off meeting transcript processing by executing Phase 1 (Extract)",
11567
- "and creating downstream phase issues for the remaining phases.",
11745
+ "Kick off meeting processing by executing Phase 1 (Extract) and",
11746
+ "creating downstream phase issues for the remaining phases. Inputs",
11747
+ "live in the **sibling-tree layout**: pass any file from",
11748
+ "`<meetingsRoot>/notes/{type}/` or `<meetingsRoot>/transcripts/{type}/`",
11749
+ "(both, notes-only, and transcript-only are all valid input cases).",
11568
11750
  "",
11569
11751
  "## Usage",
11570
11752
  "",
11571
- "/process-meeting <path-to-transcript>",
11753
+ "/process-meeting <path-to-notes-or-transcript>",
11754
+ "",
11755
+ "## Basename-pairing algorithm",
11756
+ "",
11757
+ "The user may pass either a notes-tree path or a transcripts-tree",
11758
+ "path. Resolve the sibling implicitly via filesystem lookup \u2014",
11759
+ "do **not** prompt the user or fail-loud when the sibling is",
11760
+ "absent:",
11761
+ "",
11762
+ "1. Infer the **basename** (filename without the `.md` extension)",
11763
+ " and the `{internal,external}` partition from the provided path.",
11764
+ " Both segments are usually adjacent in the path \u2014",
11765
+ " `\u2026/notes/internal/2026-03-14-sprint-kickoff.md` yields basename",
11766
+ " `2026-03-14-sprint-kickoff` and type `internal`.",
11767
+ "2. Determine the **input tree** from the path:",
11768
+ " - If the path contains `/notes/`, treat it as the notes input",
11769
+ " and look for the sibling at",
11770
+ " `<meetingsRoot>/transcripts/<type>/<basename>.md`.",
11771
+ " - If the path contains `/transcripts/`, treat it as the",
11772
+ " transcript input and look for the sibling at",
11773
+ " `<meetingsRoot>/notes/<type>/<basename>.md`.",
11774
+ " - If the path matches neither (e.g. an ad-hoc location), infer",
11775
+ " basename + type as best you can from the filename and",
11776
+ " surrounding folder segments, then proceed with whichever",
11777
+ " sibling-tree lookups succeed. Best-effort, never fail-loud.",
11778
+ "3. Read **every** sibling that exists on disk. The combination",
11779
+ " (notes present, transcript present, both present) selects the",
11780
+ " Phase-1 input case from the **input-case matrix** in the",
11781
+ " `meeting-analyst` agent prompt.",
11782
+ "4. A missing sibling is a normal outcome \u2014 proceed with whatever",
11783
+ " was found. Notes-only and transcript-only are both valid",
11784
+ " Phase-1 input cases; the agent never warns or prompts the",
11785
+ " user about the absence.",
11572
11786
  "",
11573
11787
  "## Steps",
11574
11788
  "",
11575
- "1. Read the provided transcript file",
11576
- "2. Execute Phase 1 (Extract) \u2014 categorize transcript content into",
11789
+ "1. Resolve the basename, partition, and any sibling files using",
11790
+ " the **Basename-pairing algorithm** above",
11791
+ "2. Execute Phase 1 (Extract) \u2014 categorize the available content into",
11577
11792
  " decisions, requirements, action items, open questions, and more",
11578
- "3. Write the extraction to a markdown file",
11793
+ "3. Write the extraction to",
11794
+ " `<meetingsRoot>/insights/{type}/<basename>.md`",
11579
11795
  "4. Create downstream phase issues using `gh issue create`:",
11580
11796
  " - `meeting:notes` issue (always)",
11581
11797
  " - `meeting:draft` issue (if requirements or decisions were found)",
@@ -11585,12 +11801,15 @@ var processMeetingSkill = {
11585
11801
  "",
11586
11802
  "## Input",
11587
11803
  "",
11588
- "Provide a path to a meeting transcript file (text or markdown).",
11589
- "The transcript should contain speaker-attributed dialogue.",
11804
+ "Provide a path to a file in either `notes/` or `transcripts/`. The",
11805
+ "agent will look up the sibling automatically via basename match. A",
11806
+ "missing sibling is a normal case (notes-only or transcript-only) \u2014",
11807
+ "the agent handles all three input cases.",
11590
11808
  "",
11591
11809
  "## Output",
11592
11810
  "",
11593
- "- An extraction markdown file with categorized meeting content",
11811
+ "- A structured extraction at",
11812
+ " `<meetingsRoot>/insights/{type}/<basename>.md`",
11594
11813
  "- Phase issues with `meeting:*` labels for downstream agent sessions",
11595
11814
  " to pick up (notes, draft, link)"
11596
11815
  ].join("\n")
@@ -11608,11 +11827,30 @@ function buildMeetingAnalysisBundle(tier = AGENT_MODEL.BALANCED) {
11608
11827
  content: [
11609
11828
  "# Meeting Processing Workflow",
11610
11829
  "",
11611
- "Use `/process-meeting <path>` to process a meeting transcript through a",
11830
+ "Use `/process-meeting <path>` to process a meeting through a",
11612
11831
  "4-phase pipeline (extract \u2192 notes \u2192 draft \u2192 link). Each phase runs as a",
11613
11832
  "separate agent session tracked by a GitHub issue with a `meeting:*` label.",
11614
11833
  "See the `meeting-analyst` agent definition for full workflow details.",
11615
11834
  "",
11835
+ "Meeting artifacts live in **three parallel trees** rooted at the",
11836
+ "project's meetings root:",
11837
+ "",
11838
+ "- `transcripts/{internal,external}/` \u2014 verbatim transcripts (evidence)",
11839
+ "- `notes/{internal,external}/` \u2014 curated narrative summary",
11840
+ " (input + Phase 2 output)",
11841
+ "- `insights/{internal,external}/` \u2014 structured extraction (Phase 1 output)",
11842
+ "",
11843
+ "The three trees share identical basenames so a meeting's siblings",
11844
+ "are looked up by filename, not by frontmatter cross-references.",
11845
+ "Phase 1 accepts every input case (notes + transcript, notes only,",
11846
+ "or transcript only) and Phase 2 enhances the notes file in place",
11847
+ "rather than authoring it from scratch.",
11848
+ "",
11849
+ "Notes and insights files may carry optional frontmatter fields",
11850
+ "`slug`, `source`, `transcript_available`, and `confidence`",
11851
+ "alongside the existing `meeting_type` and `areas` fields. Missing",
11852
+ "frontmatter is treated as a normal input case \u2014 never fail-loud.",
11853
+ "",
11616
11854
  "Meeting notes may declare a `meeting_type` (one of the project's",
11617
11855
  "recognized types) and an `areas: [...]` list. The `meeting_type`",
11618
11856
  "resolves to a generic kind \u2014 `planning` / `review` / `brainstorm` /",