@codedrifters/configulator 0.0.351 → 0.0.352

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
@@ -12200,7 +12200,7 @@ function buildMeetingAnalystSubAgent(tier) {
12200
12200
  "| `planning` | Sprint/plan updates, task issues, requirement drafts | Extract every task assignment. Phase 4 updates the active sprint-plan doc directly and creates one issue per assigned task. |",
12201
12201
  "| `review` | Retro notes, follow-up issues, status updates, requirement revisions | Mark completed tasks in the active sprint-plan doc. Capture retrospective learnings inside the meeting notes \u2014 do not spawn a separate retro document. |",
12202
12202
  "| `brainstorm` | Future-feature candidates, research topics, very few Firm decisions | Lower the bar for Open Questions. Do **not** create requirement or ADR issues from brainstorm output unless the item is explicitly marked **Firm**. Prefer research/discovery issues for promising ideas. |",
12203
- "| `standup` | Action items, blockers, status updates | Do not produce requirement, ADR, or BDR drafts. Phase 3 (Draft) is almost always skipped. Focus on action-item issues and sprint-plan status updates. |",
12203
+ "| `standup` | Action items, blockers, status updates | Do not produce requirement, ADR, or BDR drafts. Phase 3 (Draft) is almost always skipped. Capture action items in the notes `## Action Items` table; file issues only for agent-workable doc deliverables (per the **Action-item filing policy**) and apply sprint-plan status updates. |",
12204
12204
  "| `external` | Customer/competitive intel, people/company profiles, lead capture | Default every attendee outside the team into **People of Interest**. Default every organization mentioned into **Companies of Interest** (signal threshold still applies). Capture stated customer pain points as candidate **BR** (business requirements), not FR. |",
12205
12205
  "| `other` | General meeting extraction | Apply the default workflow with no type-specific overrides. |",
12206
12206
  "",
@@ -12262,6 +12262,61 @@ function buildMeetingAnalystSubAgent(tier) {
12262
12262
  "",
12263
12263
  "---",
12264
12264
  "",
12265
+ "## Action-item filing policy",
12266
+ "",
12267
+ "Not every action item should become a GitHub issue. The pipeline",
12268
+ "can only ever close issues whose deliverable an automated agent",
12269
+ "(or this repo's existing channels) can produce. Filing an issue",
12270
+ "for a task only a human can do \u2014 in the real world or in a system",
12271
+ "this pipeline cannot touch \u2014 creates queue noise that no worker or",
12272
+ "orchestrator can ever resolve. Apply the **agent-workability",
12273
+ "test** below in phases 1, 3, and 4.",
12274
+ "",
12275
+ "### Agent-workability test",
12276
+ "",
12277
+ "An action item is **agent-workable** only when completing it",
12278
+ "produces a documentation deliverable an automated agent can author",
12279
+ "in this repo's docs tree \u2014 a requirement document, an ADR, a docs",
12280
+ "page, a BCM capability model, a research note, or a roadmap /",
12281
+ "product-doc update. Route agent-workable items through their",
12282
+ "**dedicated downstream channel** (`req:write`, `docs:write`,",
12283
+ "`bcm:*`, `research:scope`, roadmap/product-doc follow-up). Never",
12284
+ "file them as a generic `action-item` / `type:chore` issue.",
12285
+ "",
12286
+ "An action item is **human-owned** when it requires a person to act",
12287
+ "in the real world or in a system this pipeline cannot reach.",
12288
+ "Typical cues:",
12289
+ "",
12290
+ '- **send / email / schedule / invite / call** \u2014 e.g. "send out',
12291
+ ` company invoices", "invite X to next week's call".`,
12292
+ '- **install / configure / provision / set up** \u2014 e.g. "install and',
12293
+ ' configure Claude", "get codebase read access".',
12294
+ "- **decide / approve / choose / prioritise** (a human judgement",
12295
+ " call, not a documented decision record).",
12296
+ '- **communicate / notify / give a heads-up** \u2014 e.g. "give Dr. Y a',
12297
+ ' heads-up".',
12298
+ "- **get / request access or credentials**, **pay / invoice**.",
12299
+ "- **build or change code in another repo**, **design in an",
12300
+ " external tool** (Figma, etc.).",
12301
+ "",
12302
+ "Record human-owned items **only** in the notes `## Action Items`",
12303
+ "table (who / what / when) \u2014 that table is the **system of record**",
12304
+ "for human follow-ups. Do **not** file a GitHub issue for them.",
12305
+ "",
12306
+ "When an item is ambiguous, default to **human-owned**",
12307
+ "(notes-only): a missed issue is cheaper than queue noise the",
12308
+ "pipeline can never close.",
12309
+ "",
12310
+ "**Consumer tuning.** When the project supplies",
12311
+ "`AgentConfigOptions.meetings.actionItemFiling`, an",
12312
+ "**Action-item filing policy** subsection is rendered into the",
12313
+ "meetings taxonomy with any extra human-owned / agent-workable cues",
12314
+ "and a note when the split is disabled. Apply those overrides on",
12315
+ "top of the built-in cues above; if the split is disabled, fall",
12316
+ "back to filing a follow-up issue for every non-draft action item.",
12317
+ "",
12318
+ "---",
12319
+ "",
12265
12320
  ...PROJECT_CONTEXT_MAINTAINER_SECTION,
12266
12321
  "## Traceability",
12267
12322
  "",
@@ -12293,7 +12348,7 @@ function buildMeetingAnalystSubAgent(tier) {
12293
12348
  "",
12294
12349
  " | Artifact | Type | Issue/Path |",
12295
12350
  " |----------|------|------------|",
12296
- " | <title> | requirement / ADR / action-item / profile | #<N> or <path> |",
12351
+ " | <title> | requirement / ADR / docs / profile / research | #<N> or <path> |",
12297
12352
  " ```",
12298
12353
  "",
12299
12354
  "2. **Update the meeting notes** with a similar `## Related Issues` section",
@@ -12358,7 +12413,7 @@ function buildMeetingAnalystSubAgent(tier) {
12358
12413
  ` | **Decisions** | "We decided...", "Let's go with...", explicit choices |`,
12359
12414
  ' | **Requirements** | Feature descriptions, acceptance criteria, "it should..." |',
12360
12415
  " | **Technology discussions** | Platform comparisons, architecture options, tool evaluations |",
12361
- ' | **Action items** | "[Person] will...", "Next step is...", assigned tasks |',
12416
+ ' | **Action items** | "[Person] will...", "Next step is...", assigned tasks. Tag each with its **disposition** (`agent-workable` vs `human-owned`) per the **Action-item filing policy**. |',
12362
12417
  ' | **Open questions** | "We need to figure out...", unresolved debates |',
12363
12418
  " | **People of interest** | Industry contacts, domain experts mentioned |",
12364
12419
  " | **Companies of interest** | Competitors, vendors, partners discussed |",
@@ -12373,7 +12428,10 @@ function buildMeetingAnalystSubAgent(tier) {
12373
12428
  " - Decisions Made (with category and confidence: Firm / Tentative / Needs confirmation)",
12374
12429
  " - Requirements Identified (with category and priority estimate)",
12375
12430
  " - Technology Discussions (with status: Decided / Leaning toward / Open)",
12376
- " - Action Items (with assignee and due date if stated)",
12431
+ " - Action Items (with assignee and due date if stated, and a",
12432
+ " **disposition** tag \u2014 `agent-workable` or `human-owned` \u2014 per",
12433
+ " the **Action-item filing policy** so Phase 4 can route each",
12434
+ " item without re-classifying it)",
12377
12435
  " - Open Questions",
12378
12436
  " - People of Interest (with context and whether a profile exists)",
12379
12437
  " - Companies of Interest (with type and context)",
@@ -12503,7 +12561,11 @@ function buildMeetingAnalystSubAgent(tier) {
12503
12561
  " - Agenda / topics covered",
12504
12562
  " - Key Discussion Points (organized by topic)",
12505
12563
  " - Decisions (numbered, with rationale)",
12506
- " - Action Items (table: who, what, when)",
12564
+ " - Action Items (table: who, what, when). This table is the",
12565
+ " **system of record for human follow-ups** \u2014 human-owned",
12566
+ " action items live here and are never filed as GitHub issues",
12567
+ " (see the **Action-item filing policy**). Capture every",
12568
+ " action item here regardless of disposition.",
12507
12569
  " - Open Questions",
12508
12570
  " - Follow-up items",
12509
12571
  "4. **Plan the `notes/` tree index update \u2014 do not commit it",
@@ -12551,6 +12613,11 @@ function buildMeetingAnalystSubAgent(tier) {
12551
12613
  "This phase only exists if the extraction identified requirements, architectural",
12552
12614
  "decisions, or strategy changes. If this issue exists, execute it.",
12553
12615
  "",
12616
+ "Draft proposals only for **agent-workable** deliverables (per the",
12617
+ "**Action-item filing policy**). Action items tagged `human-owned`",
12618
+ "in the extraction are not drafted here \u2014 they stay in the notes",
12619
+ "`## Action Items` table and produce no follow-up issue.",
12620
+ "",
12554
12621
  "### Steps",
12555
12622
  "",
12556
12623
  "1. Read the extraction file from Phase 1 at",
@@ -12590,8 +12657,27 @@ function buildMeetingAnalystSubAgent(tier) {
12590
12657
  " gated by areas.",
12591
12658
  "3. Create ADR issues if technology decisions need formal records.",
12592
12659
  " Include a `## Traceability` section in each. Not gated by areas.",
12593
- "4. Create action item issues for tasks that are not document-related.",
12594
- " Include a `## Traceability` section in each. Not gated by areas.",
12660
+ "4. **Route action items per the Action-item filing policy \u2014 do",
12661
+ " not file a generic `action-item` issue per task.** Read each",
12662
+ " action item's `disposition` tag from the extraction (re-apply",
12663
+ " the **agent-workability test** if the tag is missing):",
12664
+ " - **Agent-workable** (yields a doc deliverable an agent can",
12665
+ " author): file it through its **dedicated downstream channel**",
12666
+ " \u2014 a `req:write` issue for a requirement, a `docs:write` issue",
12667
+ " for a docs page, `bcm:*` for a capability model, a",
12668
+ " `research:scope` issue for a research note, or a roadmap /",
12669
+ " product-doc follow-up. Use the matching template from the",
12670
+ " issue-templates page; include a `## Traceability` section.",
12671
+ " Issue creation is not gated by areas.",
12672
+ " - **Human-owned** (send/schedule/install/decide/communicate/",
12673
+ " get-access/build-elsewhere): record it **only** in the notes",
12674
+ " `## Action Items` table (step 8 already carries the table",
12675
+ " forward). **File no GitHub issue.** When ambiguous, treat the",
12676
+ " item as human-owned.",
12677
+ " If the project disabled the split via",
12678
+ " `meetings.actionItemFiling.enabled: false`, fall back to filing",
12679
+ " a follow-up issue for every action item not already covered by",
12680
+ " a Phase 3 draft.",
12595
12681
  "5. Cross-reference the meeting in any existing documents that were",
12596
12682
  " discussed **and that live under an in-scope `docRoot`**. For",
12597
12683
  " discussed documents under an out-of-scope `docRoot`, open a",
@@ -12628,7 +12714,10 @@ function buildMeetingAnalystSubAgent(tier) {
12628
12714
  "- Use `gh` CLI for all GitHub operations",
12629
12715
  "- Apply the appropriate `meeting:*` phase label to each phase issue",
12630
12716
  "- Use `type:docs` for documentation-producing issues, `type:chore` for",
12631
- " maintenance/organizational tasks",
12717
+ " maintenance/organizational tasks the pipeline can action",
12718
+ "- Do **not** file issues for human-owned action items \u2014 per the",
12719
+ " **Action-item filing policy** they live only in the notes",
12720
+ " `## Action Items` table",
12632
12721
  "- Use `status:` labels to track progress (`status:ready`, `status:in-progress`, `status:done`)",
12633
12722
  "- Reference the source meeting transcript in all created issues",
12634
12723
  "- Link phase issues with `Depends on: #N` to enforce ordering",
@@ -12699,7 +12788,10 @@ var processMeetingSkill = {
12699
12788
  "1. Resolve the basename, partition, and any sibling files using",
12700
12789
  " the **Basename-pairing algorithm** above",
12701
12790
  "2. Execute Phase 1 (Extract) \u2014 categorize the available content into",
12702
- " decisions, requirements, action items, open questions, and more",
12791
+ " decisions, requirements, action items, open questions, and more.",
12792
+ " Tag each action item's disposition (`agent-workable` vs",
12793
+ " `human-owned`) per the agent's **Action-item filing policy** so",
12794
+ " Phase 4 keeps human-owned tasks out of the issue queue",
12703
12795
  "3. Write the extraction to",
12704
12796
  " `<meetingsRoot>/insights/{type}/<basename>.md`",
12705
12797
  "4. Create downstream phase issues using `gh issue create`:",
@@ -12769,7 +12861,18 @@ function buildMeetingAnalysisBundle(tier = AGENT_MODEL.BALANCED) {
12769
12861
  "direct edits to the doc-root sub-folders declared in the project's",
12770
12862
  "**Area \u2192 doc-root mapping** table. When both fields are absent",
12771
12863
  "the pipeline falls back to the default workflow (kind `other`,",
12772
- "no area gating)."
12864
+ "no area gating).",
12865
+ "",
12866
+ "Phase 4 applies an **agent-workability split** to action items:",
12867
+ "items that yield a documentation deliverable an agent can author",
12868
+ "are filed through their dedicated downstream channel",
12869
+ "(`req:write`, `docs:write`, `bcm:*`, `research:scope`, roadmap",
12870
+ "follow-up); human-owned tasks (send / schedule / install /",
12871
+ "decide / communicate / get-access / build-elsewhere) are",
12872
+ "recorded **only** in the notes `## Action Items` table, which is",
12873
+ "the **system of record for human follow-ups** \u2014 no GitHub issue",
12874
+ "is filed for them. Consumers tune or disable the split via",
12875
+ "`AgentConfigOptions.meetings.actionItemFiling`."
12773
12876
  ].join("\n"),
12774
12877
  platforms: {
12775
12878
  cursor: { exclude: true }
@@ -13914,6 +14017,9 @@ var DEFAULT_BUNDLE_OVERRIDES = {
13914
14017
  "regulatory:research": {
13915
14018
  acceptanceCriteria: { smallMax: 3, mediumMax: 10 }
13916
14019
  },
14020
+ "standards:research": {
14021
+ acceptanceCriteria: { smallMax: 3, mediumMax: 10 }
14022
+ },
13917
14023
  "software:map": {
13918
14024
  acceptanceCriteria: { smallMax: 3, mediumMax: 12 },
13919
14025
  sources: { smallMax: 2, mediumMax: 15 }
@@ -14127,6 +14233,31 @@ function renderScopeGateSection(gate, excludeBundles = []) {
14127
14233
  "alphabetical order on the label name** \u2014 first-wins, deterministic."
14128
14234
  );
14129
14235
  }
14236
+ lines.push(
14237
+ "",
14238
+ "### Reconfiguring the thresholds",
14239
+ "",
14240
+ "Every threshold above is configurable per repo \u2014 the global",
14241
+ "`acceptance-criteria` / `sources` classification bands and each",
14242
+ "per-phase-label override. Retune them in the project's",
14243
+ "configulator config so the gate fits this repo's issue shapes:",
14244
+ "",
14245
+ "- `AgentConfigOptions.scopeGate.acceptanceCriteria` /",
14246
+ " `AgentConfigOptions.scopeGate.sources` \u2014 the global",
14247
+ " `smallMax` / `mediumMax` bands applied to every issue.",
14248
+ "- `AgentConfigOptions.scopeGate.bundleOverrides.<phase-label>` \u2014",
14249
+ " a per-phase-label override for **any** phase label, not just",
14250
+ " the ones shipped above. The map deep-merges with the shipped",
14251
+ " defaults (consumer-wins-per-key): add a key to raise a new",
14252
+ " label's AC / sources ceiling, set an existing key to replace a",
14253
+ " shipped default, or set a key to `undefined` to drop a shipped",
14254
+ " default and classify that label against the global bands.",
14255
+ "",
14256
+ "Each override entry's `acceptanceCriteria` and `sources` axes are",
14257
+ "independent \u2014 override one and the other falls through to the",
14258
+ "global band. Malformed thresholds (negative, non-integer, or",
14259
+ "`mediumMax <= smallMax`) fail the build at synth time."
14260
+ );
14130
14261
  lines.push(
14131
14262
  "",
14132
14263
  "### Decomposition-proposal template",
@@ -30312,13 +30443,20 @@ function renderFocusSection(focus) {
30312
30443
 
30313
30444
  // src/agent/bundles/meeting-types.ts
30314
30445
  var DEFAULT_AGENDA_TEMPLATE_ROOT = "<meetingsRoot>/_agenda-templates";
30446
+ function actionItemFilingHasOverride(filing) {
30447
+ if (!filing) {
30448
+ return false;
30449
+ }
30450
+ return filing.enabled === false || (filing.humanOwnedCues ?? []).length > 0 || (filing.agentWorkableCues ?? []).length > 0;
30451
+ }
30315
30452
  function renderMeetingTypesSection(meetings) {
30316
30453
  if (!meetings) {
30317
30454
  return "";
30318
30455
  }
30319
30456
  const types = meetings.meetingTypes ?? [];
30320
30457
  const areas = meetings.meetingAreas ?? [];
30321
- if (types.length === 0 && areas.length === 0) {
30458
+ const filingOverride = actionItemFilingHasOverride(meetings.actionItemFiling) ? meetings.actionItemFiling : void 0;
30459
+ if (types.length === 0 && areas.length === 0 && !filingOverride) {
30322
30460
  return "";
30323
30461
  }
30324
30462
  const sections = [];
@@ -30328,6 +30466,9 @@ function renderMeetingTypesSection(meetings) {
30328
30466
  if (areas.length > 0) {
30329
30467
  sections.push(renderMeetingAreas(areas));
30330
30468
  }
30469
+ if (filingOverride) {
30470
+ sections.push(renderActionItemFiling(filingOverride));
30471
+ }
30331
30472
  return sections.join("\n\n");
30332
30473
  }
30333
30474
  function renderMeetingTypes(types, agendaTemplateRoot) {
@@ -30381,6 +30522,54 @@ function renderMeetingAreas(areas) {
30381
30522
  }
30382
30523
  return lines.join("\n");
30383
30524
  }
30525
+ function renderActionItemFiling(filing) {
30526
+ const lines = [
30527
+ "## Action-item filing policy",
30528
+ "",
30529
+ "This project tunes the Phase 4 (Link) agent-workability split",
30530
+ "through `AgentConfigOptions.meetings.actionItemFiling`. See the",
30531
+ "**Action-item filing policy** section of the `meeting-analyst`",
30532
+ "agent for the full baked-in test.",
30533
+ ""
30534
+ ];
30535
+ if (filing.enabled === false) {
30536
+ lines.push(
30537
+ "- **Split disabled.** Phase 4 falls back to the legacy behaviour:",
30538
+ " file a follow-up issue for every action item that is not",
30539
+ " already covered by a requirement or ADR draft, including",
30540
+ " human-owned tasks. The notes `## Action Items` table is still",
30541
+ " written, but it is no longer the sole record for human",
30542
+ " follow-ups."
30543
+ );
30544
+ } else {
30545
+ lines.push(
30546
+ "- **Split enabled** (default). Agent-workable doc deliverables are",
30547
+ " filed through their dedicated downstream channel; human-owned",
30548
+ " tasks are recorded only in the notes `## Action Items` table."
30549
+ );
30550
+ }
30551
+ const humanCues = filing.humanOwnedCues ?? [];
30552
+ if (humanCues.length > 0) {
30553
+ lines.push(
30554
+ "",
30555
+ "**Additional human-owned cues** (recorded notes-only, never",
30556
+ "filed), in addition to the bundle's built-in list:",
30557
+ "",
30558
+ ...humanCues.map((cue) => `- ${cue}`)
30559
+ );
30560
+ }
30561
+ const agentCues = filing.agentWorkableCues ?? [];
30562
+ if (agentCues.length > 0) {
30563
+ lines.push(
30564
+ "",
30565
+ "**Additional agent-workable cues** (filed through the matching",
30566
+ "downstream channel), in addition to the bundle's built-in list:",
30567
+ "",
30568
+ ...agentCues.map((cue) => `- ${cue}`)
30569
+ );
30570
+ }
30571
+ return lines.join("\n");
30572
+ }
30384
30573
 
30385
30574
  // src/agent/bundles/priority-rules.ts
30386
30575
  function renderPriorityRulesSection(rules) {