@encore-os/eos-spec 0.3.1 → 0.5.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 (81) hide show
  1. package/dist/commands/audit.js +11 -3
  2. package/dist/commands/audit.js.map +1 -1
  3. package/dist/commands/complete.js +41 -14
  4. package/dist/commands/complete.js.map +1 -1
  5. package/dist/commands/conformance.js +27 -0
  6. package/dist/commands/conformance.js.map +1 -1
  7. package/dist/commands/gen-tests.js +5 -2
  8. package/dist/commands/gen-tests.js.map +1 -1
  9. package/dist/commands/init.js +96 -22
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/next.d.ts +20 -4
  12. package/dist/commands/next.js +53 -15
  13. package/dist/commands/next.js.map +1 -1
  14. package/dist/commands/precedent.d.ts +2 -0
  15. package/dist/commands/precedent.js +12 -3
  16. package/dist/commands/precedent.js.map +1 -1
  17. package/dist/commands/reconcile.d.ts +3 -10
  18. package/dist/commands/reconcile.js +6 -37
  19. package/dist/commands/reconcile.js.map +1 -1
  20. package/dist/commands/signoff.js +33 -5
  21. package/dist/commands/signoff.js.map +1 -1
  22. package/dist/commands/verify-acs.js +7 -4
  23. package/dist/commands/verify-acs.js.map +1 -1
  24. package/dist/index.d.ts +3 -2
  25. package/dist/index.js +15 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/code-evidence.js +2 -1
  28. package/dist/lib/code-evidence.js.map +1 -1
  29. package/dist/lib/coherence.d.ts +2 -2
  30. package/dist/lib/coherence.js +7 -6
  31. package/dist/lib/coherence.js.map +1 -1
  32. package/dist/lib/config.d.ts +34 -2
  33. package/dist/lib/config.js +45 -3
  34. package/dist/lib/config.js.map +1 -1
  35. package/dist/lib/discovery-defaults.d.ts +20 -0
  36. package/dist/lib/discovery-defaults.js +21 -0
  37. package/dist/lib/discovery-defaults.js.map +1 -0
  38. package/dist/lib/embedding-store.d.ts +0 -2
  39. package/dist/lib/embedding-store.js +1 -1
  40. package/dist/lib/embedding-store.js.map +1 -1
  41. package/dist/lib/exec.d.ts +0 -2
  42. package/dist/lib/exec.js +1 -12
  43. package/dist/lib/exec.js.map +1 -1
  44. package/dist/lib/frontmatter.d.ts +5 -1
  45. package/dist/lib/frontmatter.js.map +1 -1
  46. package/dist/lib/migration-collision.d.ts +5 -4
  47. package/dist/lib/migration-collision.js +8 -6
  48. package/dist/lib/migration-collision.js.map +1 -1
  49. package/dist/lib/next-action.d.ts +19 -2
  50. package/dist/lib/next-action.js +28 -6
  51. package/dist/lib/next-action.js.map +1 -1
  52. package/dist/lib/ollama-embed.d.ts +0 -9
  53. package/dist/lib/ollama-embed.js +0 -35
  54. package/dist/lib/ollama-embed.js.map +1 -1
  55. package/dist/lib/pipeline-config.js +40 -2
  56. package/dist/lib/pipeline-config.js.map +1 -1
  57. package/dist/lib/pipeline-map.d.ts +30 -0
  58. package/dist/lib/pipeline-map.js +86 -5
  59. package/dist/lib/pipeline-map.js.map +1 -1
  60. package/dist/lib/pipeline-schema.d.ts +25 -1
  61. package/dist/lib/pipeline-schema.js +3 -0
  62. package/dist/lib/pipeline-schema.js.map +1 -1
  63. package/dist/lib/predicate-registry.js +28 -1
  64. package/dist/lib/predicate-registry.js.map +1 -1
  65. package/dist/lib/reconcile-core.d.ts +26 -0
  66. package/dist/lib/reconcile-core.js +43 -0
  67. package/dist/lib/reconcile-core.js.map +1 -0
  68. package/dist/lib/scaffold-templates.d.ts +30 -0
  69. package/dist/lib/scaffold-templates.js +203 -0
  70. package/dist/lib/scaffold-templates.js.map +1 -0
  71. package/dist/lib/spec-pure.js +44 -1
  72. package/dist/lib/spec-pure.js.map +1 -1
  73. package/dist/lib/specs.d.ts +17 -0
  74. package/dist/lib/specs.js.map +1 -1
  75. package/dist/lib/test-generator.d.ts +1 -1
  76. package/dist/lib/test-generator.js +3 -2
  77. package/dist/lib/test-generator.js.map +1 -1
  78. package/dist/lib/verifies-scan.d.ts +5 -1
  79. package/dist/lib/verifies-scan.js +9 -3
  80. package/dist/lib/verifies-scan.js.map +1 -1
  81. package/package.json +4 -4
@@ -23,9 +23,17 @@ export function buildAuditRow(spec, backlinkedIds) {
23
23
  const backlinked = backlinkedIds.size > 0 ? '✅' : '❌';
24
24
  const e2eListed = spec.signals.hasGeneratedTests ? '✅' : '❌';
25
25
  const prodReady = acValidated === '✅' && e2eListed === '✅' ? '✅' : '❌';
26
- const note = handClosedUnbacked
27
- ? `${ac.handClosed} hand_closed AC(s) without a "## Verification" section`
28
- : undefined;
26
+ const notes = [];
27
+ if (handClosedUnbacked)
28
+ notes.push(`${ac.handClosed} hand_closed AC(s) without a "## Verification" section`);
29
+ // WEB-51 (warn-first): a UI-bearing spec at a done status should carry a `proof:`
30
+ // demo-proof artifact (a recorded walkthrough). Surfaced as a note; does NOT gate
31
+ // prodReady — a later change can promote this to a hard gate for UI specs.
32
+ const isDone = spec.status === 'complete' || spec.status === 'implemented';
33
+ if (isDone && spec.signals.isUiBearing && !spec.signals.hasProofArtifact) {
34
+ notes.push('UI spec at a done status with no demo proof (`proof:` artifact) — record one via the demo lane (WEB-51)');
35
+ }
36
+ const note = notes.length > 0 ? notes.join('; ') : undefined;
29
37
  return {
30
38
  id: spec.id,
31
39
  status: spec.status ?? 'unknown',
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAgBvD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,aAA0B;IACtE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC5F,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC;IACrE,iFAAiF;IACjF,mFAAmF;IACnF,MAAM,kBAAkB,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACrF,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC;IAClD,MAAM,WAAW,GAAc,WAAW,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,MAAM,UAAU,GAAc,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACjE,MAAM,SAAS,GAAc,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACxE,MAAM,SAAS,GAAc,WAAW,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAClF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,kBAAkB;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,wDAAwD,CAAC,CAAC;IAC7G,kFAAkF;IAClF,kFAAkF;IAClF,2EAA2E;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC;IAC3E,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACzE,KAAK,CAAC,IAAI,CACR,yGAAyG,CAC1G,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;QAChC,WAAW;QACX,UAAU;QACV,SAAS;QACT,SAAS;QACT,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAY;IAC7D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,4EAA4E;QAC5E,0EAA0E;QAC1E,uDAAuD;QACvD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,IAAe;IACrC,MAAM,KAAK,GAAa;QACtB,gCAAgC;QAChC,EAAE;QACF,aAAa,IAAI,CAAC,IAAI,mHAAmH;QACzI,EAAE;KACH,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CACR,MAAM,IAAI,EAAE,EACZ,EAAE,EACF,yEAAyE,EACzE,yEAAyE,CAC1E,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;QACjH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,UAAU;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CACV,oKAAoK,CACrK;SACA,MAAM,CACL,SAAS,EACT,uGAAuG,EACvG,KAAK,CACN;SACA,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,iBAAiB,CAAC,QAAQ,CAAC;gBAC7B,IAAI,CAAC,MAAM,EAAE;oBACX,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,EAAE;oBACR,IAAI,EAAE,6FAA6F;oBACnG,QAAQ,EAAE,CAAC;iBACZ,CAAC,CAAC;YACL,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC7C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,sBAAsB,CAAC,CAAC;YACrD,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,gBAAgB,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { archiveSpec } from '../lib/archive.js';
2
2
  import { evaluateCoherence } from '../lib/coherence.js';
3
+ import { resolveDiscoveryPaths } from '../lib/config.js';
3
4
  import { uiEvidenceGate } from '../lib/completion-gate.js';
4
5
  import { loadEnforcementAllowlist } from '../lib/enforcement-allowlist.js';
5
6
  import { runScript } from '../lib/exec.js';
@@ -17,29 +18,54 @@ export function registerComplete(program) {
17
18
  .option('--include-deferred', 'Include deferred items in audit', false)
18
19
  .option('--archive', 'After audit passes, move spec/plan/tasks to specs/{core}/archive/', false)
19
20
  .option('--strict', 'Fail when coherence warnings are present', false)
20
- .option('--no-ui-gate', 'Skip the UI-evidence completion check (docshots + heal sign-off)')
21
- .option('--signoff', 'Acknowledge the UI-evidence gate (equivalent to --no-ui-gate for this run)', false)
21
+ .option('--enforce', 'BLOCK completion (non-zero exit) when a UI-bearing spec lacks docshots + heal sign-off; only a dated `ui-gate-waived` marker escapes (--no-ui-gate/--signoff do NOT bypass under --enforce)', false)
22
+ .option('--no-ui-gate', 'Skip the UI-evidence completion WARNING (ignored under --enforce)')
23
+ .option('--signoff', 'Acknowledge the UI-evidence warning (equivalent to --no-ui-gate for this run; ignored under --enforce)', false)
22
24
  .action(async (options, cmd) => {
23
25
  const global = getGlobalOptions(cmd);
24
26
  const repoRoot = getRepoRoot(global.repoRoot);
25
- // C1 inline UI-evidence gate: warn at completion time when a UI-bearing
26
- // spec lacks docshots + a heal sign-off. Warn-first (never refuses) the
27
- // non-bypassable enforcement is the corpus invariant (spec:registry:check).
28
- // commander maps `--no-ui-gate` to options.uiGate === false.
29
- if (options.spec && options.uiGate !== false && !options.signoff) {
27
+ // Phase 2 (Finding B item 1): the UI-evidence gate. A UI-bearing spec must carry
28
+ // docshots + a heal sign-off (or a dated `ui-gate-waived` marker) to complete.
29
+ // DEFAULT (no --enforce): WARN-only, back-compat. `--no-ui-gate`/`--signoff`
30
+ // suppress the warning. (commander maps `--no-ui-gate` to options.uiGate === false.)
31
+ // • --enforce: BLOCK emit the error path with a non-zero exit and DO NOT run
32
+ // the audit/registry write. The blanket `--no-ui-gate`/`--signoff` bypass is
33
+ // INTENTIONALLY ignored; the ONLY escape is a dated `ui-gate-waived` marker,
34
+ // which `uiEvidenceGate` already honors via the hasUiGateWaiver short-circuit.
35
+ // • The `!isUiBearing` short-circuit is preserved inside uiEvidenceGate, so
36
+ // backend/data specs always pass — even under --enforce.
37
+ if (options.spec && (options.enforce || (options.uiGate !== false && !options.signoff))) {
38
+ let verdictReason = null;
30
39
  try {
31
40
  const spec = findSpec(repoRoot, String(options.spec));
32
41
  if (spec) {
33
42
  const verdict = uiEvidenceGate(spec);
34
- if (!verdict.ok) {
35
- const allow = loadEnforcementAllowlist(repoRoot);
36
- const blocked = allow.block.includes(spec.core);
37
- emitContinuing(global, `complete: ui-evidence ${blocked ? 'GATE' : 'warning'} — ${verdict.reason}`);
38
- }
43
+ if (!verdict.ok)
44
+ verdictReason = verdict.reason;
39
45
  }
40
46
  }
41
47
  catch {
42
- // fail-open: a gate must never make `complete` unusable.
48
+ // fail-open ONLY in warn mode: a gate must never make a non-enforced
49
+ // `complete` unusable. Under --enforce a lookup failure leaves verdictReason
50
+ // null (we cannot prove a violation), so it does not spuriously block.
51
+ }
52
+ if (verdictReason) {
53
+ if (options.enforce) {
54
+ emit(global, {
55
+ ok: false,
56
+ error: {
57
+ code: ErrorCode.VALIDATION_FAILED,
58
+ message: `complete: ui-evidence gate failed — ${verdictReason}`,
59
+ },
60
+ data: { uiEvidence: { ok: false, reason: verdictReason } },
61
+ text: `complete: BLOCKED by --enforce — ${verdictReason}`,
62
+ exitCode: 1,
63
+ });
64
+ return;
65
+ }
66
+ const allow = loadEnforcementAllowlist(repoRoot);
67
+ const blocked = allow.block.includes(String(options.spec).toUpperCase().split('-')[0]?.toLowerCase() ?? '');
68
+ emitContinuing(global, `complete: ui-evidence ${blocked ? 'GATE' : 'warning'} — ${verdictReason}`);
43
69
  }
44
70
  }
45
71
  const args = ['node', 'scripts/audit/audit-spec-completion.js'];
@@ -65,7 +91,8 @@ export function registerComplete(program) {
65
91
  if (ok && options.spec) {
66
92
  const core = String(options.spec).toUpperCase().split('-')[0]?.toLowerCase();
67
93
  if (core) {
68
- const coherence = evaluateCoherence(repoRoot, String(options.spec).toUpperCase(), core);
94
+ const { migrationsDir } = resolveDiscoveryPaths(repoRoot, global.config);
95
+ const coherence = evaluateCoherence(repoRoot, String(options.spec).toUpperCase(), core, migrationsDir);
69
96
  coherenceWarnings = coherence.warnings.map((w) => w.message);
70
97
  if (coherenceWarnings.length > 0 && !global.json && !global.quiet) {
71
98
  emitContinuing(global, `complete: coherence warnings (${coherenceWarnings.length})`);
@@ -1 +1 @@
1
- {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"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"}
@@ -99,6 +99,33 @@ export function runConformanceChecks() {
99
99
  }
100
100
  return `${cases.length} stage decisions correct (stub→tasks_generated + regulated honest-cap)`;
101
101
  });
102
+ // Issue #12 — the encoreos healthcare-domain divergences folded into the engine,
103
+ // config-driven. Proven against the PUBLISHED artifact so a consumer-adoption /
104
+ // pack-smoke run catches a regression in either fold.
105
+ guard('navigator:compliance-gating', () => {
106
+ const e1 = buildPipeline(ENCORE1_PIPELINE_SCHEMA, DEFAULT_PREDICATES);
107
+ // A PHI-bearing spec in a NON-regulated core (#1372): the compliance gate applies.
108
+ const phi = navSpec('fw', '---\nid: XX-1\ncore: fw\ntags:\n - phi\n---\n<!-- validated: 2026-01-01 -->\n<!-- spec-reviewed: 2026-01-01 -->\n');
109
+ if (!phi.signals.isSensitive)
110
+ throw new Error('expected PHI-tagged fw spec to be sensitive');
111
+ if (e1.computeStage(phi) !== 'reviewed') {
112
+ throw new Error(`PHI-bearing fw spec should hold at reviewed pending compliance, got ${e1.computeStage(phi)}`);
113
+ }
114
+ // Builder has no compliance stage — the widening cannot leak into it.
115
+ if (BUILDER_PIPELINE_SCHEMA.statusOrder.includes('compliance_reviewed')) {
116
+ throw new Error('builder layout must not carry a compliance_reviewed status');
117
+ }
118
+ return 'compliance gate widened to PHI-bearing (encore1), builder layout has no compliance stage';
119
+ });
120
+ guard('navigator:supersession', () => {
121
+ const e1 = buildPipeline(ENCORE1_PIPELINE_SCHEMA, DEFAULT_PREDICATES);
122
+ if (!e1.supersedeSoftGates)
123
+ throw new Error('encore1 layout should set supersedeSoftGates');
124
+ if (buildPipeline(BUILDER_PIPELINE_SCHEMA, DEFAULT_PREDICATES).supersedeSoftGates) {
125
+ throw new Error('builder layout must not supersede soft gates');
126
+ }
127
+ return 'encore1 supersedes soft gates (#1593); builder does not';
128
+ });
102
129
  return checks;
103
130
  }
104
131
  export function registerConformance(program) {
@@ -1 +1 @@
1
- {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/commands/conformance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/commands/conformance.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { dirname, join } from 'node:path';
3
+ import { resolveDiscoveryPaths } from '../lib/config.js';
4
+ import { DEFAULT_GENERATED_TESTS_DIR } from '../lib/discovery-defaults.js';
3
5
  import { readFrontmatter, setE2eTests } from '../lib/frontmatter.js';
4
6
  import { emit, getGlobalOptions } from '../lib/output.js';
5
7
  import { normalizeAcceptanceCriteria } from '../lib/requirements.js';
@@ -11,7 +13,7 @@ export function registerGenTests(program) {
11
13
  .command('gen-tests')
12
14
  .description('Generate a fixme-gated test skeleton (@verifies-stamped) from a spec’s acceptance_criteria. Dry-run unless --write.')
13
15
  .requiredOption('--spec <id>', 'Spec id, e.g. WEB-05')
14
- .option('--write', 'Write the generated file under e2e/generated/', false)
16
+ .option('--write', `Write the generated file under ${DEFAULT_GENERATED_TESTS_DIR}/`, false)
15
17
  .option('--update-frontmatter', 'Also add the generated path to the spec’s e2e_tests:', false)
16
18
  .option('--lane <lane>', 'Override the ui|integration heuristic')
17
19
  .action((options, cmd) => {
@@ -24,7 +26,8 @@ export function registerGenTests(program) {
24
26
  const fm = readFrontmatter(specText);
25
27
  const { acs } = normalizeAcceptanceCriteria(fm.acceptance_criteria);
26
28
  const lane = options.lane === 'ui' || options.lane === 'integration' ? options.lane : classifyLane(acs);
27
- const rel = generatedRelPath(spec.id, lane);
29
+ const { generatedTestsDir } = resolveDiscoveryPaths(repoRoot, global.config);
30
+ const rel = generatedRelPath(spec.id, lane, generatedTestsDir);
28
31
  const content = generateTestContent(spec.id, spec.title ?? spec.id, acs, lane);
29
32
  if (!options.write)
30
33
  emit(global, {
@@ -1 +1 @@
1
- {"version":3,"file":"gen-tests.js","sourceRoot":"","sources":["../../src/commands/gen-tests.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gen-tests.js","sourceRoot":"","sources":["../../src/commands/gen-tests.ts"],"names":[],"mappings":"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"}
@@ -1,33 +1,39 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { loadConfig } from '../lib/config.js';
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { loadConfig, resetConfigCache } from '../lib/config.js';
4
4
  import { runScript } from '../lib/exec.js';
5
5
  import { emit, emitContinuing, getGlobalOptions } from '../lib/output.js';
6
6
  import { getRepoRoot } from '../lib/repo.js';
7
+ import { defaultConfigYaml, SCAFFOLD_CONFIG_PATH, SCAFFOLD_TEMPLATE_FILES } from '../lib/scaffold-templates.js';
8
+ /** Templates required when no config is present yet (the config-driven list can't be
9
+ * read). Mirrors the spec/plan/tasks templates `create` resolves. */
10
+ const FALLBACK_TEMPLATES = [
11
+ 'specs/_templates/SPEC_TEMPLATE.md',
12
+ 'specs/_templates/SPEC_TEMPLATE_LITE.md',
13
+ 'specs/_templates/PLAN_TEMPLATE.md',
14
+ 'specs/_templates/TASKS_TEMPLATE.md',
15
+ ];
7
16
  export function registerInit(program) {
8
17
  program
9
18
  .command('init')
10
- .description('Verify spec workflow is set up: required directories, scripts, and templates exist.')
11
- .action(async (_options, cmd) => {
19
+ .description('Verify the spec workflow layout (config + templates + per-core dirs); with --scaffold, create whatever is missing.')
20
+ .option('--scaffold', 'Create any missing config.yaml, templates, and per-core dirs (never overwrites an existing file; idempotent).', false)
21
+ .action(async (options, cmd) => {
12
22
  const global = getGlobalOptions(cmd);
13
23
  const repoRoot = getRepoRoot(global.repoRoot);
14
- const required = [
15
- 'specs/SPEC_STATUS_REGISTRY.md',
16
- 'scripts/audit/audit-spec-completion.js',
17
- 'scripts/specs/sync-deferred-dashboard.ts',
18
- 'specs/_templates/SPEC_GUIDE.md',
19
- 'specs/_templates/TEMPLATE_INDEX.md',
20
- ];
21
- try {
22
- const config = loadConfig(repoRoot, global.config);
23
- const templatePaths = flattenTemplatePaths(config.templates);
24
- required.push(...templatePaths);
25
- }
26
- catch {
27
- required.push('specs/_templates/SPEC_TEMPLATE.md', 'specs/_templates/SPEC_TEMPLATE_LITE.md', 'specs/_templates/PLAN_TEMPLATE.md', 'specs/_templates/TASKS_TEMPLATE.md');
24
+ if (options.scaffold) {
25
+ const { created, skipped } = scaffoldLayout(repoRoot, global.config);
26
+ emit(global, {
27
+ ok: true,
28
+ data: { repoRoot, created, skipped },
29
+ text: created.length === 0
30
+ ? `init: layout already present (${repoRoot}) — nothing scaffolded`
31
+ : `init: scaffolded ${created.length} item(s)\n${created.map((c) => ` + ${c}`).join('\n')}${skipped.length ? `\n (${skipped.length} already present, left untouched)` : ''}`,
32
+ });
33
+ return;
28
34
  }
29
- const unique = [...new Set(required)];
30
- const missing = unique.filter((p) => !existsSync(join(repoRoot, p)));
35
+ const required = requiredLayout(repoRoot, global.config);
36
+ const missing = required.filter((p) => !existsSync(join(repoRoot, p)));
31
37
  if (missing.length === 0) {
32
38
  const git = runScript(['git', 'rev-parse', '--show-toplevel'], repoRoot);
33
39
  if (git.exitCode !== 0) {
@@ -43,12 +49,80 @@ export function registerInit(program) {
43
49
  text: `init: spec workflow ready (${repoRoot})`,
44
50
  });
45
51
  }
46
- emitContinuing(global, 'init: missing required files:');
52
+ emitContinuing(global, 'init: missing required files (run `eos-spec init --scaffold` to create them):');
47
53
  for (const m of missing)
48
54
  emitContinuing(global, ` - ${m}`);
49
55
  emit(global, { ok: false, data: { repoRoot, missing }, exitCode: 1 });
50
56
  });
51
57
  }
58
+ /**
59
+ * The portable required layout: `specs/config.yaml` + the template files the config
60
+ * declares (or the fallback set when no config is present yet). Consumer-specific
61
+ * artifacts (e.g. `SPEC_STATUS_REGISTRY.md`, a repo's audit scripts) are intentionally
62
+ * NOT required — the published engine is consumer-agnostic (TOOL-03 AC-5), so `init`
63
+ * passes on any repo carrying the portable convention.
64
+ */
65
+ function requiredLayout(repoRoot, configOverride) {
66
+ const required = [SCAFFOLD_CONFIG_PATH];
67
+ try {
68
+ const config = loadConfig(repoRoot, configOverride);
69
+ required.push(...flattenTemplatePaths(config.templates));
70
+ }
71
+ catch {
72
+ required.push(...FALLBACK_TEMPLATES);
73
+ }
74
+ return [...new Set(required)];
75
+ }
76
+ /**
77
+ * Scaffold-when-missing: write the default config, the template bodies, and the
78
+ * per-core directories, creating only what is absent. Never clobbers an existing
79
+ * file and is idempotent (a second run produces all-skipped).
80
+ */
81
+ function scaffoldLayout(repoRoot, configOverride) {
82
+ const created = [];
83
+ const skipped = [];
84
+ // 1. config.yaml — only the canonical location is scaffolded.
85
+ const today = new Date().toISOString().slice(0, 10);
86
+ writeFileIfMissing(repoRoot, SCAFFOLD_CONFIG_PATH, defaultConfigYaml(today), created, skipped);
87
+ // 2. template bodies (verbatim — their {{ID}}… placeholders are for `create`).
88
+ for (const t of SCAFFOLD_TEMPLATE_FILES) {
89
+ writeFileIfMissing(repoRoot, t.rel, t.content, created, skipped);
90
+ }
91
+ // 3. per-core dirs — read whichever config now exists (we just ensured one does).
92
+ try {
93
+ resetConfigCache();
94
+ const config = loadConfig(repoRoot, configOverride);
95
+ const { specs, plans, tasks } = config.paths;
96
+ for (const core of config.cores) {
97
+ for (const sub of [specs, plans, tasks]) {
98
+ mkdirIfMissing(repoRoot, join('specs', core.id, sub), created, skipped);
99
+ }
100
+ }
101
+ }
102
+ catch {
103
+ // Config unreadable (should not happen — we just wrote a valid one). Skip dirs.
104
+ }
105
+ return { created, skipped };
106
+ }
107
+ function writeFileIfMissing(repoRoot, rel, content, created, skipped) {
108
+ const abs = join(repoRoot, rel);
109
+ if (existsSync(abs)) {
110
+ skipped.push(rel);
111
+ return;
112
+ }
113
+ mkdirSync(dirname(abs), { recursive: true });
114
+ writeFileSync(abs, content, 'utf8');
115
+ created.push(rel);
116
+ }
117
+ function mkdirIfMissing(repoRoot, rel, created, skipped) {
118
+ const abs = join(repoRoot, rel);
119
+ if (existsSync(abs)) {
120
+ skipped.push(`${rel}/`);
121
+ return;
122
+ }
123
+ mkdirSync(abs, { recursive: true });
124
+ created.push(`${rel}/`);
125
+ }
52
126
  function flattenTemplatePaths(templates) {
53
127
  const paths = [];
54
128
  for (const val of Object.values(templates)) {
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,10 @@ import { type BlockerRef, type Readiness } from '../lib/blockers.js';
3
3
  import { type ActorType } from '../lib/pipeline-map.js';
4
4
  import { type SessionState } from '../lib/session-state.js';
5
5
  import { type SpecFile } from '../lib/specs.js';
6
+ /** Build an advisory when an early-stage spec references tables that already exist
7
+ * in a migration — the signal that it may duplicate an existing feature. Exported
8
+ * for direct unit coverage of the early-stage gate + formatting. */
9
+ export declare function landscapeAdvisory(repoRoot: string, spec: SpecFile, migrationsRelDir?: string): string;
6
10
  export type NextAction = {
7
11
  type: string;
8
12
  specId: string;
@@ -11,14 +15,25 @@ export type NextAction = {
11
15
  actorType: ActorType;
12
16
  invocation: string;
13
17
  optional?: boolean;
18
+ /** Phase 1: a strictOnly parity gate (Finding A) is unmet under `next --strict` —
19
+ * rendered as a BLOCKING action (the gate must be satisfied before advancing).
20
+ * Only ever set when the navigator was invoked with `{ strict: true }`. */
21
+ blocking?: boolean;
14
22
  /** Disagreement between pipeline_status and on-disk artifacts, if any. */
15
23
  note?: string;
16
24
  /** Set for the implement/complete tail. */
17
25
  taskHint?: string;
18
26
  };
27
+ /** Options that shape the navigator recommendation. `strict` opts the Phase 1
28
+ * parity gates (Finding A: research-before-review, revalidate-after-review,
29
+ * compliance-for-sensitive) into the walk as BLOCKING; default keeps the bare-CLI
30
+ * behavior unchanged (those `strictOnly` stages are skipped). */
31
+ export type RecommendOptions = {
32
+ strict?: boolean;
33
+ };
19
34
  /** Disagreement between later artifacts and the first incomplete required gate
20
- * (e.g. tasks exist but validate-spec was never run). Optional and not-applicable
21
- * transitions never count, so only real out-of-order gaps are flagged. */
35
+ * (e.g. tasks exist but validate-spec was never run). Optional, strictOnly, and
36
+ * not-applicable transitions never count, so only real out-of-order gaps are flagged. */
22
37
  export declare function computeOutOfOrder(spec: SpecFile): string | undefined;
23
38
  /** Human-output blocker lines for `next --spec`: open blockers and unresolvable
24
39
  * (likely typo'd) blocked_by references. Cleared (complete) blockers are omitted. */
@@ -39,8 +54,9 @@ export declare function pickCorePick(repoRoot: string, ordered: Readiness[], opt
39
54
  }): Readiness | null;
40
55
  export declare function registerNext(program: Command): void;
41
56
  /** Walk the SSOT pipeline; return the first applicable, not-done transition, else the implement/complete tail.
42
- * An active session (STATE.md) on this spec short-circuits to resuming the in-progress task. */
43
- export declare function recommendAction(spec: SpecFile, session?: SessionState | null, repoRoot?: string): NextAction;
57
+ * An active session (STATE.md) on this spec short-circuits to resuming the in-progress task.
58
+ * `opts.strict` opts the Phase 1 `strictOnly` parity gates into the walk as BLOCKING. */
59
+ export declare function recommendAction(spec: SpecFile, session?: SessionState | null, repoRoot?: string, opts?: RecommendOptions): NextAction;
44
60
  /** True when TASKS.md carries at least one status marker we know how to read —
45
61
  * a GitHub checkbox (`[ ]`/`[x]`) or a ballot-box glyph (☐/☑/☒). Used to
46
62
  * distinguish "genuinely all complete" from "format we cannot parse". */