@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.js CHANGED
@@ -11496,14 +11496,17 @@ var maintenanceAuditBundle = buildMaintenanceAuditBundle();
11496
11496
  function buildMeetingAnalystSubAgent(tier) {
11497
11497
  return {
11498
11498
  name: "meeting-analyst",
11499
- description: "Processes meeting transcripts through a 4-phase pipeline: extract, notes, draft, and link",
11499
+ description: "Processes meeting notes and transcripts (sibling-tree layout) through a 4-phase pipeline: extract, notes, draft, and link",
11500
11500
  model: tier,
11501
11501
  maxTurns: 80,
11502
11502
  platforms: { cursor: { exclude: true } },
11503
11503
  prompt: [
11504
11504
  "# Meeting Analyst Agent",
11505
11505
  "",
11506
- "You process meeting transcripts through a structured 4-phase pipeline.",
11506
+ "You process meeting notes and transcripts through a structured",
11507
+ "4-phase pipeline. Notes and transcripts live in **parallel sibling",
11508
+ "trees** keyed by basename \u2014 see the **Meeting file layout** section",
11509
+ "below for the canonical directory layout and input-case matrix.",
11507
11510
  "Each phase runs as a **separate agent session**, triggered by its own",
11508
11511
  "GitHub issue with a `meeting:*` phase label. You handle exactly **one",
11509
11512
  "phase per session** \u2014 read the issue to determine which phase to execute.",
@@ -11536,6 +11539,87 @@ function buildMeetingAnalystSubAgent(tier) {
11536
11539
  " Apply the type-specific rules from the **Meeting type handling**",
11537
11540
  " table (phases 1\u20132) and the area-filtered routing rules from the",
11538
11541
  " **Areas filtering** table (phase 4).",
11542
+ "7. **Treat notes and transcripts as paired siblings.** Notes are the",
11543
+ " curated narrative summary; transcripts are the verbatim evidence",
11544
+ " record. Both are first-class inputs to Phase 1 \u2014 never assume the",
11545
+ " transcript is the sole input.",
11546
+ "",
11547
+ "---",
11548
+ "",
11549
+ "## Meeting file layout (sibling-tree model)",
11550
+ "",
11551
+ "The bundle organises meeting artifacts as **three parallel trees**",
11552
+ "rooted at `<meetingsRoot>`, partitioned by meeting type",
11553
+ "(`internal` / `external`):",
11554
+ "",
11555
+ "```",
11556
+ "<meetingsRoot>/",
11557
+ "\u251C\u2500\u2500 transcripts/{internal,external}/ \u2190 raw verbatim transcripts (input, evidence)",
11558
+ "\u251C\u2500\u2500 notes/{internal,external}/ \u2190 curated narrative summary (input + Phase 2 output)",
11559
+ "\u2514\u2500\u2500 insights/{internal,external}/ \u2190 structured extraction (Phase 1 output)",
11560
+ "```",
11561
+ "",
11562
+ "Within a given `{internal,external}` partition, the three trees share",
11563
+ "**identical basenames**: a meeting captured as",
11564
+ "`notes/internal/2026-03-14-sprint-kickoff.md` has its companion",
11565
+ "transcript at `transcripts/internal/2026-03-14-sprint-kickoff.md` and",
11566
+ "its Phase 1 extraction at `insights/internal/2026-03-14-sprint-kickoff.md`.",
11567
+ "Agents look up siblings via filesystem (basename match across the",
11568
+ "three trees), not via frontmatter cross-references.",
11569
+ "",
11570
+ "**Input-case matrix.** A meeting always has a `notes/` or",
11571
+ "`transcripts/` entry (often both); Phase 1 must handle every case:",
11572
+ "",
11573
+ "| Notes file? | Transcript file? | Case | Phase-1 behaviour |",
11574
+ "|-------------|------------------|------|--------------------|",
11575
+ "| Yes | Yes | **Both** | Read both; transcript is verbatim ground truth, notes are first-draft summary. Set `transcript_available: true`, `confidence: high`. |",
11576
+ "| Yes | No | **Notes-only** | Read notes only. Set `transcript_available: false`, `confidence: medium`. Do not invent dialogue the notes do not record. |",
11577
+ "| No | Yes | **Transcript-only** | Read transcript only. Set `transcript_available: true`, `confidence: high`. Phase 2 will author the notes file from the transcript. |",
11578
+ "",
11579
+ "Notes frontmatter is **optional**. A bare imported file with no",
11580
+ "frontmatter is a normal input case \u2014 treat missing fields as the",
11581
+ "defaults `meeting_type: other`, `source: unknown`, `confidence: medium`,",
11582
+ "and populate the real values on first processing. Never fail-loud on",
11583
+ "absent frontmatter.",
11584
+ "",
11585
+ "### Notes / insights frontmatter schema",
11586
+ "",
11587
+ "The following frontmatter fields are recognised on notes and",
11588
+ "insights files. Every field is optional \u2014 agents must read them",
11589
+ "defensively and supply defaults when absent.",
11590
+ "",
11591
+ "| Field | Type | Purpose | Default |",
11592
+ "|-------|------|---------|---------|",
11593
+ "| `slug` | string | Starlight slug override; lets agents normalise the URL without renaming files. | derived from filename |",
11594
+ "| `source` | `gemini` \\| `human` \\| `hybrid` \\| `unknown` | Provenance of the original notes (which authoring path produced them). | `unknown` |",
11595
+ "| `transcript_available` | boolean | Cached result of the filesystem check for the sibling transcript. | re-derive from filesystem |",
11596
+ "| `confidence` | `high` \\| `medium` \\| `low` | Reliability of the extraction. Downstream draft phases mark requirements **Tentative** when `confidence != high`. | `medium` |",
11597
+ "",
11598
+ "These additions coexist with the existing `meeting_type` and `areas`",
11599
+ "fields documented in the **Meeting type handling** and **Areas",
11600
+ "filtering** sections below.",
11601
+ "",
11602
+ "Transcript files themselves remain frontmatter-free \u2014 they are",
11603
+ "evidence-only, and agents never navigate to a transcript as a",
11604
+ "Starlight artifact.",
11605
+ "",
11606
+ "### Tree-level index pages",
11607
+ "",
11608
+ "Each of the three trees carries an `index.md` at its root and at",
11609
+ "each `{internal,external}` partition so Starlight renders a clean",
11610
+ "sidebar:",
11611
+ "",
11612
+ "- `<meetingsRoot>/transcripts/index.md` (and one per partition)",
11613
+ "- `<meetingsRoot>/notes/index.md` (and one per partition)",
11614
+ "- `<meetingsRoot>/insights/index.md` (and one per partition)",
11615
+ "",
11616
+ "Phase 1 must create the matching `insights/{type}/index.md` page",
11617
+ "the first time it writes a file into that partition. Phase 2 must",
11618
+ "create the matching `notes/{type}/index.md` page the first time it",
11619
+ "writes a notes file into that partition. Follow the `section-index`",
11620
+ "convention: a 1\u20132 paragraph summary of the tree's purpose plus a",
11621
+ "linked listing of the partition's children. Append a row for the",
11622
+ "current meeting's basename when an index already exists.",
11539
11623
  "",
11540
11624
  "---",
11541
11625
  "",
@@ -11664,17 +11748,45 @@ function buildMeetingAnalystSubAgent(tier) {
11664
11748
  "",
11665
11749
  "## Phase 1: Extract (`meeting:extract`)",
11666
11750
  "",
11667
- "**Goal:** Read the meeting transcript and categorize all substantive content.",
11751
+ "**Goal:** Read the available meeting inputs (notes, transcript, or both)",
11752
+ "and categorize all substantive content into a structured extraction.",
11668
11753
  "",
11669
11754
  "### Steps",
11670
11755
  "",
11671
- "1. Read the transcript file specified in the issue body. Parse the",
11672
- " meeting-note frontmatter first, capturing `meeting_type` and",
11673
- " `areas`. Resolve `meeting_type` to a kind using the **Meeting type",
11674
- " handling** table; note the resolved kind in the extraction",
11675
- " frontmatter. If `meeting_type` is missing or not in the project's",
11676
- " Recognized meeting types table, treat it as `other` and flag it",
11677
- " in Open Questions.",
11756
+ "1. Identify the meeting's basename and `{internal,external}` partition",
11757
+ " from the issue body using the **basename-pairing algorithm**, then",
11758
+ " read **every** sibling file that exists on disk:",
11759
+ " - Notes: `<meetingsRoot>/notes/{type}/<basename>.md`",
11760
+ " - Transcript: `<meetingsRoot>/transcripts/{type}/<basename>.md`",
11761
+ "",
11762
+ " **Basename-pairing algorithm.** The issue body (or invoking",
11763
+ " skill) may name either tree's path; resolve the sibling",
11764
+ " implicitly:",
11765
+ "",
11766
+ " - Infer the basename (filename without `.md`) and the",
11767
+ " `{internal,external}` partition from the provided path \u2014",
11768
+ " `\u2026/notes/internal/2026-03-14-sprint-kickoff.md` yields",
11769
+ " basename `2026-03-14-sprint-kickoff` and type `internal`.",
11770
+ " - If the input path lives under `/notes/`, look for the",
11771
+ " sibling at `<meetingsRoot>/transcripts/<type>/<basename>.md`.",
11772
+ " If it lives under `/transcripts/`, look for the sibling at",
11773
+ " `<meetingsRoot>/notes/<type>/<basename>.md`. If the path",
11774
+ " matches neither (ad-hoc location), infer basename + type as",
11775
+ " best you can from the filename and surrounding folder",
11776
+ " segments, then proceed with whichever sibling-tree lookups",
11777
+ " succeed. Best-effort, never fail-loud.",
11778
+ " - A missing sibling is a normal outcome \u2014 the input-case matrix",
11779
+ " covers notes-only and transcript-only paths. Never prompt or",
11780
+ " warn the user about the absence.",
11781
+ "",
11782
+ " Use the **input-case matrix** in **Meeting file layout** to decide",
11783
+ " which case you are in (both / notes-only / transcript-only). Parse",
11784
+ " the notes frontmatter first (if a notes file exists), capturing",
11785
+ " `meeting_type`, `areas`, `source`, and `confidence`. Resolve",
11786
+ " `meeting_type` to a kind using the **Meeting type handling**",
11787
+ " table; note the resolved kind in the extraction frontmatter. If",
11788
+ " `meeting_type` is missing, treat it as `other` and flag it in",
11789
+ " Open Questions \u2014 do **not** fail-loud on missing frontmatter.",
11678
11790
  "2. Identify and categorize content into these buckets:",
11679
11791
  "",
11680
11792
  " | Bucket | What to look for |",
@@ -11689,7 +11801,10 @@ function buildMeetingAnalystSubAgent(tier) {
11689
11801
  " | **Strategic direction** | Business model changes, market positioning |",
11690
11802
  " | **Product direction** | Roadmap changes, feature prioritization |",
11691
11803
  "",
11692
- "3. Write the extraction to a markdown file with structured sections:",
11804
+ "3. Write the extraction to",
11805
+ " `<meetingsRoot>/insights/{type}/<basename>.md` (matching the",
11806
+ " basename and `{internal,external}` partition of the source",
11807
+ " notes / transcript) with structured sections:",
11693
11808
  " - Attendees",
11694
11809
  " - Decisions Made (with category and confidence: Firm / Tentative / Needs confirmation)",
11695
11810
  " - Requirements Identified (with category and priority estimate)",
@@ -11700,9 +11815,14 @@ function buildMeetingAnalystSubAgent(tier) {
11700
11815
  " - Companies of Interest (with type and context)",
11701
11816
  " - Strategic / Product Direction",
11702
11817
  "",
11703
- " Carry `meeting_type`, the resolved `meeting_kind`, and `areas`",
11704
- " into the extraction frontmatter so downstream phases can gate",
11705
- " behaviour without re-parsing the meeting note.",
11818
+ " Carry the following into the extraction frontmatter so downstream",
11819
+ " phases can gate behaviour without re-parsing the source files:",
11820
+ " `meeting_type`, the resolved `meeting_kind`, `areas`,",
11821
+ " `transcript_available: true|false` (cached from the filesystem",
11822
+ " check in step 1), and `confidence: high|medium|low` (per the",
11823
+ " input-case matrix \u2014 `high` when a transcript is present, `medium`",
11824
+ " on notes-only, never silently downgraded to `low` without an",
11825
+ " explicit reason recorded in Open Questions).",
11706
11826
  "",
11707
11827
  "4. **Apply type-specific rules.** Consult the **Meeting type handling**",
11708
11828
  " table for the resolved kind and apply its phase-1 rules in",
@@ -11716,7 +11836,14 @@ function buildMeetingAnalystSubAgent(tier) {
11716
11836
  " Interest (signal threshold still applies); capture customer",
11717
11837
  " pain points as candidate BR (not FR).",
11718
11838
  "",
11719
- "5. **Create downstream phase issues** using `gh issue create`:",
11839
+ "5. **Maintain the `insights/` tree index.** Ensure",
11840
+ " `<meetingsRoot>/insights/index.md` and",
11841
+ " `<meetingsRoot>/insights/{type}/index.md` exist (create them",
11842
+ " following the `section-index` convention if missing) and append",
11843
+ " a row for the current meeting's basename if one is not already",
11844
+ " present.",
11845
+ "",
11846
+ "6. **Create downstream phase issues** using `gh issue create`:",
11720
11847
  " - Always create a `meeting:notes` issue (blocked on this extract issue)",
11721
11848
  " - If requirements OR decisions/ADRs identified, create a `meeting:draft` issue",
11722
11849
  " (blocked on the notes issue). For kind `standup`, skip the",
@@ -11725,18 +11852,59 @@ function buildMeetingAnalystSubAgent(tier) {
11725
11852
  " - Always create a `meeting:link` issue \u2014 blocked on the draft issue if one",
11726
11853
  " was created, otherwise blocked on the notes issue",
11727
11854
  "",
11728
- "6. Commit, push, and close the extract issue.",
11855
+ "7. Commit, push, and close the extract issue.",
11729
11856
  "",
11730
11857
  "---",
11731
11858
  "",
11732
11859
  "## Phase 2: Notes (`meeting:notes`)",
11733
11860
  "",
11734
- "**Goal:** Transform the extraction into structured meeting notes.",
11861
+ "**Goal:** Produce a curated `notes/{type}/<basename>.md` file that",
11862
+ "reflects the structured meeting record. The pivot here from older",
11863
+ 'versions of this bundle: Phase 2 is no longer "author notes from',
11864
+ 'scratch." It is **enhance and verify** \u2014 restructure the existing',
11865
+ "Gemini-generated notes (when present), verify factual claims",
11866
+ "against the transcript (when present), and fall back to authoring",
11867
+ "only when no notes file exists.",
11735
11868
  "",
11736
11869
  "### Steps",
11737
11870
  "",
11738
- "1. Read the extraction file referenced in the issue body (output of Phase 1).",
11739
- "2. Write structured meeting notes with these sections:",
11871
+ "1. Read the extraction at",
11872
+ " `<meetingsRoot>/insights/{type}/<basename>.md` (output of Phase 1).",
11873
+ " Read the `transcript_available` and `confidence` fields from its",
11874
+ " frontmatter. Then determine which input-case branch applies by",
11875
+ " checking the filesystem for the sibling notes and transcript",
11876
+ " files.",
11877
+ "2. **Branch by input case** (see the input-case matrix in the",
11878
+ " **Meeting file layout** section):",
11879
+ "",
11880
+ " - **Both notes and transcript present** (enhance + verify):",
11881
+ " Read the existing `notes/{type}/<basename>.md` in place.",
11882
+ " Restructure it into the canonical section layout below.",
11883
+ " Verify every factual claim against the transcript \u2014 when the",
11884
+ " transcript contradicts the notes, the transcript wins and the",
11885
+ " notes are corrected. Fill in gaps the transcript reveals were",
11886
+ " missed. Overwrite the notes file in place; preserve the",
11887
+ " existing frontmatter and update only the fields you changed",
11888
+ " (e.g. flip `source: gemini` to `source: hybrid` once the agent",
11889
+ " has edited the file). Set `confidence: high`.",
11890
+ "",
11891
+ " - **Notes only** (light structural cleanup):",
11892
+ " Read the existing `notes/{type}/<basename>.md`. Restructure it",
11893
+ " into the canonical section layout below. Do **not** invent",
11894
+ " dialogue or claims the notes do not record. Do **not** mark",
11895
+ " `confidence: high` \u2014 keep `confidence: medium` and record the",
11896
+ ' reason ("no transcript available for verification") in the',
11897
+ " notes' Open Questions section so downstream phases know to",
11898
+ " treat downstream requirement drafts as `Tentative`.",
11899
+ "",
11900
+ " - **Transcript only** (author from scratch):",
11901
+ " The notes file does not yet exist. Author",
11902
+ " `notes/{type}/<basename>.md` from the transcript using the",
11903
+ " section layout below. Populate frontmatter with",
11904
+ " `source: gemini` if the transcript is a Gemini transcript,",
11905
+ " otherwise `source: unknown`. Set `confidence: high`.",
11906
+ "",
11907
+ "3. Canonical notes section layout (applied in every branch above):",
11740
11908
  " - Meeting metadata (title, date, attendees)",
11741
11909
  " - Agenda / topics covered",
11742
11910
  " - Key Discussion Points (organized by topic)",
@@ -11744,7 +11912,13 @@ function buildMeetingAnalystSubAgent(tier) {
11744
11912
  " - Action Items (table: who, what, when)",
11745
11913
  " - Open Questions",
11746
11914
  " - Follow-up items",
11747
- "3. Commit, push, and close the notes issue.",
11915
+ "4. **Maintain the `notes/` tree index.** Ensure",
11916
+ " `<meetingsRoot>/notes/index.md` and",
11917
+ " `<meetingsRoot>/notes/{type}/index.md` exist (create them",
11918
+ " following the `section-index` convention if missing) and append",
11919
+ " a row for the current meeting's basename if one is not already",
11920
+ " present.",
11921
+ "5. Commit, push, and close the notes issue.",
11748
11922
  "",
11749
11923
  "---",
11750
11924
  "",
@@ -11757,7 +11931,8 @@ function buildMeetingAnalystSubAgent(tier) {
11757
11931
  "",
11758
11932
  "### Steps",
11759
11933
  "",
11760
- "1. Read the extraction file from Phase 1.",
11934
+ "1. Read the extraction file from Phase 1 at",
11935
+ " `<meetingsRoot>/insights/{type}/<basename>.md`.",
11761
11936
  "2. Check existing requirement registries and ADR registries for duplicates.",
11762
11937
  "3. Draft requirement proposals with:",
11763
11938
  " - Category (FR, BR, NFR, etc.)",
@@ -11781,7 +11956,8 @@ function buildMeetingAnalystSubAgent(tier) {
11781
11956
  "",
11782
11957
  "### Steps",
11783
11958
  "",
11784
- "1. Read the drafts from Phase 3 (if they exist) and the extraction from Phase 1.",
11959
+ "1. Read the drafts from Phase 3 (if they exist) and the extraction",
11960
+ " from Phase 1 at `<meetingsRoot>/insights/{type}/<basename>.md`.",
11785
11961
  " Re-read the extraction frontmatter for `meeting_kind` and `areas`,",
11786
11962
  " then build the area-gate: the set of `docRoot` sub-folders that",
11787
11963
  " are in scope for direct edits on this meeting. Apply the rules in",
@@ -11810,12 +11986,15 @@ function buildMeetingAnalystSubAgent(tier) {
11810
11986
  " sprint-plan doc's area is in-scope, or always when no",
11811
11987
  " `meetingAreas` are declared); for the kind `review`, mark",
11812
11988
  " completed tasks in that same doc.",
11813
- "7. **Update the extraction file** with a `## Downstream Artifacts` section",
11814
- " listing every issue and document created from this meeting. Note",
11815
- " any items that were deferred to follow-up issues because of the",
11816
- " area gate.",
11817
- "8. **Update the meeting notes** with a `## Related Issues` section listing",
11818
- " all issues created from this meeting.",
11989
+ "7. **Update the extraction file** at",
11990
+ " `<meetingsRoot>/insights/{type}/<basename>.md` with a",
11991
+ " `## Downstream Artifacts` section listing every issue and",
11992
+ " document created from this meeting. Note any items that were",
11993
+ " deferred to follow-up issues because of the area gate.",
11994
+ "8. **Update the meeting notes** at",
11995
+ " `<meetingsRoot>/notes/{type}/<basename>.md` with a",
11996
+ " `## Related Issues` section listing all issues created from this",
11997
+ " meeting.",
11819
11998
  "9. Comment on the parent extract issue with a summary linking to all",
11820
11999
  " created artifacts.",
11821
12000
  "10. Commit and push (if any file changes were made), then close the link issue.",
@@ -11849,21 +12028,58 @@ var processMeetingSkill = {
11849
12028
  agent: "meeting-analyst",
11850
12029
  platforms: { cursor: { exclude: true } },
11851
12030
  instructions: [
11852
- "# Process Meeting Transcript",
12031
+ "# Process Meeting",
11853
12032
  "",
11854
- "Kick off meeting transcript processing by executing Phase 1 (Extract)",
11855
- "and creating downstream phase issues for the remaining phases.",
12033
+ "Kick off meeting processing by executing Phase 1 (Extract) and",
12034
+ "creating downstream phase issues for the remaining phases. Inputs",
12035
+ "live in the **sibling-tree layout**: pass any file from",
12036
+ "`<meetingsRoot>/notes/{type}/` or `<meetingsRoot>/transcripts/{type}/`",
12037
+ "(both, notes-only, and transcript-only are all valid input cases).",
11856
12038
  "",
11857
12039
  "## Usage",
11858
12040
  "",
11859
- "/process-meeting <path-to-transcript>",
12041
+ "/process-meeting <path-to-notes-or-transcript>",
12042
+ "",
12043
+ "## Basename-pairing algorithm",
12044
+ "",
12045
+ "The user may pass either a notes-tree path or a transcripts-tree",
12046
+ "path. Resolve the sibling implicitly via filesystem lookup \u2014",
12047
+ "do **not** prompt the user or fail-loud when the sibling is",
12048
+ "absent:",
12049
+ "",
12050
+ "1. Infer the **basename** (filename without the `.md` extension)",
12051
+ " and the `{internal,external}` partition from the provided path.",
12052
+ " Both segments are usually adjacent in the path \u2014",
12053
+ " `\u2026/notes/internal/2026-03-14-sprint-kickoff.md` yields basename",
12054
+ " `2026-03-14-sprint-kickoff` and type `internal`.",
12055
+ "2. Determine the **input tree** from the path:",
12056
+ " - If the path contains `/notes/`, treat it as the notes input",
12057
+ " and look for the sibling at",
12058
+ " `<meetingsRoot>/transcripts/<type>/<basename>.md`.",
12059
+ " - If the path contains `/transcripts/`, treat it as the",
12060
+ " transcript input and look for the sibling at",
12061
+ " `<meetingsRoot>/notes/<type>/<basename>.md`.",
12062
+ " - If the path matches neither (e.g. an ad-hoc location), infer",
12063
+ " basename + type as best you can from the filename and",
12064
+ " surrounding folder segments, then proceed with whichever",
12065
+ " sibling-tree lookups succeed. Best-effort, never fail-loud.",
12066
+ "3. Read **every** sibling that exists on disk. The combination",
12067
+ " (notes present, transcript present, both present) selects the",
12068
+ " Phase-1 input case from the **input-case matrix** in the",
12069
+ " `meeting-analyst` agent prompt.",
12070
+ "4. A missing sibling is a normal outcome \u2014 proceed with whatever",
12071
+ " was found. Notes-only and transcript-only are both valid",
12072
+ " Phase-1 input cases; the agent never warns or prompts the",
12073
+ " user about the absence.",
11860
12074
  "",
11861
12075
  "## Steps",
11862
12076
  "",
11863
- "1. Read the provided transcript file",
11864
- "2. Execute Phase 1 (Extract) \u2014 categorize transcript content into",
12077
+ "1. Resolve the basename, partition, and any sibling files using",
12078
+ " the **Basename-pairing algorithm** above",
12079
+ "2. Execute Phase 1 (Extract) \u2014 categorize the available content into",
11865
12080
  " decisions, requirements, action items, open questions, and more",
11866
- "3. Write the extraction to a markdown file",
12081
+ "3. Write the extraction to",
12082
+ " `<meetingsRoot>/insights/{type}/<basename>.md`",
11867
12083
  "4. Create downstream phase issues using `gh issue create`:",
11868
12084
  " - `meeting:notes` issue (always)",
11869
12085
  " - `meeting:draft` issue (if requirements or decisions were found)",
@@ -11873,12 +12089,15 @@ var processMeetingSkill = {
11873
12089
  "",
11874
12090
  "## Input",
11875
12091
  "",
11876
- "Provide a path to a meeting transcript file (text or markdown).",
11877
- "The transcript should contain speaker-attributed dialogue.",
12092
+ "Provide a path to a file in either `notes/` or `transcripts/`. The",
12093
+ "agent will look up the sibling automatically via basename match. A",
12094
+ "missing sibling is a normal case (notes-only or transcript-only) \u2014",
12095
+ "the agent handles all three input cases.",
11878
12096
  "",
11879
12097
  "## Output",
11880
12098
  "",
11881
- "- An extraction markdown file with categorized meeting content",
12099
+ "- A structured extraction at",
12100
+ " `<meetingsRoot>/insights/{type}/<basename>.md`",
11882
12101
  "- Phase issues with `meeting:*` labels for downstream agent sessions",
11883
12102
  " to pick up (notes, draft, link)"
11884
12103
  ].join("\n")
@@ -11896,11 +12115,30 @@ function buildMeetingAnalysisBundle(tier = AGENT_MODEL.BALANCED) {
11896
12115
  content: [
11897
12116
  "# Meeting Processing Workflow",
11898
12117
  "",
11899
- "Use `/process-meeting <path>` to process a meeting transcript through a",
12118
+ "Use `/process-meeting <path>` to process a meeting through a",
11900
12119
  "4-phase pipeline (extract \u2192 notes \u2192 draft \u2192 link). Each phase runs as a",
11901
12120
  "separate agent session tracked by a GitHub issue with a `meeting:*` label.",
11902
12121
  "See the `meeting-analyst` agent definition for full workflow details.",
11903
12122
  "",
12123
+ "Meeting artifacts live in **three parallel trees** rooted at the",
12124
+ "project's meetings root:",
12125
+ "",
12126
+ "- `transcripts/{internal,external}/` \u2014 verbatim transcripts (evidence)",
12127
+ "- `notes/{internal,external}/` \u2014 curated narrative summary",
12128
+ " (input + Phase 2 output)",
12129
+ "- `insights/{internal,external}/` \u2014 structured extraction (Phase 1 output)",
12130
+ "",
12131
+ "The three trees share identical basenames so a meeting's siblings",
12132
+ "are looked up by filename, not by frontmatter cross-references.",
12133
+ "Phase 1 accepts every input case (notes + transcript, notes only,",
12134
+ "or transcript only) and Phase 2 enhances the notes file in place",
12135
+ "rather than authoring it from scratch.",
12136
+ "",
12137
+ "Notes and insights files may carry optional frontmatter fields",
12138
+ "`slug`, `source`, `transcript_available`, and `confidence`",
12139
+ "alongside the existing `meeting_type` and `areas` fields. Missing",
12140
+ "frontmatter is treated as a normal input case \u2014 never fail-loud.",
12141
+ "",
11904
12142
  "Meeting notes may declare a `meeting_type` (one of the project's",
11905
12143
  "recognized types) and an `areas: [...]` list. The `meeting_type`",
11906
12144
  "resolves to a generic kind \u2014 `planning` / `review` / `brainstorm` /",