@farmslot/protocol 0.28.0 → 0.30.0

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/agents/roles.d.ts +7 -0
  3. package/dist/agents/roles.d.ts.map +1 -1
  4. package/dist/agents/roles.js +11 -0
  5. package/dist/agents/roles.js.map +1 -1
  6. package/dist/checklist-target.d.ts +49 -2
  7. package/dist/checklist-target.d.ts.map +1 -1
  8. package/dist/checklist-target.js +77 -1
  9. package/dist/checklist-target.js.map +1 -1
  10. package/dist/contracts/acceptance.d.ts +90 -0
  11. package/dist/contracts/acceptance.d.ts.map +1 -0
  12. package/dist/contracts/acceptance.js +177 -0
  13. package/dist/contracts/acceptance.js.map +1 -0
  14. package/dist/contracts/agents.d.ts +3 -1
  15. package/dist/contracts/agents.d.ts.map +1 -1
  16. package/dist/contracts/agents.js +4 -0
  17. package/dist/contracts/agents.js.map +1 -1
  18. package/dist/contracts/diff-view.d.ts +69 -0
  19. package/dist/contracts/diff-view.d.ts.map +1 -0
  20. package/dist/contracts/diff-view.js +137 -0
  21. package/dist/contracts/diff-view.js.map +1 -0
  22. package/dist/contracts/family.d.ts +12 -0
  23. package/dist/contracts/family.d.ts.map +1 -1
  24. package/dist/contracts/family.js.map +1 -1
  25. package/dist/contracts/glob.d.ts +32 -0
  26. package/dist/contracts/glob.d.ts.map +1 -0
  27. package/dist/contracts/glob.js +100 -0
  28. package/dist/contracts/glob.js.map +1 -0
  29. package/dist/contracts/index.d.ts +3 -0
  30. package/dist/contracts/index.d.ts.map +1 -1
  31. package/dist/contracts/index.js +3 -0
  32. package/dist/contracts/index.js.map +1 -1
  33. package/dist/contracts/reviews.d.ts +1 -0
  34. package/dist/contracts/reviews.d.ts.map +1 -1
  35. package/dist/contracts/reviews.js +2 -0
  36. package/dist/contracts/reviews.js.map +1 -1
  37. package/dist/contracts/runs.d.ts +78 -1
  38. package/dist/contracts/runs.d.ts.map +1 -1
  39. package/dist/contracts/runs.js +31 -0
  40. package/dist/contracts/runs.js.map +1 -1
  41. package/dist/contracts/task.d.ts +27 -0
  42. package/dist/contracts/task.d.ts.map +1 -1
  43. package/dist/contracts/worker-terminal.d.ts +19 -0
  44. package/dist/contracts/worker-terminal.d.ts.map +1 -1
  45. package/dist/contracts/worker-terminal.js.map +1 -1
  46. package/dist/contracts/workspace.d.ts +3 -0
  47. package/dist/contracts/workspace.d.ts.map +1 -1
  48. package/dist/index.d.ts +1 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +1 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/rpc/gateway.d.ts +16 -0
  53. package/dist/rpc/gateway.d.ts.map +1 -1
  54. package/dist/rpc/git.d.ts +5 -0
  55. package/dist/rpc/git.d.ts.map +1 -1
  56. package/dist/rpc/task.d.ts +18 -0
  57. package/dist/rpc/task.d.ts.map +1 -1
  58. package/dist/runs/review-retries.d.ts +21 -0
  59. package/dist/runs/review-retries.d.ts.map +1 -0
  60. package/dist/runs/review-retries.js +76 -0
  61. package/dist/runs/review-retries.js.map +1 -0
  62. package/dist/transport/events.d.ts +2 -0
  63. package/dist/transport/events.d.ts.map +1 -1
  64. package/dist/transport/signal.d.ts +46 -1
  65. package/dist/transport/signal.d.ts.map +1 -1
  66. package/dist/transport/signal.js +56 -0
  67. package/dist/transport/signal.js.map +1 -1
  68. package/dist/version.d.ts +1 -1
  69. package/dist/version.js +1 -1
  70. package/package.json +6 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,32 @@ All notable changes to `@farmslot/protocol` are tracked here.
6
6
 
7
7
  - Active-development baseline; add user-facing changes here before release or package publication.
8
8
 
9
+ ## 0.30.0 - 2026-09-20
10
+
11
+ - `compileGlob` is the one glob-to-regex compiler for path filters, with `anchored` (git pathspec, root-anchored) and `segment` (gitignore-like) anchoring and a case-sensitivity option; diff-view test patterns use it, a pattern with character-class syntax is now rejected with a warning (and dropped from the effective list) instead of matching the brackets literally, and a double star not followed by a slash and not trailing is a plain star, as git and gitignore read it.
12
+ - Child checklist units (ADR-060): a parent checklist step can own one child checklist plus signal under `subtasks/`.
13
+ - `subtask` joins `AGENT_ROLES`. It is not a nested-loop role and never a session target: clients validate a requested role against the new `DISPATCHABLE_AGENT_ROLES`.
14
+ - `WorkerSignalParentLink` and `SubtaskSignal` describe a child signal and the parent step it hangs off.
15
+ - `subtaskPaths`, `SUBTASKS_DIR`, `SUBTASK_INDEX_FILE`, `SUBTASK_ID_PATTERN` and `SubtaskIndex` name the `subtasks/` layout.
16
+ - `isSettledSubtaskStatus` says when a child releases its parent step (`complete` or `done`; a `blocked` child keeps it), and `isWorkerSignalStatus` narrows an untyped signal status without a cast.
17
+ - `TaskStepProgress.subtask` carries the child projection, and `shouldAcceptTaskProgressUpdate` accepts a child update whose new `parentChecklist` matches the run's active checklist pair.
18
+ - `RunMetrics.subtasks` records each unit's parent step, source, status, step count and duration, and a gate summary's `checklist.subtasks` carries per-child step durations plus the unit's source, so child cost survives task-directory pruning and a retrospective names the skill or template, not only the id.
19
+ - Acceptance-criteria ledger (ADR-060): `AcceptanceStatusLedger` / `AcceptanceCriterionStatus` describe `artifacts/acceptance-status.json`, with `ACCEPTANCE_STATUS_ARTIFACT`, the `proven | weak | missing | untestable` and `state | visual | mixed` vocabularies, positional `AC-<N>` ids (`acceptanceCriterionId`), `validateAcceptanceStatusLedger`, `summarizeAcceptanceStatus` and `renderAcceptanceCoverage` (the coverage table workers hand-write today). `WorkerTerminalContractDocument.acceptance.allowWeak` lets a flow waive weak verdicts.
20
+ - Acceptance ledger surfaces: `TaskProgressResult.acceptanceStatus` and `acceptanceCriteria` carry the run's verdicts and its registered criteria on the progress read and broadcast, `ReadyGatePayload.acceptanceStatus` and `FamilyObservabilityRunSummary.acceptanceStatus` carry the ledger to the gate and the retrospective, and `acceptanceCriteriaView` pairs registered criteria with their verdicts (null while unjudged). `summarizeAcceptanceStatus` takes the registered criteria and reports `unrecorded`, so a count reads against how many criteria the run has rather than how many were judged.
21
+ - `WorkerTerminalAcceptanceRules.require` opts a project into ledger enforcement; it defaults to false so a template that writes no ledger is unaffected.
22
+ - Acceptance ledger review fixes: `renderAcceptanceCoverage` takes the registered criteria so a partial ledger cannot report `1/1 PROVEN` for a task with three criteria (a criterion with no verdict is a `NO VERDICT` row and the overall line names the count), `TaskProgressResult.acceptanceStatusError` and `ReadyGatePayload.acceptanceStatusError` carry a read failure so clients can say the ledger is unreadable instead of showing nothing, and `FamilyObservabilityRunSummary.acceptanceSummary` carries the tally so a retrospective needs no second read.
23
+ - Diff views classify changed files as `code` or `test`: `DEFAULT_TEST_FILE_PATTERNS`, `compileTestFileMatcher` (segment / directory / anchored glob rules, project patterns capped), `summarizeDiffKinds`, a `kind` on each `git.branchDiff` file, and `testFilePatterns` on the result.
24
+ - `isSettledBlockedRun` names a blocked run with no running step and no pending decision; the gateway and Command Center use it to offer archiving.
25
+ - Independent-review `retryCount` is the max of the persisted field and spent attempts so a wiped `0` cannot hide a spent loop. Exhaustion (and the dangerous bypass) stays visible when the package HEAD has moved since the last extra-review; `latestExhaustedIndependentReview` no longer takes a prepared-package argument. Pipeline progress labels include independent-review (`human-gate`) while an extra-review checklist is running.
26
+ - Doc comments: `checklistStepName` names `mark` among its consumers, and a checklist event `label` is documented as the step name. No code change.
27
+
28
+ ## 0.29.0 - 2026-09-18
29
+
30
+ - Checklist and signal rules every client must agree on are now protocol exports instead of gateway-private code: `isTerminalWorkerSignal` / `isTerminalWorkerSignalStatus` (complete, failed, done, blocked; unknown is never terminal), `checklistStepName` (the bold lead of a row, numbering kept) and `checklistNumberingMismatches` (a generated checklist whose visible labels drift from `mark N` positions). Harness views that re-implemented these disagreed with the gateway on which signals are final and how a step is named.
31
+ - Independent-review status records `retryCount` / `maxRetries` / `maxRetriesExhausted`, and publication gates can approve with `approve-publish-unresolved` after that cap.
32
+ - Independent-review loops accept an optional `effort` (thinking / reasoning level) alongside `model`. Reviewer agent context and independent-review status persist that effort so restart recovery can relaunch the same thinking level.
33
+ - `gateway.status` reports rolling-hour GitHub GraphQL spend by caller (`githubQuerySpend`).
34
+
9
35
  ## 0.28.0 - 2026-09-17
10
36
 
11
37
  - Execution-template references and catalog options no longer carry `runMode`; run mode remains a run-level input on default rules and catalog queries. Records persisted with the old field still validate.
@@ -1,5 +1,12 @@
1
1
  import { AGENT_ROLES, type AgentRole, type FlowType } from '../contracts/index.js';
2
2
  export { AGENT_ROLES };
3
+ /**
4
+ * Roles a client may dispatch, attach, or open a session for. A child checklist
5
+ * unit (`subtask`) is observed through its files and never spawned (ADR-060),
6
+ * so it is not a session target — clients validate against this list, not the
7
+ * full role union.
8
+ */
9
+ export declare const DISPATCHABLE_AGENT_ROLES: ("primary" | "dev" | "fix-bug" | "review" | "self-review" | "self-review-fix" | "ci-fix")[];
3
10
  export declare const AGENT_ROLE_LABELS: Record<AgentRole, string>;
4
11
  export declare const AGENT_ROLE_SHORT_LABELS: Record<AgentRole, string>;
5
12
  export declare const AGENT_ROLE_WINDOWS: Record<AgentRole, string | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/agents/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAQvD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAQ7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAQ/D,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAGlE;AAKD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAQtD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAUjF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE3D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CASrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAazE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,GAAG,IAAI,CAEf"}
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/agents/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,6FAEpC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CASvD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAS7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAS/D,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAGlE;AAKD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAStD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAUjF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE3D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CASrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAazE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,GAAG,IAAI,CAEf"}
@@ -1,5 +1,12 @@
1
1
  import { AGENT_ROLES } from '../contracts/index.js';
2
2
  export { AGENT_ROLES };
3
+ /**
4
+ * Roles a client may dispatch, attach, or open a session for. A child checklist
5
+ * unit (`subtask`) is observed through its files and never spawned (ADR-060),
6
+ * so it is not a session target — clients validate against this list, not the
7
+ * full role union.
8
+ */
9
+ export const DISPATCHABLE_AGENT_ROLES = AGENT_ROLES.filter((role) => role !== 'subtask');
3
10
  export const AGENT_ROLE_LABELS = {
4
11
  primary: 'Primary',
5
12
  dev: 'Dev',
@@ -8,6 +15,7 @@ export const AGENT_ROLE_LABELS = {
8
15
  'self-review': 'Self-review',
9
16
  'self-review-fix': 'Self-review fix',
10
17
  'ci-fix': 'CI fix',
18
+ subtask: 'Sub-task',
11
19
  };
12
20
  export const AGENT_ROLE_SHORT_LABELS = {
13
21
  primary: 'MAIN',
@@ -17,6 +25,7 @@ export const AGENT_ROLE_SHORT_LABELS = {
17
25
  'self-review': 'S-REV',
18
26
  'self-review-fix': 'S-FIX',
19
27
  'ci-fix': 'CI',
28
+ subtask: 'SUB',
20
29
  };
21
30
  export const AGENT_ROLE_WINDOWS = {
22
31
  primary: null,
@@ -26,6 +35,7 @@ export const AGENT_ROLE_WINDOWS = {
26
35
  'self-review': 'self-review',
27
36
  'self-review-fix': null, // runs in the primary worker's window, not a separate one
28
37
  'ci-fix': 'ci-fix',
38
+ subtask: null, // a child unit is observed, never spawned — it owns no window
29
39
  };
30
40
  /** Stable session anchor used by orchestration flows without a role window. */
31
41
  export const PRIMARY_WORKER_WINDOW = 'worker';
@@ -51,6 +61,7 @@ export const AGENT_ROLE_RANKS = {
51
61
  'self-review': 10,
52
62
  'self-review-fix': 20,
53
63
  'ci-fix': 30,
64
+ subtask: 40,
54
65
  };
55
66
  export function primaryRoleForFlow(flowType) {
56
67
  if (flowType === 'dev')
@@ -1 +1 @@
1
- {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/agents/roles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../src/agents/roles.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,17 @@
1
- import type { AgentRole } from './contracts/index.js';
1
+ import type { AgentRole, SubtaskSource } from './contracts/index.js';
2
+ import type { WorkerSignalParentLink } from './transport/signal.js';
3
+ export type { SubtaskSource, SubtaskSourceKind } from './contracts/index.js';
2
4
  export declare const CHECKLIST_TARGET_MANIFEST = "checklist-target.json";
3
5
  export declare const TASK_PROGRESS_MARKDOWN = "TASK.md";
4
6
  export declare const INTERACTIVE_CHECKLIST_MARKDOWN = "CHECKLIST.md";
5
7
  export declare const WORKER_SIGNAL_FILE = "SIGNAL.json";
6
8
  export declare const ROLE_SIGNAL_SUFFIX = "-SIGNAL.json";
9
+ /** Directory holding child checklist units and their signals (ADR-060). */
10
+ export declare const SUBTASKS_DIR = "subtasks";
11
+ /** `mark`-maintained registry of child units, the one file the gateway watches to discover them. */
12
+ export declare const SUBTASK_INDEX_FILE = "index.json";
13
+ /** A child unit id: a slug, unique for the life of one task directory. */
14
+ export declare const SUBTASK_ID_PATTERN: RegExp;
7
15
  export declare const SELF_REVIEW_CHECKLIST = "SELF-REVIEW.md";
8
16
  export declare const SELF_REVIEW_FIX_CHECKLIST = "SELF-REVIEW-FIX.md";
9
17
  export declare const CI_FIX_CHECKLIST = "CI-FIX.md";
@@ -39,6 +47,22 @@ export interface ChecklistCheckboxItem {
39
47
  * identical (see test/checklist-target-sync.test.mjs).
40
48
  */
41
49
  export declare function enumerateChecklistCheckboxes(markdown: string): ChecklistCheckboxItem[];
50
+ /**
51
+ * The name a step is shown under. A bold lead (`**1. Text** — long instructions`)
52
+ * is the name, numbering kept, instructions dropped; anything else is the raw
53
+ * label. The gateway task schema, `mark` (SIGNAL.json `step` and event labels,
54
+ * through the CJS mirror in agent-runtime) and `mm-harness status --watch` all
55
+ * name a step through this.
56
+ */
57
+ export declare function checklistStepName(rawLabel: string): string;
58
+ /**
59
+ * Step labels carrying explicit numbering (`**N. …**`) must match the
60
+ * enumerated step position — `mark N` targets positions, and a worker follows
61
+ * the visible label. Sub-step labels (12a) or unnumbered boxes between
62
+ * numbered ones silently shift every later step onto the wrong box. Run this
63
+ * on every generated checklist.
64
+ */
65
+ export declare function checklistNumberingMismatches(markdown: string): string[];
42
66
  export interface ChecklistTarget {
43
67
  checklist: string;
44
68
  signal: string;
@@ -53,6 +77,27 @@ export interface ChecklistTargetRegistry {
53
77
  roles: Record<NestedLoopAgentRole, ChecklistTarget>;
54
78
  }
55
79
  export declare function signalFileForChecklist(checklistBasename: string, registry?: Pick<ChecklistTargetRegistry, 'workerTask' | 'interactiveChecklist' | 'workerSignal' | 'roleSignalSuffix'>): string;
80
+ /**
81
+ * Task-dir relative paths of a child unit's checklist and signal. The signal
82
+ * basename comes from {@link signalFileForChecklist}, so a child pair derives
83
+ * its names exactly as a role pair does; only the `subtasks/` prefix is new.
84
+ */
85
+ export declare function subtaskPaths(id: string): ChecklistTarget;
86
+ /** One registered child unit. Provenance only — progress lives in the child signal. */
87
+ export interface SubtaskIndexUnit {
88
+ id: string;
89
+ parent: WorkerSignalParentLink;
90
+ /** Task-dir relative child checklist path. */
91
+ checklist: string;
92
+ /** Task-dir relative child signal path. */
93
+ signal: string;
94
+ source: SubtaskSource;
95
+ registeredAt: string;
96
+ }
97
+ export interface SubtaskIndex {
98
+ schemaVersion: 1;
99
+ units: SubtaskIndexUnit[];
100
+ }
56
101
  export declare function targetForChecklistBasename(checklistBasename: string, registry?: Pick<ChecklistTargetRegistry, 'workerTask' | 'interactiveChecklist' | 'workerSignal' | 'roleSignalSuffix'>): ChecklistTarget;
57
102
  export declare function terminalContractInputForChecklist(checklistBasename: string): string;
58
103
  export declare const SELF_REVIEW_CHECKLIST_TARGET: ChecklistTarget;
@@ -71,8 +116,10 @@ export interface TaskProgressAcceptanceRun {
71
116
  export interface TaskProgressAcceptanceUpdate {
72
117
  contextId?: string | null;
73
118
  role?: string | null;
119
+ /** Child units only: the parent checklist basename the unit hangs off. */
120
+ parentChecklist?: string | null;
74
121
  }
75
122
  export declare function shouldAcceptTaskProgressUpdate(run: TaskProgressAcceptanceRun | null, update: TaskProgressAcceptanceUpdate, registry?: ChecklistTargetRegistry): boolean;
76
- export type PipelineProgressStep = 'monitor' | 'self-review' | 'ci-watch' | null;
123
+ export type PipelineProgressStep = 'monitor' | 'self-review' | 'ci-watch' | 'human-gate' | null;
77
124
  export declare function nestedLoopProgressLabel(activeStep: PipelineProgressStep, activeTaskBasename: string | null | undefined, registry?: ChecklistTargetRegistry): string;
78
125
  //# sourceMappingURL=checklist-target.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checklist-target.d.ts","sourceRoot":"","sources":["../src/checklist-target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAChD,eAAO,MAAM,8BAA8B,iBAAiB,CAAC;AAC7D,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AACtD,eAAO,MAAM,yBAAyB,uBAAuB,CAAC;AAC9D,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,QACuF,CAAC;AAE5H,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAyDtF;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG,iBAAiB,GAAG,QAAQ,CAAC,CAAC;AAEnG,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;CACrD;AAYD,wBAAgB,sBAAsB,CACpC,iBAAiB,EAAE,MAAM,EACzB,QAAQ,GAAE,IAAI,CACZ,uBAAuB,EACvB,YAAY,GAAG,sBAAsB,GAAG,cAAc,GAAG,kBAAkB,CACjD,GAC3B,MAAM,CASR;AAED,wBAAgB,0BAA0B,CACxC,iBAAiB,EAAE,MAAM,EACzB,QAAQ,GAAE,IAAI,CACZ,uBAAuB,EACvB,YAAY,GAAG,sBAAsB,GAAG,cAAc,GAAG,kBAAkB,CACjD,GAC3B,eAAe,CAKjB;AAED,wBAAgB,iCAAiC,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CASnF;AAED,eAAO,MAAM,4BAA4B,iBAAoD,CAAC;AAC9F,eAAO,MAAM,gCAAgC,iBACU,CAAC;AACxD,eAAO,MAAM,uBAAuB,iBAA+C,CAAC;AAEpF,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAIvF,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,uBAO/C,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,mBAAmB,EACzB,QAAQ,GAAE,uBAA2D,GACpE,eAAe,GAAG,IAAI,CAExB;AAED,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,MAAM,EACzB,QAAQ,GAAE,uBAA2D,GACpE,mBAAmB,GAAG,IAAI,CAO5B;AAED,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,yBAAyB,GAAG,IAAI,EACrC,MAAM,EAAE,4BAA4B,EACpC,QAAQ,GAAE,uBAA2D,GACpE,OAAO,CAST;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;AAEjF,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,oBAAoB,EAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7C,QAAQ,GAAE,uBAA2D,GACpE,MAAM,CAQR"}
1
+ {"version":3,"file":"checklist-target.d.ts","sourceRoot":"","sources":["../src/checklist-target.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,12 @@ export const TASK_PROGRESS_MARKDOWN = 'TASK.md';
4
4
  export const INTERACTIVE_CHECKLIST_MARKDOWN = 'CHECKLIST.md';
5
5
  export const WORKER_SIGNAL_FILE = 'SIGNAL.json';
6
6
  export const ROLE_SIGNAL_SUFFIX = '-SIGNAL.json';
7
+ /** Directory holding child checklist units and their signals (ADR-060). */
8
+ export const SUBTASKS_DIR = 'subtasks';
9
+ /** `mark`-maintained registry of child units, the one file the gateway watches to discover them. */
10
+ export const SUBTASK_INDEX_FILE = 'index.json';
11
+ /** A child unit id: a slug, unique for the life of one task directory. */
12
+ export const SUBTASK_ID_PATTERN = /^[a-z0-9-]+$/;
7
13
  export const SELF_REVIEW_CHECKLIST = 'SELF-REVIEW.md';
8
14
  export const SELF_REVIEW_FIX_CHECKLIST = 'SELF-REVIEW-FIX.md';
9
15
  export const CI_FIX_CHECKLIST = 'CI-FIX.md';
@@ -87,6 +93,36 @@ export function enumerateChecklistCheckboxes(markdown) {
87
93
  }
88
94
  return items;
89
95
  }
96
+ /**
97
+ * The name a step is shown under. A bold lead (`**1. Text** — long instructions`)
98
+ * is the name, numbering kept, instructions dropped; anything else is the raw
99
+ * label. The gateway task schema, `mark` (SIGNAL.json `step` and event labels,
100
+ * through the CJS mirror in agent-runtime) and `mm-harness status --watch` all
101
+ * name a step through this.
102
+ */
103
+ export function checklistStepName(rawLabel) {
104
+ return rawLabel.replace(/^\*\*(.+?)\*\*.*$/, '$1').trim();
105
+ }
106
+ /**
107
+ * Step labels carrying explicit numbering (`**N. …**`) must match the
108
+ * enumerated step position — `mark N` targets positions, and a worker follows
109
+ * the visible label. Sub-step labels (12a) or unnumbered boxes between
110
+ * numbered ones silently shift every later step onto the wrong box. Run this
111
+ * on every generated checklist.
112
+ */
113
+ export function checklistNumberingMismatches(markdown) {
114
+ const mismatches = [];
115
+ for (const item of enumerateChecklistCheckboxes(markdown)) {
116
+ // Capture an optional letter suffix: a label like `17a.` is exactly how an inserted
117
+ // step silently desynchronises numbering, and matching digits only skipped it —
118
+ // the drift was reported one row later, at the first purely numeric label.
119
+ const labeled = item.rawLabel.match(/^\*{0,2}(\d+[a-z]?)[.)]/i);
120
+ if (labeled && labeled[1] !== String(item.stepNumber)) {
121
+ mismatches.push(`position ${item.stepNumber} is labeled "${labeled[1]}"`);
122
+ }
123
+ }
124
+ return mismatches;
125
+ }
90
126
  const SIGNAL_REGISTRY_DEFAULTS = {
91
127
  workerTask: TASK_PROGRESS_MARKDOWN,
92
128
  interactiveChecklist: INTERACTIVE_CHECKLIST_MARKDOWN,
@@ -101,6 +137,17 @@ export function signalFileForChecklist(checklistBasename, registry = SIGNAL_REGI
101
137
  const base = checklistBasename.replace(/\.md$/i, '');
102
138
  return `${base}${registry.roleSignalSuffix}`;
103
139
  }
140
+ /**
141
+ * Task-dir relative paths of a child unit's checklist and signal. The signal
142
+ * basename comes from {@link signalFileForChecklist}, so a child pair derives
143
+ * its names exactly as a role pair does; only the `subtasks/` prefix is new.
144
+ */
145
+ export function subtaskPaths(id) {
146
+ return {
147
+ checklist: `${SUBTASKS_DIR}/${id}.md`,
148
+ signal: `${SUBTASKS_DIR}/${signalFileForChecklist(`${id}.md`)}`,
149
+ };
150
+ }
104
151
  export function targetForChecklistBasename(checklistBasename, registry = SIGNAL_REGISTRY_DEFAULTS) {
105
152
  return {
106
153
  checklist: checklistBasename,
@@ -152,7 +199,34 @@ export function taskDirRelPath(taskDir, basename) {
152
199
  const normalized = String(taskDir).replace(/\/+$/, '');
153
200
  return `${normalized}/${basename}`;
154
201
  }
202
+ /**
203
+ * Basename of the checklist a progress update must belong to: the active role
204
+ * checklist when one is live, otherwise the run's own worker file.
205
+ */
206
+ function activeChecklistBasename(run) {
207
+ const activeTaskFile = run?.activeTaskFile;
208
+ const effective = !activeTaskFile || activeTaskFile === run?.taskFile ? run?.taskFile : activeTaskFile;
209
+ return checklistBasenameFromTaskPath(effective);
210
+ }
155
211
  export function shouldAcceptTaskProgressUpdate(run, update, registry = DEFAULT_CHECKLIST_TARGET_REGISTRY) {
212
+ // A child unit is not a role switch: its contextId is the child id, so the
213
+ // role comparison below can never match it. It is live exactly while its
214
+ // parent checklist is the active one — a child parented on a checklist whose
215
+ // terminal mark already landed is stale, like every other off-role update.
216
+ if (update.role === 'subtask') {
217
+ const parentChecklist = update.parentChecklist ?? null;
218
+ if (!parentChecklist)
219
+ return false;
220
+ const activeName = activeChecklistBasename(run);
221
+ // No task file at all: nothing to contradict the child's claim.
222
+ if (!activeName)
223
+ return true;
224
+ // Compare the pair, not the filename: the run's task file is `TASK.md`
225
+ // while the worker checklist a child hangs off is `CHECKLIST.md`, and both
226
+ // resolve to the same worker signal. A role checklist resolves to its own.
227
+ return (signalFileForChecklist(parentChecklist, registry) ===
228
+ signalFileForChecklist(activeName, registry));
229
+ }
156
230
  const activeTaskFile = run?.activeTaskFile;
157
231
  if (!activeTaskFile || activeTaskFile === run?.taskFile)
158
232
  return true;
@@ -166,10 +240,12 @@ export function shouldAcceptTaskProgressUpdate(run, update, registry = DEFAULT_C
166
240
  return contextId === expectedRole;
167
241
  }
168
242
  export function nestedLoopProgressLabel(activeStep, activeTaskBasename, registry = DEFAULT_CHECKLIST_TARGET_REGISTRY) {
169
- if (activeStep === 'self-review') {
243
+ if (activeStep === 'self-review' || activeStep === 'human-gate') {
170
244
  const role = agentRoleForChecklistBasename(activeTaskBasename ?? '', registry);
171
245
  if (role === 'self-review-fix')
172
246
  return 'Self-review Fix Progress';
247
+ if (activeStep === 'human-gate')
248
+ return 'Independent Review Progress';
173
249
  return 'Self-review Progress';
174
250
  }
175
251
  if (activeStep === 'ci-watch')
@@ -1 +1 @@
1
- {"version":3,"file":"checklist-target.js","sourceRoot":"","sources":["../src/checklist-target.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checklist-target.js","sourceRoot":"","sources":["../src/checklist-target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /** Task-dir relative path of the ledger. Written only by `farmslot-agent ac`. */
2
+ export declare const ACCEPTANCE_STATUS_ARTIFACT = "artifacts/acceptance-status.json";
3
+ export declare const ACCEPTANCE_VERDICTS: readonly ["proven", "weak", "missing", "untestable"];
4
+ export type AcceptanceVerdict = (typeof ACCEPTANCE_VERDICTS)[number];
5
+ export declare const ACCEPTANCE_PROOF_MODES: readonly ["state", "visual", "mixed"];
6
+ export type AcceptanceProofMode = (typeof ACCEPTANCE_PROOF_MODES)[number];
7
+ /** Ids are positional, so a criterion keeps its id for the life of the task dir. */
8
+ export declare const ACCEPTANCE_CRITERION_ID_PATTERN: RegExp;
9
+ /**
10
+ * `AC-<N>` for a criterion's position in the handoff array.
11
+ *
12
+ * @param index 0-based position in `inputs/handoff.json` `task.acceptanceCriteria`.
13
+ */
14
+ export declare function acceptanceCriterionId(index: number): string;
15
+ export interface AcceptanceCriterionStatus {
16
+ /** `AC-<N>`, N the 1-based position in the handoff criteria array. */
17
+ id: string;
18
+ /** Criterion text as task init recorded it. */
19
+ text: string;
20
+ verdict: AcceptanceVerdict;
21
+ proofMode?: AcceptanceProofMode;
22
+ /** Task-dir relative evidence paths. */
23
+ evidence: string[];
24
+ /** Recipe node ids that prove this criterion. */
25
+ recipeNodes: string[];
26
+ note?: string;
27
+ updatedAt: string;
28
+ }
29
+ export interface AcceptanceStatusLedger {
30
+ schemaVersion: 1;
31
+ criteria: AcceptanceCriterionStatus[];
32
+ }
33
+ /**
34
+ * One criterion as task init registered it: the id and the text, with no verdict.
35
+ * Clients pair this with the ledger so a criterion the worker has not judged yet is
36
+ * visible as awaiting a verdict rather than missing from the panel — the ledger
37
+ * holds only what `ac set` recorded, and nothing may invent a verdict for the rest.
38
+ */
39
+ export interface AcceptanceCriterionRef {
40
+ id: string;
41
+ text: string;
42
+ }
43
+ /** A criterion paired with its verdict, or null when none is recorded yet. */
44
+ export interface AcceptanceCriterionView extends AcceptanceCriterionRef {
45
+ status: AcceptanceCriterionStatus | null;
46
+ }
47
+ /**
48
+ * Every registered criterion in id order, each with its recorded verdict or null.
49
+ * `criteria` is the authority for how many criteria the run has; `ledger` only ever
50
+ * holds the ones already judged.
51
+ */
52
+ export declare function acceptanceCriteriaView(criteria: ReadonlyArray<AcceptanceCriterionRef>, ledger: AcceptanceStatusLedger | null): AcceptanceCriterionView[];
53
+ export interface AcceptanceStatusSummary {
54
+ proven: number;
55
+ weak: number;
56
+ missing: number;
57
+ untestable: number;
58
+ /** Registered criteria with no verdict recorded yet; 0 unless `criteria` was given. */
59
+ unrecorded: number;
60
+ total: number;
61
+ }
62
+ /**
63
+ * Contract issues for a parsed ledger; an empty array means the value is a valid
64
+ * {@link AcceptanceStatusLedger}. Issue strings are caller-printable and name the
65
+ * offending field, the way the task artifact contract check reports its own.
66
+ */
67
+ export declare function validateAcceptanceStatusLedger(value: unknown): string[];
68
+ /**
69
+ * Verdict tally over the ledger.
70
+ *
71
+ * Omitting `criteria` counts only the rows already recorded, which understates a
72
+ * partial ledger: `total` is then "verdicts written", not "criteria the task has".
73
+ * Pass the registered criteria whenever the caller can read them — every caller
74
+ * with the task directory can — to get a `total` of registered criteria and an
75
+ * `unrecorded` count of those still waiting for a verdict.
76
+ */
77
+ export declare function summarizeAcceptanceStatus(ledger: AcceptanceStatusLedger, criteria?: ReadonlyArray<AcceptanceCriterionRef>): AcceptanceStatusSummary;
78
+ /**
79
+ * The coverage table `artifacts/recipe-coverage.md` holds today, rendered from the
80
+ * ledger. The proof-mode column keeps the lowercase `state` / `visual` / `mixed`
81
+ * vocabulary the evidence rules key off, and the last line is the `Overall recipe
82
+ * coverage:` summary every consumer of the coverage file already looks for.
83
+ *
84
+ * Pass `criteria` so the overall line counts registered criteria: without them a
85
+ * partial ledger reads `1/1 PROVEN` when the task has three criteria. A criterion
86
+ * with no verdict yet is counted in the total and listed as awaiting one; it is
87
+ * never given a verdict it does not have.
88
+ */
89
+ export declare function renderAcceptanceCoverage(ledger: AcceptanceStatusLedger, criteria?: ReadonlyArray<AcceptanceCriterionRef>): string;
90
+ //# sourceMappingURL=acceptance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../src/contracts/acceptance.ts"],"names":[],"mappings":"AASA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,qCAAqC,CAAC;AAE7E,eAAO,MAAM,mBAAmB,sDAAuD,CAAC;AACxF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,eAAO,MAAM,sBAAsB,uCAAwC,CAAC;AAC5E,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,oFAAoF;AACpF,eAAO,MAAM,+BAA+B,QAAqB,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,CAAC,CAAC;IACjB,QAAQ,EAAE,yBAAyB,EAAE,CAAC;CACvC;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,8EAA8E;AAC9E,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,aAAa,CAAC,sBAAsB,CAAC,EAC/C,MAAM,EAAE,sBAAsB,GAAG,IAAI,GACpC,uBAAuB,EAAE,CAc3B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAUD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CA8CvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAC/C,uBAAuB,CAgBzB;AAeD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,GAAE,aAAa,CAAC,sBAAsB,CAAmB,GAChE,MAAM,CA+BR"}
@@ -0,0 +1,177 @@
1
+ // Acceptance-criteria ledger (ADR-060): one verdict per criterion, with the
2
+ // evidence that proves it.
3
+ //
4
+ // Task init assigns the ids (`AC-<N>`, N the 1-based position of the criterion in
5
+ // `inputs/handoff.json` `task.acceptanceCriteria`) and `farmslot-agent ac` is the
6
+ // only writer of `artifacts/acceptance-status.json`. The markdown coverage table
7
+ // workers hand-write today is a rendering of this file, so the terminal contract
8
+ // check, the PR body, and the run-detail panel all read one structured source.
9
+ /** Task-dir relative path of the ledger. Written only by `farmslot-agent ac`. */
10
+ export const ACCEPTANCE_STATUS_ARTIFACT = 'artifacts/acceptance-status.json';
11
+ export const ACCEPTANCE_VERDICTS = ['proven', 'weak', 'missing', 'untestable'];
12
+ export const ACCEPTANCE_PROOF_MODES = ['state', 'visual', 'mixed'];
13
+ /** Ids are positional, so a criterion keeps its id for the life of the task dir. */
14
+ export const ACCEPTANCE_CRITERION_ID_PATTERN = /^AC-[1-9][0-9]*$/;
15
+ /**
16
+ * `AC-<N>` for a criterion's position in the handoff array.
17
+ *
18
+ * @param index 0-based position in `inputs/handoff.json` `task.acceptanceCriteria`.
19
+ */
20
+ export function acceptanceCriterionId(index) {
21
+ return `AC-${index + 1}`;
22
+ }
23
+ /**
24
+ * Every registered criterion in id order, each with its recorded verdict or null.
25
+ * `criteria` is the authority for how many criteria the run has; `ledger` only ever
26
+ * holds the ones already judged.
27
+ */
28
+ export function acceptanceCriteriaView(criteria, ledger) {
29
+ const byId = new Map((ledger?.criteria ?? []).map((entry) => [entry.id, entry]));
30
+ const rows = criteria.map((criterion) => ({
31
+ ...criterion,
32
+ status: byId.get(criterion.id) ?? null,
33
+ }));
34
+ // A ledger entry for an id the handoff does not list is still shown: hiding it
35
+ // would hide a contract violation the terminal check refuses on.
36
+ for (const entry of ledger?.criteria ?? []) {
37
+ if (!criteria.some((criterion) => criterion.id === entry.id)) {
38
+ rows.push({ id: entry.id, text: entry.text, status: entry });
39
+ }
40
+ }
41
+ return rows;
42
+ }
43
+ function isRecord(value) {
44
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
45
+ }
46
+ function isNonEmptyString(value) {
47
+ return typeof value === 'string' && value.trim().length > 0;
48
+ }
49
+ /**
50
+ * Contract issues for a parsed ledger; an empty array means the value is a valid
51
+ * {@link AcceptanceStatusLedger}. Issue strings are caller-printable and name the
52
+ * offending field, the way the task artifact contract check reports its own.
53
+ */
54
+ export function validateAcceptanceStatusLedger(value) {
55
+ const issues = [];
56
+ if (!isRecord(value))
57
+ return ['acceptance ledger: expected object'];
58
+ if (value.schemaVersion !== 1)
59
+ issues.push('acceptance ledger schemaVersion: expected 1');
60
+ if (!Array.isArray(value.criteria)) {
61
+ issues.push('acceptance ledger criteria: expected array');
62
+ return issues;
63
+ }
64
+ const seen = new Set();
65
+ value.criteria.forEach((entry, index) => {
66
+ const prefix = `acceptance ledger criteria[${index}]`;
67
+ if (!isRecord(entry)) {
68
+ issues.push(`${prefix}: expected object`);
69
+ return;
70
+ }
71
+ if (!isNonEmptyString(entry.id) || !ACCEPTANCE_CRITERION_ID_PATTERN.test(entry.id)) {
72
+ issues.push(`${prefix}.id: expected AC-<N>`);
73
+ }
74
+ else if (seen.has(entry.id)) {
75
+ issues.push(`${prefix}.id: duplicate ${entry.id}`);
76
+ }
77
+ else {
78
+ seen.add(entry.id);
79
+ }
80
+ if (typeof entry.text !== 'string')
81
+ issues.push(`${prefix}.text: expected string`);
82
+ if (!ACCEPTANCE_VERDICTS.includes(entry.verdict)) {
83
+ issues.push(`${prefix}.verdict: expected one of ${ACCEPTANCE_VERDICTS.join(', ')}`);
84
+ }
85
+ if (entry.proofMode !== undefined &&
86
+ !ACCEPTANCE_PROOF_MODES.includes(entry.proofMode)) {
87
+ issues.push(`${prefix}.proofMode: expected one of ${ACCEPTANCE_PROOF_MODES.join(', ')}`);
88
+ }
89
+ for (const key of ['evidence', 'recipeNodes']) {
90
+ const list = entry[key];
91
+ if (!Array.isArray(list) || list.some((item) => !isNonEmptyString(item))) {
92
+ issues.push(`${prefix}.${key}: expected an array of non-empty strings`);
93
+ }
94
+ }
95
+ if (entry.note !== undefined && typeof entry.note !== 'string') {
96
+ issues.push(`${prefix}.note: expected string`);
97
+ }
98
+ if (!isNonEmptyString(entry.updatedAt)) {
99
+ issues.push(`${prefix}.updatedAt: expected non-empty string`);
100
+ }
101
+ });
102
+ return issues;
103
+ }
104
+ /**
105
+ * Verdict tally over the ledger.
106
+ *
107
+ * Omitting `criteria` counts only the rows already recorded, which understates a
108
+ * partial ledger: `total` is then "verdicts written", not "criteria the task has".
109
+ * Pass the registered criteria whenever the caller can read them — every caller
110
+ * with the task directory can — to get a `total` of registered criteria and an
111
+ * `unrecorded` count of those still waiting for a verdict.
112
+ */
113
+ export function summarizeAcceptanceStatus(ledger, criteria) {
114
+ const total = criteria
115
+ ? Math.max(criteria.length, ledger.criteria.length)
116
+ : ledger.criteria.length;
117
+ const summary = {
118
+ proven: 0,
119
+ weak: 0,
120
+ missing: 0,
121
+ untestable: 0,
122
+ unrecorded: 0,
123
+ total,
124
+ };
125
+ for (const criterion of ledger.criteria)
126
+ summary[criterion.verdict] += 1;
127
+ summary.unrecorded =
128
+ total - (summary.proven + summary.weak + summary.missing + summary.untestable);
129
+ return summary;
130
+ }
131
+ function cell(value) {
132
+ return (value
133
+ .replace(/\|/g, '\\|')
134
+ .replace(/\s*\n\s*/g, ' ')
135
+ .trim() || '-');
136
+ }
137
+ function list(values) {
138
+ return values.length > 0 ? cell(values.join(', ')) : '-';
139
+ }
140
+ /**
141
+ * The coverage table `artifacts/recipe-coverage.md` holds today, rendered from the
142
+ * ledger. The proof-mode column keeps the lowercase `state` / `visual` / `mixed`
143
+ * vocabulary the evidence rules key off, and the last line is the `Overall recipe
144
+ * coverage:` summary every consumer of the coverage file already looks for.
145
+ *
146
+ * Pass `criteria` so the overall line counts registered criteria: without them a
147
+ * partial ledger reads `1/1 PROVEN` when the task has three criteria. A criterion
148
+ * with no verdict yet is counted in the total and listed as awaiting one; it is
149
+ * never given a verdict it does not have.
150
+ */
151
+ export function renderAcceptanceCoverage(ledger, criteria = ledger.criteria) {
152
+ const summary = summarizeAcceptanceStatus(ledger, criteria);
153
+ const rows = acceptanceCriteriaView(criteria, ledger);
154
+ const untestable = ledger.criteria
155
+ .filter((criterion) => criterion.verdict === 'untestable')
156
+ .map((criterion) => criterion.id);
157
+ const lines = [
158
+ '## Recipe coverage',
159
+ '',
160
+ '| AC | Criterion | Verdict | Proof mode | Recipe nodes | Evidence | Note |',
161
+ '| --- | --- | --- | --- | --- | --- | --- |',
162
+ ];
163
+ for (const row of rows) {
164
+ const status = row.status;
165
+ lines.push(`| ${row.id} | ${cell(row.text)} | ${status ? status.verdict.toUpperCase() : 'NO VERDICT'} | ` +
166
+ `${status?.proofMode ?? '-'} | ${list(status?.recipeNodes ?? [])} | ` +
167
+ `${list(status?.evidence ?? [])} | ${cell(status?.note ?? '')} |`);
168
+ }
169
+ lines.push('', `Overall recipe coverage: ${summary.proven}/${summary.total} ACs PROVEN ` +
170
+ `(untestable: ${untestable.length > 0 ? untestable.join(', ') : 'none'}, ` +
171
+ `weak: ${summary.weak}, missing: ${summary.missing}` +
172
+ // Only when some criterion has no verdict: a finished run renders the exact
173
+ // line the spec pins, and a partial one says why the counts fall short.
174
+ `${summary.unrecorded > 0 ? `, no verdict: ${summary.unrecorded}` : ''})`, '');
175
+ return lines.join('\n');
176
+ }
177
+ //# sourceMappingURL=acceptance.js.map