@encore-os/eos-spec 0.15.1 → 0.17.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.
- package/dist/commands/close-out.js +62 -3
- package/dist/commands/close-out.js.map +1 -1
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.js +82 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/index-spec.js +22 -4
- package/dist/commands/index-spec.js.map +1 -1
- package/dist/commands/next.d.ts +6 -0
- package/dist/commands/next.js +11 -1
- package/dist/commands/next.js.map +1 -1
- package/dist/commands/reconcile.js +6 -2
- package/dist/commands/reconcile.js.map +1 -1
- package/dist/commands/scorecard.js +51 -0
- package/dist/commands/scorecard.js.map +1 -1
- package/dist/commands/signoff.js +12 -1
- package/dist/commands/signoff.js.map +1 -1
- package/dist/commands/verify-acs.d.ts +7 -0
- package/dist/commands/verify-acs.js +81 -13
- package/dist/commands/verify-acs.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/closeout-core.d.ts +29 -5
- package/dist/lib/closeout-core.js +57 -6
- package/dist/lib/closeout-core.js.map +1 -1
- package/dist/lib/config.d.ts +31 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/doctor-core.d.ts +63 -0
- package/dist/lib/doctor-core.js +98 -0
- package/dist/lib/doctor-core.js.map +1 -0
- package/dist/lib/frontmatter.js +31 -5
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/reconcile-core.d.ts +1 -1
- package/dist/lib/reconcile-core.js +10 -2
- package/dist/lib/reconcile-core.js.map +1 -1
- package/dist/lib/rtm-scorecard-run.d.ts +38 -0
- package/dist/lib/rtm-scorecard-run.js +70 -0
- package/dist/lib/rtm-scorecard-run.js.map +1 -0
- package/dist/lib/rtm-scorecard.d.ts +151 -0
- package/dist/lib/rtm-scorecard.js +197 -0
- package/dist/lib/rtm-scorecard.js.map +1 -0
- package/dist/lib/spec-pure.d.ts +38 -0
- package/dist/lib/spec-pure.js +162 -17
- package/dist/lib/spec-pure.js.map +1 -1
- package/dist/lib/specs.d.ts +20 -0
- package/dist/lib/specs.js +37 -1
- package/dist/lib/specs.js.map +1 -1
- package/dist/lib/verify-core.d.ts +5 -0
- package/dist/lib/verify-core.js +5 -1
- package/dist/lib/verify-core.js.map +1 -1
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/pure.d.ts +1 -0
- package/dist/pure.js +3 -0
- package/dist/pure.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PURE diagnostics for the spec status-model footguns (`spec doctor`, P3c). The
|
|
3
|
+
* eos-spec status model has TWO distinct frontmatter fields that agents routinely
|
|
4
|
+
* conflate:
|
|
5
|
+
* - `pipeline_status` — a DERIVED cache of the workflow stage, drawn from the
|
|
6
|
+
* pipeline layout's `statusOrder` (e.g. builder: stub…tasks_generated). It has
|
|
7
|
+
* NO terminal lifecycle value like `implemented`.
|
|
8
|
+
* - `status` — the implementation LIFECYCLE (the repo's `statuses` enum:
|
|
9
|
+
* specification/…/complete/implemented/archived).
|
|
10
|
+
*
|
|
11
|
+
* The category error is putting one field's vocabulary in the other — most often
|
|
12
|
+
* `pipeline_status: implemented` (a lifecycle value in the stage field). This is
|
|
13
|
+
* config-driven so ANY consumer's stages/statuses drive it, not a hardcoded set.
|
|
14
|
+
* No I/O — the command layer reads the files.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Diagnose the two-field status-model footgun on one spec.
|
|
18
|
+
*
|
|
19
|
+
* @param spec the spec's id/core + its `pipeline_status`/`status` frontmatter values.
|
|
20
|
+
* @param vocab the repo's valid stage + status vocabularies.
|
|
21
|
+
* @returns zero or more findings (empty = the spec's status fields are well-formed).
|
|
22
|
+
*/
|
|
23
|
+
export function diagnoseSpecStatusFields(spec, vocab) {
|
|
24
|
+
const stages = new Set(vocab.stages);
|
|
25
|
+
const statuses = new Set(vocab.statuses);
|
|
26
|
+
const findings = [];
|
|
27
|
+
const ps = typeof spec.pipeline_status === 'string' ? spec.pipeline_status : null;
|
|
28
|
+
if (ps && !stages.has(ps)) {
|
|
29
|
+
const swapped = statuses.has(ps);
|
|
30
|
+
findings.push({
|
|
31
|
+
id: spec.id,
|
|
32
|
+
core: spec.core,
|
|
33
|
+
field: 'pipeline_status',
|
|
34
|
+
value: ps,
|
|
35
|
+
kind: swapped ? 'swapped' : 'unknown',
|
|
36
|
+
message: swapped
|
|
37
|
+
? `pipeline_status "${ps}" is a \`status:\` lifecycle value, not a pipeline stage. ` +
|
|
38
|
+
`pipeline_status is a derived stage cache (${vocab.stages.join(', ')}); track the ` +
|
|
39
|
+
`lifecycle in \`status:\` instead — the two fields are distinct.`
|
|
40
|
+
: `pipeline_status "${ps}" is not a valid pipeline stage (${vocab.stages.join(', ')}).`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const st = typeof spec.status === 'string' ? spec.status : null;
|
|
44
|
+
if (st) {
|
|
45
|
+
// With no `statuses:` enum declared, we can't judge membership at all — only
|
|
46
|
+
// flag the one thing we CAN still detect without it: a pipeline stage value
|
|
47
|
+
// landing in `status:` (the classic swap). Never call an unrecognized value
|
|
48
|
+
// "unknown" when we have no vocabulary to check it against.
|
|
49
|
+
const swapped = stages.has(st);
|
|
50
|
+
const flag = statuses.size > 0 ? !statuses.has(st) : swapped;
|
|
51
|
+
if (flag) {
|
|
52
|
+
findings.push({
|
|
53
|
+
id: spec.id,
|
|
54
|
+
core: spec.core,
|
|
55
|
+
field: 'status',
|
|
56
|
+
value: st,
|
|
57
|
+
kind: swapped ? 'swapped' : 'unknown',
|
|
58
|
+
message: swapped
|
|
59
|
+
? `status "${st}" is a pipeline stage, not a lifecycle value. Track the workflow ` +
|
|
60
|
+
`stage in \`pipeline_status:\`; \`status:\` holds the lifecycle (${vocab.statuses.join(', ')}).`
|
|
61
|
+
: `status "${st}" is not in the repo's statuses enum (${vocab.statuses.join(', ')}).`,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return findings;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Diagnose a cross-feature invariant #70 shipped but never validated: the repo's
|
|
69
|
+
* `close_out.terminal_status` (the status value close-out writes) must itself be a
|
|
70
|
+
* member of `statuses:`. If it isn't, close-out writes that value and `doctor` then
|
|
71
|
+
* flags it on every closed-out spec — a silent, self-inflicted contradiction between
|
|
72
|
+
* two features that shipped in the same PR. Skips the check (no finding) when the repo declares no
|
|
73
|
+
* `statuses:` enum at all — that degrade is `diagnoseSpecStatusFields`'s job, not this
|
|
74
|
+
* one's, since there's nothing to validate membership against.
|
|
75
|
+
*
|
|
76
|
+
* @param terminalStatus `config.close_out?.terminal_status`, if the repo sets one.
|
|
77
|
+
* @param vocab the repo's valid stage + status vocabularies.
|
|
78
|
+
* @returns zero or one finding.
|
|
79
|
+
*/
|
|
80
|
+
export function diagnoseCloseoutTerminalStatus(terminalStatus, vocab) {
|
|
81
|
+
if (!terminalStatus || vocab.statuses.length === 0)
|
|
82
|
+
return [];
|
|
83
|
+
if (vocab.statuses.includes(terminalStatus))
|
|
84
|
+
return [];
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
id: '(config)',
|
|
88
|
+
core: 'close_out',
|
|
89
|
+
field: 'terminal_status',
|
|
90
|
+
value: terminalStatus,
|
|
91
|
+
kind: 'unknown',
|
|
92
|
+
message: `close_out.terminal_status "${terminalStatus}" is not in the repo's statuses enum ` +
|
|
93
|
+
`(${vocab.statuses.join(', ')}). This will be flagged on every closed-out spec — ` +
|
|
94
|
+
`add "${terminalStatus}" to \`statuses:\` in specs/config.yaml.`,
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=doctor-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-core.js","sourceRoot":"","sources":["../../src/lib/doctor-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA+BH;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAsB,EAAE,KAAkB;IACjF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,iBAAiB;YACxB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACrC,OAAO,EAAE,OAAO;gBACd,CAAC,CAAC,oBAAoB,EAAE,4DAA4D;oBAClF,6CAA6C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe;oBACnF,iEAAiE;gBACnE,CAAC,CAAC,oBAAoB,EAAE,oCAAoC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;SAC1F,CAAC,CAAC;IACL,CAAC;IAED,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,IAAI,EAAE,EAAE,CAAC;QACP,6EAA6E;QAC7E,4EAA4E;QAC5E,4EAA4E;QAC5E,4DAA4D;QAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBACrC,OAAO,EAAE,OAAO;oBACd,CAAC,CAAC,WAAW,EAAE,mEAAmE;wBAChF,mEAAmE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;oBAClG,CAAC,CAAC,WAAW,EAAE,yCAAyC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;aACxF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,8BAA8B,CAC5C,cAAkC,EAClC,KAAkB;IAElB,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9D,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvD,OAAO;QACL;YACE,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,iBAAiB;YACxB,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,SAAS;YACf,OAAO,EACL,8BAA8B,cAAc,uCAAuC;gBACnF,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qDAAqD;gBAClF,QAAQ,cAAc,0CAA0C;SACnE;KACF,CAAC;AACJ,CAAC"}
|
package/dist/lib/frontmatter.js
CHANGED
|
@@ -110,9 +110,12 @@ export function setDesignDoc(text, refs) {
|
|
|
110
110
|
const block = match[1];
|
|
111
111
|
const existing = (() => {
|
|
112
112
|
const v = readFrontmatter(text).design_doc;
|
|
113
|
+
// Drop empty entries so a consumer template's empty design_doc placeholder
|
|
114
|
+
// (block-list `- ""` or scalar `""`) is not re-emitted alongside the real ref
|
|
115
|
+
// (BUG-1: the observed `design_doc:\n - ""\n - "real"` on promote).
|
|
113
116
|
if (Array.isArray(v))
|
|
114
|
-
return v.filter((x) => typeof x === 'string');
|
|
115
|
-
return typeof v === 'string' ? [v] : [];
|
|
117
|
+
return v.filter((x) => typeof x === 'string' && x.length > 0);
|
|
118
|
+
return typeof v === 'string' && v.length > 0 ? [v] : [];
|
|
116
119
|
})();
|
|
117
120
|
const merged = [...existing];
|
|
118
121
|
for (const r of refs)
|
|
@@ -273,10 +276,33 @@ export function appendAcceptanceCriteria(text, entries) {
|
|
|
273
276
|
if (hasKey) {
|
|
274
277
|
const parsed = readFrontmatter(text);
|
|
275
278
|
const existing = Array.isArray(parsed.acceptance_criteria) ? parsed.acceptance_criteria : [];
|
|
276
|
-
|
|
279
|
+
// Defense-in-depth (issue #65-2): never append an entry whose id already exists — a
|
|
280
|
+
// caller that seeds an AC the template already carries must not produce a duplicate id.
|
|
281
|
+
const existingIds = new Set(existing.map((e) => e.id).filter((x) => typeof x === 'string'));
|
|
282
|
+
const fresh = entries.filter((e) => !existingIds.has(e.id));
|
|
283
|
+
if (fresh.length === 0)
|
|
284
|
+
return text; // every entry already present → nothing to add
|
|
285
|
+
const merged = yamlStringify({ acceptance_criteria: [...existing, ...fresh] }).trimEnd();
|
|
277
286
|
// Replace the `acceptance_criteria:` block: from that line through the next
|
|
278
|
-
// top-level key OR the end of the frontmatter block.
|
|
279
|
-
|
|
287
|
+
// top-level key OR the end of the frontmatter block. Scan line-by-line rather than
|
|
288
|
+
// a single lazy regex: `[\s\S]*?` followed by a `\s*$` lookahead is satisfied at
|
|
289
|
+
// zero width (the char right after "acceptance_criteria:" is always the "\n" that
|
|
290
|
+
// ends that line, which itself satisfies a multiline `$`), so the old lazy regex
|
|
291
|
+
// matched only the key itself and left the entire original list dangling in the
|
|
292
|
+
// output — a latent bug (pre-dates this dedup change) that duplicated every
|
|
293
|
+
// existing AC on every append. A blank-or-indented line is still part of this
|
|
294
|
+
// key's value; the first unindented, non-blank line starts the next top-level key.
|
|
295
|
+
const blockLines = block.split('\n');
|
|
296
|
+
const keyLineIdx = blockLines.findIndex((line) => /^acceptance_criteria\s*:/.test(line));
|
|
297
|
+
let valueEndIdx = blockLines.length;
|
|
298
|
+
for (let i = keyLineIdx + 1; i < blockLines.length; i++) {
|
|
299
|
+
const line = blockLines[i];
|
|
300
|
+
if (line.trim() !== '' && /^\S/.test(line)) {
|
|
301
|
+
valueEndIdx = i;
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
newBlock = [...blockLines.slice(0, keyLineIdx), merged, ...blockLines.slice(valueEndIdx)].join('\n');
|
|
280
306
|
}
|
|
281
307
|
else {
|
|
282
308
|
newBlock = `${block}\n${yamlStringify({ acceptance_criteria: entries }).trimEnd()}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,4 +40,4 @@ export type ReconcileRow = {
|
|
|
40
40
|
* BUILDER stage order, not the ENCORE1 default (F-4, #35). Omitted ⇒ the static
|
|
41
41
|
* ENCORE1/legacy singleton, unchanged from prior behavior.
|
|
42
42
|
*/
|
|
43
|
-
export declare function reconcileSpec(repoRoot: string, spec: SpecFile, write: boolean, pipeline?: ReconcilePipeline): ReconcileRow;
|
|
43
|
+
export declare function reconcileSpec(repoRoot: string, spec: SpecFile, write: boolean, pipeline?: ReconcilePipeline, pipelineTerminal?: string): ReconcileRow;
|
|
@@ -23,12 +23,20 @@ export function classify(written, computed, rankFn = rank) {
|
|
|
23
23
|
* BUILDER stage order, not the ENCORE1 default (F-4, #35). Omitted ⇒ the static
|
|
24
24
|
* ENCORE1/legacy singleton, unchanged from prior behavior.
|
|
25
25
|
*/
|
|
26
|
-
export function reconcileSpec(repoRoot, spec, write, pipeline) {
|
|
26
|
+
export function reconcileSpec(repoRoot, spec, write, pipeline, pipelineTerminal) {
|
|
27
27
|
const stageFn = pipeline?.computeStage ?? computeStage;
|
|
28
28
|
const rankFn = pipeline?.rank ?? rank;
|
|
29
29
|
const computed = stageFn(spec);
|
|
30
30
|
const written = spec.signals.pipelineStatus;
|
|
31
|
-
|
|
31
|
+
// #75 pin-guard: a spec carrying the repo's opt-in ship terminal
|
|
32
|
+
// (`close_out.pipeline_terminal`, e.g. `complete`) sits ABOVE the artifact-derived stage
|
|
33
|
+
// ON PURPOSE — shipping is a lifecycle fact `computeStage` can't see (it caps at
|
|
34
|
+
// tasks_generated). Treat that EXACT value as reconciled ('ok') so no reconcile pass
|
|
35
|
+
// (this one, `signoff --reconcile`, close-out's own step 1, or a later `reconcile`) heals
|
|
36
|
+
// it back down. Every OTHER overstated value is still corrected — only the configured
|
|
37
|
+
// terminal is pinned, and only when a repo opts in (pipelineTerminal set).
|
|
38
|
+
const pinnedTerminal = pipelineTerminal !== undefined && written === pipelineTerminal;
|
|
39
|
+
const direction = pinnedTerminal ? 'ok' : classify(written, computed, rankFn);
|
|
32
40
|
if (write && computed) {
|
|
33
41
|
const original = readFileSync(spec.path, 'utf8');
|
|
34
42
|
let text = original;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-core.js","sourceRoot":"","sources":["../../src/lib/reconcile-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAuBvD;;oFAEoF;AACpF,MAAM,UAAU,QAAQ,CACtB,OAA2B,EAC3B,QAA4B,EAC5B,SAAsC,IAAI;IAE1C,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AACvE,CAAC;AAUD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,IAAc,EACd,KAAc,EACd,QAA4B;
|
|
1
|
+
{"version":3,"file":"reconcile-core.js","sourceRoot":"","sources":["../../src/lib/reconcile-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAuBvD;;oFAEoF;AACpF,MAAM,UAAU,QAAQ,CACtB,OAA2B,EAC3B,QAA4B,EAC5B,SAAsC,IAAI;IAE1C,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AACvE,CAAC;AAUD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,IAAc,EACd,KAAc,EACd,QAA4B,EAC5B,gBAAyB;IAEzB,MAAM,OAAO,GAAG,QAAQ,EAAE,YAAY,IAAI,YAAY,CAAC;IACvD,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IAC5C,iEAAiE;IACjE,yFAAyF;IACzF,iFAAiF;IACjF,qFAAqF;IACrF,0FAA0F;IAC1F,sFAAsF;IACtF,2EAA2E;IAC3E,MAAM,cAAc,GAAG,gBAAgB,KAAK,SAAS,IAAI,OAAO,KAAK,gBAAgB,CAAC;IACtF,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9E,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,SAAS,KAAK,IAAI;YAAE,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjE,+EAA+E;QAC/E,6EAA6E;QAC7E,8EAA8E;QAC9E,+EAA+E;QAC/E,2EAA2E;QAC3E,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5F,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACpG,IAAI,IAAI;gBAAE,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ;YAAE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type RtmSpecRow = {
|
|
2
|
+
id: string;
|
|
3
|
+
core: string;
|
|
4
|
+
fr: {
|
|
5
|
+
total: number;
|
|
6
|
+
verified: number;
|
|
7
|
+
unverified: string[];
|
|
8
|
+
};
|
|
9
|
+
sc: {
|
|
10
|
+
total: number;
|
|
11
|
+
met: number;
|
|
12
|
+
unmet: string[];
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export type RtmReport = {
|
|
16
|
+
core: string;
|
|
17
|
+
/** Specs scanned. */
|
|
18
|
+
total: number;
|
|
19
|
+
/** Specs carrying ≥1 FR or SC (the ones the scorecard actually scores). */
|
|
20
|
+
specsWithReqs: number;
|
|
21
|
+
fr: {
|
|
22
|
+
total: number;
|
|
23
|
+
verified: number;
|
|
24
|
+
};
|
|
25
|
+
sc: {
|
|
26
|
+
total: number;
|
|
27
|
+
met: number;
|
|
28
|
+
};
|
|
29
|
+
/** Fraction of FRs verified (0–1); 1 when there are no FRs (nothing to verify). */
|
|
30
|
+
frVerifiedPct: number;
|
|
31
|
+
/** Fraction of SCs met (0–1); 1 when there are no SCs. */
|
|
32
|
+
scMetPct: number;
|
|
33
|
+
/** Per-spec rows, only for specs that carry FR/SC requirements. */
|
|
34
|
+
rows: RtmSpecRow[];
|
|
35
|
+
};
|
|
36
|
+
/** Build the corpus RTM scorecard for `coreFilter` (or all cores). Deterministic (listSpecs
|
|
37
|
+
* order). Specs with no FR/SC requirements are counted in `total` but omitted from `rows`. */
|
|
38
|
+
export declare function buildRtmScorecard(repoRoot: string, coreFilter?: string): RtmReport;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fs-bound driver for the FR/SC RTM scorecard (#79): walk a repo's specs, read each spec's
|
|
3
|
+
* body + frontmatter ACs, and aggregate the pure {@link deriveScorecard} per spec into a corpus
|
|
4
|
+
* report. The verdict logic + parsing stay in the pure `rtm-scorecard.ts` (on the `/pure` graph);
|
|
5
|
+
* this only supplies the corpus walk + file IO, so it lives behind the package main entry.
|
|
6
|
+
*
|
|
7
|
+
* On-disk (proof-free) by design: "verified" reads from each AC's frontmatter `status` and each
|
|
8
|
+
* FR's body `[status]`, not from a live test run. A consumer that wants run-proven coverage feeds
|
|
9
|
+
* `deriveScorecard` its own `proof` set from `verify-acs`; this static readiness view mirrors the
|
|
10
|
+
* existing `scorecard` command.
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
import { readFrontmatter, stripFrontmatter } from './frontmatter.js';
|
|
14
|
+
import { collectScorecardItems, deriveScorecard } from './rtm-scorecard.js';
|
|
15
|
+
import { listSpecs } from './specs.js';
|
|
16
|
+
/** Build the corpus RTM scorecard for `coreFilter` (or all cores). Deterministic (listSpecs
|
|
17
|
+
* order). Specs with no FR/SC requirements are counted in `total` but omitted from `rows`. */
|
|
18
|
+
export function buildRtmScorecard(repoRoot, coreFilter) {
|
|
19
|
+
const specs = listSpecs(repoRoot, coreFilter);
|
|
20
|
+
const rows = [];
|
|
21
|
+
let frTotal = 0;
|
|
22
|
+
let frVerified = 0;
|
|
23
|
+
let scTotal = 0;
|
|
24
|
+
let scMet = 0;
|
|
25
|
+
let specsWithReqs = 0;
|
|
26
|
+
for (const spec of specs) {
|
|
27
|
+
let text = '';
|
|
28
|
+
try {
|
|
29
|
+
text = readFileSync(spec.path, 'utf8');
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
continue; // unreadable — skip
|
|
33
|
+
}
|
|
34
|
+
const fm = readFrontmatter(text);
|
|
35
|
+
const items = collectScorecardItems(stripFrontmatter(text), fm.acceptance_criteria);
|
|
36
|
+
const card = deriveScorecard(items);
|
|
37
|
+
if (card.fr.total === 0 && card.sc.total === 0)
|
|
38
|
+
continue; // nothing to score
|
|
39
|
+
specsWithReqs++;
|
|
40
|
+
frTotal += card.fr.total;
|
|
41
|
+
frVerified += card.fr.verified;
|
|
42
|
+
scTotal += card.sc.total;
|
|
43
|
+
scMet += card.sc.met;
|
|
44
|
+
rows.push({
|
|
45
|
+
id: spec.id,
|
|
46
|
+
core: spec.core,
|
|
47
|
+
fr: {
|
|
48
|
+
total: card.fr.total,
|
|
49
|
+
verified: card.fr.verified,
|
|
50
|
+
unverified: card.fr.rows.filter((r) => !r.verified).map((r) => r.id),
|
|
51
|
+
},
|
|
52
|
+
sc: {
|
|
53
|
+
total: card.sc.total,
|
|
54
|
+
met: card.sc.met,
|
|
55
|
+
unmet: card.sc.rows.filter((r) => !r.met).map((r) => r.id),
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
core: coreFilter ?? 'all',
|
|
61
|
+
total: specs.length,
|
|
62
|
+
specsWithReqs,
|
|
63
|
+
fr: { total: frTotal, verified: frVerified },
|
|
64
|
+
sc: { total: scTotal, met: scMet },
|
|
65
|
+
frVerifiedPct: frTotal === 0 ? 1 : frVerified / frTotal,
|
|
66
|
+
scMetPct: scTotal === 0 ? 1 : scMet / scTotal,
|
|
67
|
+
rows,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=rtm-scorecard-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtm-scorecard-run.js","sourceRoot":"","sources":["../../src/lib/rtm-scorecard-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The FR/SC Requirements-Traceability-Matrix (RTM) scorecard — a NON-VACUOUS coverage
|
|
3
|
+
* derivation folded into the engine from encoreos's repo-local `scripts/specs/verify-acs.mjs`
|
|
4
|
+
* (issue #79). It answers "how much of this spec's Definition of Done (its functional
|
|
5
|
+
* requirements FR-N and success criteria SC-N) is actually proven?" — where "proven" is
|
|
6
|
+
* defined so a coverage-free corpus cannot read 100% (the vacuity guard):
|
|
7
|
+
*
|
|
8
|
+
* - an **FR** is verified iff it has ≥1 covering AC and every covering AC is verified,
|
|
9
|
+
* OR it carries its own proof. An FR with zero covering ACs and no own-proof is NOT
|
|
10
|
+
* verified — that is the property the vacuity guard pins.
|
|
11
|
+
* - an **SC** is met iff it references ≥1 AC, at least one referenced AC is verified,
|
|
12
|
+
* AND every NFR it gates is green. An SC that references no AC is NOT met.
|
|
13
|
+
*
|
|
14
|
+
* PURE (fs-free): it reads a spec's body text + already-parsed `acceptance_criteria`, so it
|
|
15
|
+
* sits on the `/pure` graph and a browser bundle (Spec Studio) can compute the scorecard
|
|
16
|
+
* client-side. The corpus walk + file IO that feed it stay in the command layer. Trace edges
|
|
17
|
+
* (AC→FR via `fr_refs`, SC→AC/NFR via reference parens) mirror the engine's existing model.
|
|
18
|
+
*/
|
|
19
|
+
/** An AC block the scorecard reasons over: its id, terminal status, and the FR/NFR ids it
|
|
20
|
+
* covers (from frontmatter `fr_refs` / `nfr_refs`). Sourced from the parsed frontmatter. */
|
|
21
|
+
export type ScorecardAcBlock = {
|
|
22
|
+
id: string;
|
|
23
|
+
status?: string;
|
|
24
|
+
fr_refs?: string[];
|
|
25
|
+
nfr_refs?: string[];
|
|
26
|
+
};
|
|
27
|
+
/** A body requirement/NFR item (`- **FR-1** [status] …`). */
|
|
28
|
+
export type ScorecardRequirementItem = {
|
|
29
|
+
id: string;
|
|
30
|
+
status: string;
|
|
31
|
+
};
|
|
32
|
+
/** A success criterion parsed from the body, with the ACs/NFRs it traces to. */
|
|
33
|
+
export type SuccessCriterionItem = {
|
|
34
|
+
id: string;
|
|
35
|
+
status: string;
|
|
36
|
+
ac_refs: string[];
|
|
37
|
+
nfr_refs: string[];
|
|
38
|
+
};
|
|
39
|
+
/** Proof accumulated from a verification run: AC/FR ids proven by a passing backing test.
|
|
40
|
+
* Empty ⇒ the scorecard reflects on-disk statuses only (still non-vacuous). */
|
|
41
|
+
export type ScorecardProof = {
|
|
42
|
+
provenAcIds?: Set<string>;
|
|
43
|
+
provenFrIds?: Set<string>;
|
|
44
|
+
};
|
|
45
|
+
export type FrVerdict = {
|
|
46
|
+
verified: boolean;
|
|
47
|
+
reason: string;
|
|
48
|
+
coveringAcs: string[];
|
|
49
|
+
};
|
|
50
|
+
export type ScVerdictResult = {
|
|
51
|
+
met: boolean;
|
|
52
|
+
reason: string;
|
|
53
|
+
};
|
|
54
|
+
export type Scorecard = {
|
|
55
|
+
fr: {
|
|
56
|
+
total: number;
|
|
57
|
+
verified: number;
|
|
58
|
+
rows: Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
} & FrVerdict>;
|
|
61
|
+
};
|
|
62
|
+
sc: {
|
|
63
|
+
total: number;
|
|
64
|
+
met: number;
|
|
65
|
+
rows: Array<{
|
|
66
|
+
id: string;
|
|
67
|
+
} & ScVerdictResult>;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/** Parse a single body line into `{ id, kind: 'US' | 'FR', status }`, or null. US and FR
|
|
71
|
+
* share one list format (`- **FR-1** [verified] …`); FR is first-class verifiable. */
|
|
72
|
+
export declare function matchBodyRequirement(line: string): {
|
|
73
|
+
id: string;
|
|
74
|
+
kind: 'US' | 'FR';
|
|
75
|
+
status: string;
|
|
76
|
+
} | null;
|
|
77
|
+
/** Parse one body line into a success criterion `{ id, status, ac_refs, nfr_refs }`, or null.
|
|
78
|
+
* SC lines carry trailing reference parens — `(US-3, AC-6)`, `(US-1, FR-1, NFR-1)` — from
|
|
79
|
+
* which the AC and NFR ids are scraped (dedup'd). */
|
|
80
|
+
export declare function matchSuccessCriterion(line: string): SuccessCriterionItem | null;
|
|
81
|
+
/** Match a body NFR item (`- **NFR-perf-1** [status] …`) — the gates an SC verdict checks. */
|
|
82
|
+
export declare function matchNfrItem(line: string): ScorecardRequirementItem | null;
|
|
83
|
+
/** Invert the AC→FR trace edges (each AC's `fr_refs`) into `FR id → [covering AC ids]`. */
|
|
84
|
+
export declare function coveringAcsByFr(acBlocks: ScorecardAcBlock[]): Map<string, string[]>;
|
|
85
|
+
/** True if an AC is verified — status `verified` on disk OR proven in this run. */
|
|
86
|
+
export declare function isAcVerified(acId: string, acStatusById: Map<string, string | undefined>, provenAcIds: Set<string>): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* The NON-VACUOUS FR verdict. An FR counts verified iff (a) it has ≥1 covering AC and every
|
|
89
|
+
* covering AC is verified, or (b) the FR itself is proven. Zero covering ACs and no own-proof
|
|
90
|
+
* ⇒ NOT verified (the vacuity guard: a coverage-free corpus cannot read 100%).
|
|
91
|
+
*/
|
|
92
|
+
export declare function frVerdict(opts: {
|
|
93
|
+
coveringAcs?: string[];
|
|
94
|
+
acStatusById: Map<string, string | undefined>;
|
|
95
|
+
provenAcIds: Set<string>;
|
|
96
|
+
frProven?: boolean;
|
|
97
|
+
frVerifiedOnDisk?: boolean;
|
|
98
|
+
}): FrVerdict;
|
|
99
|
+
/**
|
|
100
|
+
* The NON-VACUOUS SC verdict. An SC counts met iff (a) it references ≥1 AC and at least one
|
|
101
|
+
* referenced AC is verified, and (b) every NFR it gates is green. A missing NFR (not in the
|
|
102
|
+
* spec) is ungreen — a dangling gate cannot be assumed satisfied. An SC referencing no AC is
|
|
103
|
+
* NOT met.
|
|
104
|
+
*/
|
|
105
|
+
export declare function scVerdict(sc: SuccessCriterionItem, opts: {
|
|
106
|
+
acStatusById: Map<string, string | undefined>;
|
|
107
|
+
provenAcIds: Set<string>;
|
|
108
|
+
nfrVerifiedById: Map<string, boolean>;
|
|
109
|
+
}): ScVerdictResult;
|
|
110
|
+
/** The items one spec's scorecard reasons over (body-parsed FR/SC/NFR + frontmatter AC blocks). */
|
|
111
|
+
export type ScorecardItems = {
|
|
112
|
+
frItems: ScorecardRequirementItem[];
|
|
113
|
+
acBlocks: ScorecardAcBlock[];
|
|
114
|
+
scItems: SuccessCriterionItem[];
|
|
115
|
+
nfrItems: ScorecardRequirementItem[];
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Collect the scorecard items for one spec from its BODY text (FR/US/NFR/SC list lines) and
|
|
119
|
+
* its already-parsed `acceptance_criteria` frontmatter (AC id/status/fr_refs/nfr_refs). Pure —
|
|
120
|
+
* the caller supplies the body (frontmatter-stripped) and the raw AC array. US items are not
|
|
121
|
+
* scored (they trace via ACs) so they are not returned.
|
|
122
|
+
*/
|
|
123
|
+
export declare function collectScorecardItems(bodyText: string, rawAcs: unknown): ScorecardItems;
|
|
124
|
+
/** Derive the whole FR/SC scorecard for one spec — the single non-vacuous entry point. */
|
|
125
|
+
export declare function deriveScorecard(spec: Partial<ScorecardItems>, proof?: ScorecardProof): Scorecard;
|
|
126
|
+
/** Advisory coverage ratchet floors (warn-level, NEVER fatal): the fraction of FRs that clear
|
|
127
|
+
* the non-vacuous bar and of SCs that are met. Conservative defaults; a consumer overrides via
|
|
128
|
+
* `rtm.ratchets` in `specs/config.yaml`. Kept advisory so a young/low-coverage corpus stays
|
|
129
|
+
* green while a real regression below the floor still surfaces. */
|
|
130
|
+
export declare const COVERAGE_RATCHET_FLOORS: Record<string, number>;
|
|
131
|
+
/** The resolved RTM config: whether the scorecard is enabled + the effective ratchet floors.
|
|
132
|
+
* `resolveRtm` duck-types the config (no fs-bound `SpecConfig` import) so this stays pure. */
|
|
133
|
+
export type RtmConfig = {
|
|
134
|
+
enabled: boolean;
|
|
135
|
+
ratchets: Record<string, number>;
|
|
136
|
+
};
|
|
137
|
+
/** Resolve the opt-in RTM scorecard config; defaults to disabled + the built-in floors, so a
|
|
138
|
+
* repo without an `rtm:` block (or with `enabled` falsy) gets no scorecard. */
|
|
139
|
+
export declare function resolveRtm(config: {
|
|
140
|
+
rtm?: {
|
|
141
|
+
enabled?: boolean;
|
|
142
|
+
ratchets?: Record<string, number>;
|
|
143
|
+
};
|
|
144
|
+
} | null | undefined): RtmConfig;
|
|
145
|
+
/** Compare measured coverage (`{ frVerifiedPct, scMetPct, … }`, each 0–1) against the advisory
|
|
146
|
+
* floors. Returns the breaches (empty ⇒ none). Pure — the caller decides whether to print/warn. */
|
|
147
|
+
export declare function checkCoverageRatchets(measured: Record<string, number>, floors?: Record<string, number>): Array<{
|
|
148
|
+
metric: string;
|
|
149
|
+
floor: number;
|
|
150
|
+
value: number;
|
|
151
|
+
}>;
|