@encore-os/eos-spec 0.8.0 → 0.9.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.d.ts +2 -0
- package/dist/commands/close-out.js +167 -0
- package/dist/commands/close-out.js.map +1 -0
- package/dist/commands/conformance.js +20 -1
- package/dist/commands/conformance.js.map +1 -1
- package/dist/commands/metrics.js +15 -0
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/run.d.ts +10 -0
- package/dist/commands/run.js +230 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.js +46 -7
- package/dist/commands/validate.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/ai-call.d.ts +12 -0
- package/dist/lib/ai-call.js +6 -0
- package/dist/lib/ai-call.js.map +1 -1
- package/dist/lib/closeout-core.d.ts +46 -0
- package/dist/lib/closeout-core.js +34 -0
- package/dist/lib/closeout-core.js.map +1 -0
- package/dist/lib/closeout-predicate.d.ts +36 -0
- package/dist/lib/closeout-predicate.js +130 -0
- package/dist/lib/closeout-predicate.js.map +1 -0
- package/dist/lib/cost.js +7 -0
- package/dist/lib/cost.js.map +1 -1
- package/dist/lib/events.d.ts +11 -0
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/frontmatter.d.ts +22 -0
- package/dist/lib/frontmatter.js +37 -0
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/gate-executor.d.ts +80 -0
- package/dist/lib/gate-executor.js +311 -0
- package/dist/lib/gate-executor.js.map +1 -0
- package/dist/lib/llm-health.d.ts +28 -0
- package/dist/lib/llm-health.js +46 -0
- package/dist/lib/llm-health.js.map +1 -0
- package/dist/lib/metrics.d.ts +26 -0
- package/dist/lib/metrics.js +35 -0
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/next-action.d.ts +10 -4
- package/dist/lib/next-action.js +10 -4
- package/dist/lib/next-action.js.map +1 -1
- package/dist/lib/ollama-embed.d.ts +5 -0
- package/dist/lib/ollama-embed.js +5 -0
- package/dist/lib/ollama-embed.js.map +1 -1
- package/dist/lib/output.d.ts +3 -0
- package/dist/lib/output.js +3 -0
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/pipeline-config.js +10 -0
- package/dist/lib/pipeline-config.js.map +1 -1
- package/dist/lib/pipeline-map.js +9 -0
- package/dist/lib/pipeline-map.js.map +1 -1
- package/dist/lib/predicate-registry.js +7 -0
- package/dist/lib/predicate-registry.js.map +1 -1
- package/dist/lib/run-pipeline.d.ts +118 -0
- package/dist/lib/run-pipeline.js +106 -0
- package/dist/lib/run-pipeline.js.map +1 -0
- package/dist/lib/spec-pure.d.ts +69 -4
- package/dist/lib/spec-pure.js +125 -15
- package/dist/lib/spec-pure.js.map +1 -1
- package/dist/lib/specs.d.ts +3 -3
- package/dist/lib/specs.js +43 -20
- package/dist/lib/specs.js.map +1 -1
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { closeOutSpec } from '../lib/closeout-core.js';
|
|
2
|
+
import { DEFAULT_CLOSEABLE_AC_STATUSES } from '../lib/closeout-predicate.js';
|
|
3
|
+
import { loadConfig } from '../lib/config.js';
|
|
4
|
+
import { logEvent } from '../lib/events.js';
|
|
5
|
+
import { runScript } from '../lib/exec.js';
|
|
6
|
+
import { ErrorCode, emit, emitContinuing, getGlobalOptions } from '../lib/output.js';
|
|
7
|
+
import { getRepoRoot, isProtectedBranch } from '../lib/repo.js';
|
|
8
|
+
import { listSpecs } from '../lib/specs.js';
|
|
9
|
+
import { withEventLog } from '../lib/with-event-log.js';
|
|
10
|
+
/**
|
|
11
|
+
* `close-out` — the terminal complement to `run` (TOOL-06 / issue #29). `run` drives a
|
|
12
|
+
* spec TO `tasks_generated` and halts before implement/mark-complete; `close-out` is the
|
|
13
|
+
* explicit resume verb the navigator's mark-complete action points at: it composes
|
|
14
|
+
* reconcile -> verify-acs gate -> complete behind the CONSERVATIVE `decideCloseout`
|
|
15
|
+
* predicate and OWNS the verified `status:` -> complete write IN THE ENGINE
|
|
16
|
+
* (docs/adr/0001-engine-owns-verified-close-out-status-promotion.md), so every consumer
|
|
17
|
+
* drives ship->done with one command.
|
|
18
|
+
*
|
|
19
|
+
* Writes by default (it is the deliberate "ship it" verb); `--dry-run` previews the
|
|
20
|
+
* intended promotion without touching any file. Like `verify-acs`/`reconcile` it refuses
|
|
21
|
+
* to write on a protected branch. `--update-registry` is an explicit, opt-in delegation
|
|
22
|
+
* to a consumer audit script (the engine still owns the status write itself).
|
|
23
|
+
*/
|
|
24
|
+
/** Resolve the closeable AC vocabulary from the consuming repo's config. The builder /
|
|
25
|
+
* Switchboard layout closes on `verified` OR `hand_closed`; encoreos's binary model (the
|
|
26
|
+
* default) closes on `verified` only. Fail-safe to the default when config is absent. */
|
|
27
|
+
function closeableStatusesFromConfig(repoRoot, configOverride) {
|
|
28
|
+
try {
|
|
29
|
+
const config = loadConfig(repoRoot, configOverride);
|
|
30
|
+
if (config.pipeline?.layout === 'builder')
|
|
31
|
+
return ['verified', 'hand_closed'];
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// No/!parseable config => the conservative encoreos default below.
|
|
35
|
+
}
|
|
36
|
+
return DEFAULT_CLOSEABLE_AC_STATUSES;
|
|
37
|
+
}
|
|
38
|
+
export function registerCloseOut(program) {
|
|
39
|
+
program
|
|
40
|
+
.command('close-out')
|
|
41
|
+
.description('Verified close-out: reconcile -> AC gate -> complete behind a conservative predicate; promotes status: -> complete only when every AC is verified and the spec is at tasks_generated. Writes by default; --dry-run previews.')
|
|
42
|
+
.option('--spec <id>', 'Single spec id (e.g. LO-50)')
|
|
43
|
+
.option('--core <core>', 'Limit to one core')
|
|
44
|
+
.option('--all', 'All specs across all cores', false)
|
|
45
|
+
.option('--update-registry', 'After the engine writes status, also notify the consumer audit script (scripts/audit/audit-spec-completion.js) — explicit opt-in delegation', false)
|
|
46
|
+
.option('--dry-run', 'Preview the intended promotion without writing any file', false)
|
|
47
|
+
.action(withEventLog('close-out', async (options, cmd) => {
|
|
48
|
+
const global = getGlobalOptions(cmd);
|
|
49
|
+
const repoRoot = getRepoRoot(global.repoRoot);
|
|
50
|
+
// A scope is mandatory: close-out mutates tracked files, so a bare invocation
|
|
51
|
+
// (which would sweep the whole corpus) is rejected — mirrors `reconcile --write`.
|
|
52
|
+
if (!options.spec && !options.core && !options.all) {
|
|
53
|
+
emit(global, {
|
|
54
|
+
ok: false,
|
|
55
|
+
error: {
|
|
56
|
+
code: ErrorCode.SCOPE_REQUIRED,
|
|
57
|
+
message: 'close-out requires a scope — pass --spec <id>, --core <core>, or --all',
|
|
58
|
+
},
|
|
59
|
+
text: 'close-out: requires --spec <id>, --core <core>, or --all (refusing a corpus-wide close-out)',
|
|
60
|
+
exitCode: 2,
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const write = !options.dryRun;
|
|
65
|
+
// Refuse to write on a protected branch (parity with verify-acs --write): the
|
|
66
|
+
// verified close-out lands on a feature branch, never directly on main/master.
|
|
67
|
+
if (write && isProtectedBranch(repoRoot)) {
|
|
68
|
+
emit(global, {
|
|
69
|
+
ok: false,
|
|
70
|
+
error: {
|
|
71
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
72
|
+
message: 'close-out: refusing to write on a protected branch (main/master); run on a feature branch or pass --dry-run',
|
|
73
|
+
},
|
|
74
|
+
text: 'close-out: refusing to write status on a protected branch (main/master); use a feature branch or --dry-run',
|
|
75
|
+
exitCode: 2,
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const closeableStatuses = closeableStatusesFromConfig(repoRoot, global.config);
|
|
80
|
+
// Resolve the scope. --spec wins; otherwise --core (or --all) selects the set.
|
|
81
|
+
let specs = listSpecs(repoRoot, options.core);
|
|
82
|
+
if (options.spec) {
|
|
83
|
+
specs = specs.filter((s) => s.id.toUpperCase() === String(options.spec).toUpperCase());
|
|
84
|
+
}
|
|
85
|
+
if (options.spec && specs.length === 0) {
|
|
86
|
+
emit(global, {
|
|
87
|
+
ok: false,
|
|
88
|
+
error: { code: ErrorCode.SPEC_NOT_FOUND, message: `close-out: spec ${options.spec} not found` },
|
|
89
|
+
data: { spec: options.spec, found: false },
|
|
90
|
+
text: `close-out: spec ${options.spec} not found`,
|
|
91
|
+
exitCode: 2,
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const rows = [];
|
|
96
|
+
for (const spec of specs) {
|
|
97
|
+
const start = Date.now();
|
|
98
|
+
const row = closeOutSpec(repoRoot, spec, { write, closeableStatuses });
|
|
99
|
+
rows.push(row);
|
|
100
|
+
// A close-out-tagged event PER SPEC: verdict=pass on a promotion, info otherwise,
|
|
101
|
+
// with the gate name so metrics can roll close-out outcomes up by command.
|
|
102
|
+
logEvent({
|
|
103
|
+
ts: new Date().toISOString(),
|
|
104
|
+
command: 'close-out',
|
|
105
|
+
specId: row.id,
|
|
106
|
+
core: row.core,
|
|
107
|
+
ms: Date.now() - start,
|
|
108
|
+
ok: true,
|
|
109
|
+
gate: 'closeout',
|
|
110
|
+
verdict: row.status === 'complete' ? 'pass' : 'info',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const promoted = rows.filter((r) => r.written && r.status === 'complete');
|
|
114
|
+
const nudged = rows.filter((r) => r.written && r.status === 'in_progress');
|
|
115
|
+
// Explicit opt-in: notify the consumer audit script AFTER the engine has written
|
|
116
|
+
// status. The engine owns the status decision; this only mirrors it into a
|
|
117
|
+
// consumer's registry/tracking. Skipped in dry-run (nothing was written).
|
|
118
|
+
let registry = null;
|
|
119
|
+
if (options.updateRegistry && write && promoted.length > 0) {
|
|
120
|
+
const args = ['node', 'scripts/audit/audit-spec-completion.js', '--update-registry'];
|
|
121
|
+
if (options.spec)
|
|
122
|
+
args.push(`--spec=${options.spec}`);
|
|
123
|
+
if (options.core)
|
|
124
|
+
args.push(`--core=${options.core}`);
|
|
125
|
+
if (options.all)
|
|
126
|
+
args.push('--all');
|
|
127
|
+
if (global.json)
|
|
128
|
+
args.push('--json');
|
|
129
|
+
emitContinuing(global, `close-out: ${args.join(' ')}`);
|
|
130
|
+
const result = runScript(args, repoRoot);
|
|
131
|
+
registry = { exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr };
|
|
132
|
+
}
|
|
133
|
+
const data = {
|
|
134
|
+
scope: options.spec
|
|
135
|
+
? String(options.spec).toUpperCase()
|
|
136
|
+
: options.core
|
|
137
|
+
? String(options.core).toLowerCase()
|
|
138
|
+
: 'all',
|
|
139
|
+
dryRun: !write,
|
|
140
|
+
total: rows.length,
|
|
141
|
+
promoted: promoted.length,
|
|
142
|
+
nudged: nudged.length,
|
|
143
|
+
closeableStatuses,
|
|
144
|
+
rows: rows.map((r) => ({
|
|
145
|
+
id: r.id,
|
|
146
|
+
core: r.core,
|
|
147
|
+
nextStatus: r.status,
|
|
148
|
+
written: r.written,
|
|
149
|
+
reason: r.decision.reason,
|
|
150
|
+
reconcile: r.reconcile.direction,
|
|
151
|
+
})),
|
|
152
|
+
registry,
|
|
153
|
+
};
|
|
154
|
+
const verb = write ? 'promoted' : 'would promote';
|
|
155
|
+
const lines = rows
|
|
156
|
+
.filter((r) => r.status !== null)
|
|
157
|
+
.map((r) => ` ${r.status === 'complete' ? '[x]' : '[~]'} ${r.id.padEnd(10)} -> ${r.status} (${r.decision.reason})`);
|
|
158
|
+
emit(global, {
|
|
159
|
+
ok: true,
|
|
160
|
+
data,
|
|
161
|
+
text: `close-out (${data.scope}): ${rows.length} spec(s), ${verb} ${promoted.length} to complete` +
|
|
162
|
+
`${nudged.length ? `, ${nudged.length} nudged to in_progress` : ''}${write ? '' : ' (dry-run — drop --dry-run to apply)'}` +
|
|
163
|
+
(lines.length ? `\n${lines.join('\n')}` : ''),
|
|
164
|
+
});
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=close-out.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-out.js","sourceRoot":"","sources":["../../src/commands/close-out.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;;;;;;;;;;;GAaG;AAEH;;0FAE0F;AAC1F,SAAS,2BAA2B,CAAC,QAAgB,EAAE,cAAuB;IAC5E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IACD,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CACV,8NAA8N,CAC/N;SACA,MAAM,CAAC,aAAa,EAAE,6BAA6B,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;SAC5C,MAAM,CAAC,OAAO,EAAE,4BAA4B,EAAE,KAAK,CAAC;SACpD,MAAM,CACL,mBAAmB,EACnB,6IAA6I,EAC7I,KAAK,CACN;SACA,MAAM,CAAC,WAAW,EAAE,yDAAyD,EAAE,KAAK,CAAC;SACrF,MAAM,CACL,YAAY,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAc,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE9C,8EAA8E;QAC9E,kFAAkF;QAClF,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE;gBACX,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,SAAS,CAAC,cAAc;oBAC9B,OAAO,EAAE,wEAAwE;iBAClF;gBACD,IAAI,EAAE,6FAA6F;gBACnG,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,8EAA8E;QAC9E,+EAA+E;QAC/E,IAAI,KAAK,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE;gBACX,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,SAAS,CAAC,iBAAiB;oBACjC,OAAO,EACL,6GAA6G;iBAChH;gBACD,IAAI,EAAE,4GAA4G;gBAClH,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,iBAAiB,GAAG,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAE/E,+EAA+E;QAC/E,IAAI,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE;gBACX,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,mBAAmB,OAAO,CAAC,IAAI,YAAY,EAAE;gBAC/F,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC1C,IAAI,EAAE,mBAAmB,OAAO,CAAC,IAAI,YAAY;gBACjD,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,kFAAkF;YAClF,2EAA2E;YAC3E,QAAQ,CAAC;gBACP,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,OAAO,EAAE,WAAW;gBACpB,MAAM,EAAE,GAAG,CAAC,EAAE;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBACtB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;aACrD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;QAE3E,iFAAiF;QACjF,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,QAAQ,GAAgE,IAAI,CAAC;QACjF,IAAI,OAAO,CAAC,cAAc,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,wCAAwC,EAAE,mBAAmB,CAAC,CAAC;YACrF,IAAI,OAAO,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,GAAG;gBAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,cAAc,CAAC,MAAM,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACzC,QAAQ,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACzF,CAAC;QAED,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,OAAO,CAAC,IAAI;gBACjB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;gBACpC,CAAC,CAAC,OAAO,CAAC,IAAI;oBACZ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;oBACpC,CAAC,CAAC,KAAK;YACX,MAAM,EAAE,CAAC,KAAK;YACd,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB;YACjB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;gBACzB,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS;aACjC,CAAC,CAAC;YACH,QAAQ;SACT,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;aAChC,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAC3G,CAAC;QACJ,IAAI,CAAC,MAAM,EAAE;YACX,EAAE,EAAE,IAAI;YACR,IAAI;YACJ,IAAI,EACF,cAAc,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,MAAM,aAAa,IAAI,IAAI,QAAQ,CAAC,MAAM,cAAc;gBAC3F,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,wBAAwB,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sCAAsC,EAAE;gBAC1H,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;AACN,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { buildPipeline } from '../lib/pipeline-map.js';
|
|
|
3
3
|
import { BUILDER_PIPELINE_SCHEMA, ENCORE1_PIPELINE_SCHEMA } from '../lib/pipeline-config.js';
|
|
4
4
|
import { validateSchema } from '../lib/pipeline-schema.js';
|
|
5
5
|
import { DEFAULT_PREDICATES } from '../lib/predicate-registry.js';
|
|
6
|
-
import { deriveSignalsFromText, isPrimarySpecPath } from '../lib/spec-pure.js';
|
|
6
|
+
import { deriveSignalsFromText, findDuplicateSpecIds, isPrimarySpecPath, resolveSpecFileId } from '../lib/spec-pure.js';
|
|
7
7
|
function synthSpec(signalsText) {
|
|
8
8
|
return {
|
|
9
9
|
id: 'XX-1',
|
|
@@ -74,6 +74,25 @@ export function runConformanceChecks() {
|
|
|
74
74
|
throw new Error('artifact path wrongly recognized as a spec');
|
|
75
75
|
return 'isPrimarySpecPath: spec ✓ / artifact ✗';
|
|
76
76
|
});
|
|
77
|
+
guard('pure:spec-id-authority', () => {
|
|
78
|
+
// issue #27: a frontmatter id is authoritative over the filename hint, so a
|
|
79
|
+
// reserved-token slug is rescued — but a dedicated sibling artifact never is, and a
|
|
80
|
+
// duplicate id is detectable (the loud loader error the validate command surfaces).
|
|
81
|
+
if (resolveSpecFileId('pf', 'PF-1-concurrent-review-board.md', 'PF-1') !== 'PF-1') {
|
|
82
|
+
throw new Error('reserved-token slug not rescued by a declared frontmatter id');
|
|
83
|
+
}
|
|
84
|
+
if (resolveSpecFileId('pf', 'PF-1-CONTEXT.md', 'PF-1') !== null) {
|
|
85
|
+
throw new Error('dedicated CONTEXT artifact wrongly promoted to a primary spec');
|
|
86
|
+
}
|
|
87
|
+
const dups = findDuplicateSpecIds([
|
|
88
|
+
{ id: 'PF-1', path: 'specs/pf/specs/PF-1-a.md' },
|
|
89
|
+
{ id: 'PF-1', path: 'specs/pf/specs/PF-1-b.md' },
|
|
90
|
+
]);
|
|
91
|
+
if (dups.length !== 1 || dups[0].paths.length !== 2) {
|
|
92
|
+
throw new Error('duplicate spec id not detected');
|
|
93
|
+
}
|
|
94
|
+
return 'spec-id authority: rescue ✓ / artifact ✗ / dup detected ✓';
|
|
95
|
+
});
|
|
77
96
|
// The navigator decision-accuracy floor (epic #300 — promoted from the
|
|
78
97
|
// navigator-golden CI suite so the runnable conformance pack carries it too).
|
|
79
98
|
guard('navigator:stages', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/commands/conformance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/commands/conformance.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/metrics.js
CHANGED
|
@@ -38,6 +38,16 @@ export function registerMetrics(program) {
|
|
|
38
38
|
const report = computeMetrics(events, { since, core: options.core });
|
|
39
39
|
const cmdRows = Object.entries(report.byCommand).map(([k, v]) => ` ${k.padEnd(16)} count=${String(v.count).padStart(4)} wall-clock=${(v.wallClockMs / 1000).toFixed(2)}s success=${(v.successRate * 100).toFixed(0)}%`);
|
|
40
40
|
const modelRows = Object.entries(report.byModel).map(([k, v]) => ` ${k.padEnd(32)} calls=${String(v.calls).padStart(3)} in=${v.tokensIn} out=${v.tokensOut} cost=${v.totalCostUsd === null ? '(unknown)' : `$${v.totalCostUsd.toFixed(4)}`}`);
|
|
41
|
+
// TOOL-06 gate-offload rollup (`eos-spec run`): per-gate model/executor/
|
|
42
|
+
// autonomy + the local-vs-cloud ratio. Only rendered when there are runs.
|
|
43
|
+
const exec = report.execution;
|
|
44
|
+
const gateRows = Object.entries(exec.byGate).map(([gate, g]) => {
|
|
45
|
+
const models = Object.keys(g.models).join(',') || '—';
|
|
46
|
+
const executors = Object.keys(g.executors).join(',') || '—';
|
|
47
|
+
const autonomy = Object.keys(g.autonomy).join(',') || '—';
|
|
48
|
+
return ` ${gate.padEnd(18)} model=${models} executor=${executors} autonomy=${autonomy} local=${g.local} cloud=${g.cloud}`;
|
|
49
|
+
});
|
|
50
|
+
const localPct = exec.localRatio === null ? '(n/a)' : `${(exec.localRatio * 100).toFixed(0)}%`;
|
|
41
51
|
const text = [
|
|
42
52
|
`Workflow metrics (since ${options.since ?? 'beginning'}, ${options.core ?? 'all'}):`,
|
|
43
53
|
'',
|
|
@@ -59,6 +69,11 @@ export function registerMetrics(program) {
|
|
|
59
69
|
report.autonomy.lastHalt
|
|
60
70
|
? ` Last halt: ${report.autonomy.lastHalt.command} (${report.autonomy.lastHalt.error ?? 'no error'})`
|
|
61
71
|
: ' No halts in window',
|
|
72
|
+
'',
|
|
73
|
+
' Gate offload (eos-spec run)',
|
|
74
|
+
' ─────────────────────────────────────────────────────',
|
|
75
|
+
` Total gate calls: ${exec.totalGateCalls} local=${exec.local} cloud=${exec.cloud} local-ratio=${localPct}`,
|
|
76
|
+
...(gateRows.length ? gateRows : [' (no run gate executions in window)']),
|
|
62
77
|
].join('\n');
|
|
63
78
|
emit(global, { ok: true, data: report, text });
|
|
64
79
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/commands/metrics.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/commands/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type SpecFile } from '../lib/specs.js';
|
|
3
|
+
/**
|
|
4
|
+
* The planned document-gate sequence from a spec's current state to `until`.
|
|
5
|
+
* Walks the SAME PIPELINE the navigator uses (optional + strictOnly + already-done
|
|
6
|
+
* gates skipped), stopping once the gate that completes `until` is included. Used
|
|
7
|
+
* by `--autonomy suggest` (executes nothing) and surfaced on the drive payload.
|
|
8
|
+
*/
|
|
9
|
+
export declare function planGates(spec: SpecFile, until: string): string[];
|
|
10
|
+
export declare function registerRun(program: Command): void;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
import { addClaim, DEFAULT_TTL_MINUTES, releaseClaim } from '../lib/claims.js';
|
|
4
|
+
import { DEFAULT_LLM_BASE_URL, DEFAULT_LOCAL_MODEL, directModelExecutor, } from '../lib/gate-executor.js';
|
|
5
|
+
import { ErrorCode, emit, getGlobalOptions } from '../lib/output.js';
|
|
6
|
+
import { computeStage, PIPELINE, rank, stageApplies } from '../lib/pipeline-map.js';
|
|
7
|
+
import { reconcileSpec } from '../lib/reconcile-core.js';
|
|
8
|
+
import { getRepoRoot } from '../lib/repo.js';
|
|
9
|
+
import { runPipeline } from '../lib/run-pipeline.js';
|
|
10
|
+
import { diagnoseMissingSpec, findSpec } from '../lib/specs.js';
|
|
11
|
+
import { withEventLog } from '../lib/with-event-log.js';
|
|
12
|
+
import { recommendAction } from './next.js';
|
|
13
|
+
/** The cloud model used when a gate escalates off an unhealthy local endpoint —
|
|
14
|
+
* the same resolution ac-backfill uses (gateway via the `ai` SDK). */
|
|
15
|
+
function resolveCloudModel() {
|
|
16
|
+
return process.env.AC_DRAFT_MODEL ?? process.env.JUDGE_MODEL ?? 'anthropic/claude-sonnet-4';
|
|
17
|
+
}
|
|
18
|
+
/** The default LOCAL model — overridable via EOS_SPEC_LLM_MODEL. */
|
|
19
|
+
function resolveLocalModel() {
|
|
20
|
+
return process.env.EOS_SPEC_LLM_MODEL ?? DEFAULT_LOCAL_MODEL;
|
|
21
|
+
}
|
|
22
|
+
/** The LOCAL OpenAI-compatible base URL (Ollama). */
|
|
23
|
+
function resolveBaseUrl() {
|
|
24
|
+
return process.env.EOS_SPEC_LLM_BASE_URL ?? DEFAULT_LLM_BASE_URL;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The planned document-gate sequence from a spec's current state to `until`.
|
|
28
|
+
* Walks the SAME PIPELINE the navigator uses (optional + strictOnly + already-done
|
|
29
|
+
* gates skipped), stopping once the gate that completes `until` is included. Used
|
|
30
|
+
* by `--autonomy suggest` (executes nothing) and surfaced on the drive payload.
|
|
31
|
+
*/
|
|
32
|
+
export function planGates(spec, until) {
|
|
33
|
+
const out = [];
|
|
34
|
+
for (const t of PIPELINE) {
|
|
35
|
+
if (t.optional || t.strictOnly)
|
|
36
|
+
continue;
|
|
37
|
+
if (!stageApplies(t, spec))
|
|
38
|
+
continue;
|
|
39
|
+
if (t.isDone(spec))
|
|
40
|
+
continue;
|
|
41
|
+
out.push(t.id);
|
|
42
|
+
if (t.completesStatus && rank(t.completesStatus) >= rank(until))
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/** Offline/test executor seam: when EOS_SPEC_LLM_FAKE=1 the gate executor skips
|
|
48
|
+
* the network entirely (probe reports healthy, the model returns canned text) so
|
|
49
|
+
* a drive can be exercised end-to-end without a live model. The REAL artifact
|
|
50
|
+
* writers + telemetry still run, so the recommend→execute→reconcile loop is
|
|
51
|
+
* genuinely exercised. */
|
|
52
|
+
function fakeExecutorDeps() {
|
|
53
|
+
return {
|
|
54
|
+
probe: async () => ({ healthy: true, status: 200, ms: 0 }),
|
|
55
|
+
callModel: async ({ endpoint, model }) => ({
|
|
56
|
+
text: `[fake ${endpoint} output from ${model}]`,
|
|
57
|
+
tokens: { prompt: 1, completion: 1, total: 2 },
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Reasons that count as a clean, expected outcome (exit 0). */
|
|
62
|
+
const SUCCESS_REASONS = new Set(['suggested', 'reached-target', 'halt-before-implement']);
|
|
63
|
+
export function registerRun(program) {
|
|
64
|
+
program
|
|
65
|
+
.command('run')
|
|
66
|
+
.description('Autonomously drive a spec next→execute-gate→reconcile to tasks_generated, HALTING before implement. Routes each gate to a LOCAL model (Ollama) by default, escalating to the cloud gateway unless --strict-local.')
|
|
67
|
+
.requiredOption('--spec <id>', 'Spec id to drive (e.g. LO-50)')
|
|
68
|
+
.option('--autonomy <mode>', 'suggest (plan only, write nothing) | drive (advance the spec)', 'drive')
|
|
69
|
+
.option('--until <stage>', 'Stop once the computed stage reaches this status', 'tasks_generated')
|
|
70
|
+
.option('--max-gates <n>', 'Hard bound on executed gates', '8')
|
|
71
|
+
.option('--strict-local', 'Require the local model; HALT (no cloud fallback) if it is unhealthy', false)
|
|
72
|
+
.action(withEventLog('run', async (options, cmd) => {
|
|
73
|
+
const global = getGlobalOptions(cmd);
|
|
74
|
+
const repoRoot = getRepoRoot(global.repoRoot);
|
|
75
|
+
const autonomy = String(options.autonomy);
|
|
76
|
+
if (autonomy !== 'suggest' && autonomy !== 'drive') {
|
|
77
|
+
emit(global, {
|
|
78
|
+
ok: false,
|
|
79
|
+
error: {
|
|
80
|
+
code: ErrorCode.INVALID_ARGUMENT,
|
|
81
|
+
message: `run: --autonomy must be 'suggest' or 'drive' (got "${autonomy}")`,
|
|
82
|
+
},
|
|
83
|
+
data: null,
|
|
84
|
+
text: `run: --autonomy must be 'suggest' or 'drive' (got "${autonomy}")`,
|
|
85
|
+
});
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const until = String(options.until);
|
|
89
|
+
if (rank(until) < 0) {
|
|
90
|
+
emit(global, {
|
|
91
|
+
ok: false,
|
|
92
|
+
error: {
|
|
93
|
+
code: ErrorCode.INVALID_ARGUMENT,
|
|
94
|
+
message: `run: --until "${until}" is not a known pipeline status`,
|
|
95
|
+
},
|
|
96
|
+
data: null,
|
|
97
|
+
text: `run: --until "${until}" is not a known pipeline status`,
|
|
98
|
+
});
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const maxGates = Number.parseInt(String(options.maxGates), 10);
|
|
102
|
+
if (!Number.isFinite(maxGates) || maxGates < 0) {
|
|
103
|
+
emit(global, {
|
|
104
|
+
ok: false,
|
|
105
|
+
error: {
|
|
106
|
+
code: ErrorCode.INVALID_ARGUMENT,
|
|
107
|
+
message: `run: --max-gates must be a non-negative integer (got "${options.maxGates}")`,
|
|
108
|
+
},
|
|
109
|
+
data: null,
|
|
110
|
+
text: `run: --max-gates must be a non-negative integer (got "${options.maxGates}")`,
|
|
111
|
+
});
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const spec0 = findSpec(repoRoot, String(options.spec));
|
|
115
|
+
if (!spec0) {
|
|
116
|
+
const diag = diagnoseMissingSpec(repoRoot, String(options.spec));
|
|
117
|
+
emit(global, {
|
|
118
|
+
ok: false,
|
|
119
|
+
error: { code: ErrorCode.SPEC_NOT_FOUND, message: `run: spec ${options.spec} not found (${diag.reason})` },
|
|
120
|
+
data: null,
|
|
121
|
+
text: `run: spec ${options.spec} not found (${diag.reason})`,
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const specId = spec0.id;
|
|
126
|
+
const strictLocal = Boolean(options.strictLocal);
|
|
127
|
+
const baseURL = resolveBaseUrl();
|
|
128
|
+
const localModel = resolveLocalModel();
|
|
129
|
+
const cloudModel = resolveCloudModel();
|
|
130
|
+
const fake = process.env.EOS_SPEC_LLM_FAKE === '1';
|
|
131
|
+
const execDeps = fake ? fakeExecutorDeps() : {};
|
|
132
|
+
// ── suggest: plan only, NO claim, NO writes (AC-7) ───────────────────
|
|
133
|
+
if (autonomy === 'suggest') {
|
|
134
|
+
const result = await runPipeline({
|
|
135
|
+
recommend: () => recommendAction(findSpec(repoRoot, specId), null, repoRoot),
|
|
136
|
+
stage: () => computeStage(findSpec(repoRoot, specId)),
|
|
137
|
+
rank,
|
|
138
|
+
execute: async () => ({ ok: true, executor: 'noop' }),
|
|
139
|
+
reconcile: () => { },
|
|
140
|
+
plan: () => planGates(spec0, until),
|
|
141
|
+
}, { autonomy, until, maxGates });
|
|
142
|
+
emit(global, {
|
|
143
|
+
ok: true,
|
|
144
|
+
data: { specId, autonomy, until, plan: result.plan, finalStage: result.finalStage, reason: result.reason },
|
|
145
|
+
text: `run (suggest) ${specId}: ${result.plan?.length ? result.plan.join(' → ') : '(already at/past target — nothing to do)'}\n` +
|
|
146
|
+
` from stage: ${result.finalStage} target: ${until} (executes nothing)`,
|
|
147
|
+
});
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// ── drive: claim, then loop recommend→execute→reconcile ──────────────
|
|
151
|
+
addClaim(repoRoot, specId, {
|
|
152
|
+
by: process.env.EOS_SPEC_CLAIMED_BY ?? basename(repoRoot),
|
|
153
|
+
ttlMinutes: DEFAULT_TTL_MINUTES,
|
|
154
|
+
});
|
|
155
|
+
const execute = async (action) => {
|
|
156
|
+
const fresh = findSpec(repoRoot, specId);
|
|
157
|
+
const specText = readFileSync(fresh.path, 'utf8');
|
|
158
|
+
const r = await directModelExecutor({
|
|
159
|
+
gate: action.type,
|
|
160
|
+
spec: fresh,
|
|
161
|
+
repoRoot,
|
|
162
|
+
specText,
|
|
163
|
+
baseURL,
|
|
164
|
+
localModel,
|
|
165
|
+
cloudModel,
|
|
166
|
+
strictLocal,
|
|
167
|
+
autonomy,
|
|
168
|
+
}, execDeps);
|
|
169
|
+
return {
|
|
170
|
+
ok: r.ok,
|
|
171
|
+
executor: r.executor,
|
|
172
|
+
model: r.model,
|
|
173
|
+
escalatedToCloud: r.escalatedToCloud,
|
|
174
|
+
artifacts: r.artifacts,
|
|
175
|
+
error: r.error,
|
|
176
|
+
halt: r.halt,
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
let result;
|
|
180
|
+
try {
|
|
181
|
+
result = await runPipeline({
|
|
182
|
+
recommend: () => recommendAction(findSpec(repoRoot, specId), null, repoRoot),
|
|
183
|
+
stage: () => computeStage(findSpec(repoRoot, specId)),
|
|
184
|
+
rank,
|
|
185
|
+
execute,
|
|
186
|
+
reconcile: () => {
|
|
187
|
+
reconcileSpec(repoRoot, findSpec(repoRoot, specId), true);
|
|
188
|
+
},
|
|
189
|
+
plan: () => planGates(spec0, until),
|
|
190
|
+
}, { autonomy, until, maxGates });
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
// Always release the lease, even if the loop threw — emit() never returns.
|
|
194
|
+
releaseClaim(repoRoot, specId);
|
|
195
|
+
}
|
|
196
|
+
const ok = SUCCESS_REASONS.has(result.reason);
|
|
197
|
+
const localGates = result.events.filter((e) => !e.escalatedToCloud).length;
|
|
198
|
+
const cloudGates = result.events.length - localGates;
|
|
199
|
+
const artifacts = result.events.flatMap((e) => e.artifacts ?? []);
|
|
200
|
+
const lines = [
|
|
201
|
+
`run (drive) ${specId}: ${result.reason} at stage ${result.finalStage}`,
|
|
202
|
+
` gates executed: ${result.events.length} (local=${localGates}, cloud=${cloudGates})`,
|
|
203
|
+
...result.events.map((e) => ` - ${e.gate}: ${e.ok ? 'ok' : `FAILED (${e.error ?? 'unknown'})`}${e.escalatedToCloud ? ' [escalated→cloud]' : ''}`),
|
|
204
|
+
...(result.resumeHint ? [` resume: ${result.resumeHint}`] : []),
|
|
205
|
+
...(artifacts.length ? [` wrote: ${artifacts.join(', ')}`] : []),
|
|
206
|
+
];
|
|
207
|
+
emit(global, {
|
|
208
|
+
ok,
|
|
209
|
+
data: {
|
|
210
|
+
specId,
|
|
211
|
+
autonomy,
|
|
212
|
+
until,
|
|
213
|
+
strictLocal,
|
|
214
|
+
reason: result.reason,
|
|
215
|
+
finalStage: result.finalStage,
|
|
216
|
+
haltedAt: result.haltedAt ?? null,
|
|
217
|
+
resumeHint: result.resumeHint ?? null,
|
|
218
|
+
gatesExecuted: result.events.length,
|
|
219
|
+
localGates,
|
|
220
|
+
cloudGates,
|
|
221
|
+
events: result.events,
|
|
222
|
+
artifacts,
|
|
223
|
+
},
|
|
224
|
+
exitCode: ok ? 0 : 1,
|
|
225
|
+
text: lines.join('\n'),
|
|
226
|
+
...(ok ? {} : { error: { code: ErrorCode.SUBPROCESS_ERROR, message: `run halted: ${result.reason}` } }),
|
|
227
|
+
});
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,13 @@ export type ValidateIssue = {
|
|
|
5
5
|
rule: string;
|
|
6
6
|
message: string;
|
|
7
7
|
};
|
|
8
|
+
/**
|
|
9
|
+
* Build the `ValidateIssue`s for any spec id claimed by more than one primary spec
|
|
10
|
+
* (issue #27, mode b). One issue per colliding id, naming every offending path, so the
|
|
11
|
+
* old silent lowest-path-wins drop becomes a loud, actionable failure. Pure over the
|
|
12
|
+
* already-listed corpus — `findDuplicateSpecIds` does the fs-free grouping.
|
|
13
|
+
*/
|
|
14
|
+
export declare function duplicateIdIssues(specs: SpecFile[]): ValidateIssue[];
|
|
8
15
|
export type TemplateValidatorDecision = {
|
|
9
16
|
run: true;
|
|
10
17
|
} | {
|