@cat-factory/orchestration 0.142.0 → 0.143.1

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 (27) hide show
  1. package/dist/container/environmentsModule.factory.d.ts.map +1 -1
  2. package/dist/container/environmentsModule.factory.js +1 -0
  3. package/dist/container/environmentsModule.factory.js.map +1 -1
  4. package/dist/modules/environments/EnvironmentTestService.d.ts +11 -0
  5. package/dist/modules/environments/EnvironmentTestService.d.ts.map +1 -1
  6. package/dist/modules/environments/EnvironmentTestService.js +27 -9
  7. package/dist/modules/environments/EnvironmentTestService.js.map +1 -1
  8. package/dist/modules/execution/AgentContextBuilder.d.ts +15 -1
  9. package/dist/modules/execution/AgentContextBuilder.d.ts.map +1 -1
  10. package/dist/modules/execution/AgentContextBuilder.js +27 -1
  11. package/dist/modules/execution/AgentContextBuilder.js.map +1 -1
  12. package/dist/modules/execution/PollCompletionController.d.ts.map +1 -1
  13. package/dist/modules/execution/PollCompletionController.js +6 -0
  14. package/dist/modules/execution/PollCompletionController.js.map +1 -1
  15. package/dist/modules/execution/RunDispatcher.d.ts.map +1 -1
  16. package/dist/modules/execution/RunDispatcher.js +10 -0
  17. package/dist/modules/execution/RunDispatcher.js.map +1 -1
  18. package/dist/modules/execution/StepGraph.d.ts.map +1 -1
  19. package/dist/modules/execution/StepGraph.js +5 -0
  20. package/dist/modules/execution/StepGraph.js.map +1 -1
  21. package/dist/modules/execution/reproductionProof.logic.d.ts +101 -0
  22. package/dist/modules/execution/reproductionProof.logic.d.ts.map +1 -0
  23. package/dist/modules/execution/reproductionProof.logic.js +264 -0
  24. package/dist/modules/execution/reproductionProof.logic.js.map +1 -0
  25. package/dist/modules/modelPresets/ModelPresetService.d.ts +1 -1
  26. package/dist/modules/modelPresets/ModelPresetService.js +1 -1
  27. package/package.json +12 -12
@@ -0,0 +1,264 @@
1
+ import { REPRODUCTION_DEFAULT_MAX_ATTEMPTS, REPRODUCTION_MAX_COMMAND_CHARS, REPRODUCTION_MAX_TEST_PATHS, REPRODUCTION_MAX_TEST_PATH_CHARS, parseReproductionProofMode, parseReproductionReport, } from '@cat-factory/contracts';
2
+ import { CODER_REPRODUCTION_PROOF_CONFIG_ID, reproTestOutcome } from '@cat-factory/agents';
3
+ // Pure logic for the BUGFIX REPRODUCTION PROOF phase (docs/initiatives/bugfix-reproduction-proof.md).
4
+ //
5
+ // The engine resolves the per-task tri-state + the run's reproduction DECLARATION into the spec
6
+ // the container executor forwards on a PR-opening coding job body. Side-effect-free so it is
7
+ // unit- and conformance-testable without the engine's I/O.
8
+ //
9
+ // The declaration seam is deliberately singular: it is the prior `repro-test` step's structured
10
+ // outcome, NOT a new structured tail on the coder (which is a side-effect kind that legitimately
11
+ // ends with no final text). See the initiative's D3.
12
+ /** The producer kind the proof phase attaches to (the Coder, which opens the PR). */
13
+ export const REPRODUCTION_PROOF_PRODUCER_KIND = 'coder';
14
+ /** The step kind whose structured outcome carries the reproduction declaration. */
15
+ export const REPRO_DECLARATION_KIND = 'repro-test';
16
+ /**
17
+ * The block's tri-state for the proof phase: the explicit `coder.reproductionProof` agent-config
18
+ * choice when set to a known value, else the default `auto`. Lenient (any unknown value falls
19
+ * back to `auto`) exactly like `resolveForkTriState` — an agent-config bag is free-form JSON, so
20
+ * a stale or hand-edited value must degrade rather than throw. Both the descriptor id and the
21
+ * union itself come from their owning packages rather than being restated here: a rename in
22
+ * `@cat-factory/agents` would otherwise leave the engine reading a key nothing writes.
23
+ */
24
+ export function resolveReproductionTriState(agentConfig) {
25
+ return parseReproductionProofMode(agentConfig?.[CODER_REPRODUCTION_PROOF_CONFIG_ID]);
26
+ }
27
+ /**
28
+ * The reproduction DECLARATION carried by the run so far: the last prior `repro-test` step's
29
+ * structured outcome. `undefined` when no such step ran, or when its reply did not actually
30
+ * declare an outcome — which is the signal that `auto` must not run the phase (there is nothing
31
+ * to prove) AND that no infeasibility may be attributed to the agent.
32
+ *
33
+ * The raw `outcome` must be one of the three literals VERBATIM. `reproTestOutcome` falls back to
34
+ * `not_reproducible` for an unreadable reply — a deliberately conservative default for telling
35
+ * the coder there is no trustworthy failing test — but this feature PUBLISHES that value as the
36
+ * agent's own structural declaration, so a fallback must never reach it. Otherwise a malformed
37
+ * reply (`{}` parses fine) would be recorded as "the agent declared the bug non-reproducible"
38
+ * with a blank reason: a false attribution AND exactly the empty section this feature exists to
39
+ * eliminate.
40
+ *
41
+ * Reads the LAST matching step rather than the first: a retried/re-run reproduction step is the
42
+ * one whose declaration describes the branch as it now stands, mirroring `findStep` in
43
+ * `prReport.logic.ts`.
44
+ */
45
+ export function reproductionDeclarationFrom(steps, currentStep) {
46
+ for (let i = Math.min(currentStep, steps.length) - 1; i >= 0; i -= 1) {
47
+ const step = steps[i];
48
+ if (step?.agentKind !== REPRO_DECLARATION_KIND)
49
+ continue;
50
+ if (!declaresOutcome(step.custom))
51
+ continue;
52
+ const parsed = reproTestOutcome.safeParse(step.custom);
53
+ if (parsed)
54
+ return parsed;
55
+ }
56
+ return undefined;
57
+ }
58
+ /** Whether a raw structured reply literally named an outcome (vs. the schema's fallback). */
59
+ function declaresOutcome(custom) {
60
+ if (typeof custom !== 'object' || custom === null)
61
+ return false;
62
+ const outcome = custom.outcome;
63
+ return outcome === 'reproduced' || outcome === 'partial' || outcome === 'not_reproducible';
64
+ }
65
+ /**
66
+ * Resolve the spec a dispatch should carry, or `undefined` for "run the existing path unchanged".
67
+ *
68
+ * `undefined` is returned — and this is the feature's core compatibility promise — whenever:
69
+ * the tri-state is `off`; the dispatched kind is not the PR-opening producer; `auto` found no
70
+ * declaration; the declaration conceded (`not_reproducible`, which is recorded as a structural
71
+ * infeasibility declaration by the engine rather than verified here); or the declaration named
72
+ * no runnable command. In every one of those cases no context field is set, so no job-body field
73
+ * is set, so the harness runs byte-for-byte the code it ran before this feature existed.
74
+ *
75
+ * `always` deliberately does NOT invent a spec when there is no declaration: there is nothing to
76
+ * run, and fabricating a command would produce a false verdict. So TODAY it resolves identically
77
+ * to `auto` — the divergence arrives with the tracker-issue-type gating deferred in the
78
+ * initiative's D2, which is why the task-facing control is deferred with it rather than shipping
79
+ * two options a user cannot tell apart. The wire value is accepted now so the contract does not
80
+ * change when the control lands.
81
+ *
82
+ * The declared command and setup command are MODEL-AUTHORED strings the harness will run through
83
+ * `sh -c`, and the declared paths are applied onto a base worktree, so both are BOUNDED here at
84
+ * the resolution boundary — the last place the engine controls before they cross into a job body.
85
+ */
86
+ export function resolveReproductionSpec(args) {
87
+ const { agentKind, agentConfig, steps, currentStep } = args;
88
+ if (agentKind !== REPRODUCTION_PROOF_PRODUCER_KIND)
89
+ return undefined;
90
+ if (resolveReproductionTriState(agentConfig) === 'off')
91
+ return undefined;
92
+ const declaration = reproductionDeclarationFrom(steps, currentStep);
93
+ if (!declaration)
94
+ return undefined;
95
+ // A concede is not something to VERIFY — it is a declaration the engine records as-is. Running
96
+ // a command for it would be running nothing.
97
+ if (declaration.outcome === 'not_reproducible')
98
+ return undefined;
99
+ const command = declaration.command?.trim();
100
+ if (!command || command.length > REPRODUCTION_MAX_COMMAND_CHARS)
101
+ return undefined;
102
+ const setupCommand = declaration.setupCommand?.trim();
103
+ // An over-long setup command declines the whole spec rather than being dropped: running the
104
+ // final tree with a setup the base tree never got is precisely the asymmetry that manufactures
105
+ // a false `reproduced` (the initiative's D4).
106
+ if (setupCommand && setupCommand.length > REPRODUCTION_MAX_COMMAND_CHARS)
107
+ return undefined;
108
+ const { paths: testPaths, omitted } = sanitizeTestPaths(declaration.testPaths);
109
+ return {
110
+ command,
111
+ testPaths,
112
+ ...(omitted > 0 ? { omittedTestPaths: omitted } : {}),
113
+ ...(setupCommand ? { setupCommand } : {}),
114
+ maxAttempts: args.maxAttempts ?? REPRODUCTION_DEFAULT_MAX_ATTEMPTS,
115
+ };
116
+ }
117
+ /**
118
+ * Bound and sanitize the declared test paths, reporting how many were DROPPED.
119
+ *
120
+ * These paths are not decoration: the harness applies them onto the base worktree to rebuild the
121
+ * pre-fix tree, so an absolute path or a `..` segment would write outside the checkout, and an
122
+ * over-cap list would rebuild that tree from an incomplete reproduction. Both are refused, and
123
+ * the count is carried on the spec — a dropped path can green the base and read as "the test does
124
+ * not capture the defect", so a silent truncation would launder a broken input into a verdict.
125
+ */
126
+ function sanitizeTestPaths(declared) {
127
+ const paths = [];
128
+ let omitted = 0;
129
+ for (const raw of declared) {
130
+ if (paths.length >= REPRODUCTION_MAX_TEST_PATHS) {
131
+ omitted += 1;
132
+ continue;
133
+ }
134
+ const path = raw.trim().replace(/\\/g, '/');
135
+ if (!isSafeTestPath(path)) {
136
+ if (path.length > 0)
137
+ omitted += 1;
138
+ continue;
139
+ }
140
+ paths.push(path);
141
+ }
142
+ return { paths, omitted };
143
+ }
144
+ /** A repo-relative path with no traversal, no root/drive anchor and a sane length. */
145
+ function isSafeTestPath(path) {
146
+ if (path.length === 0 || path.length > REPRODUCTION_MAX_TEST_PATH_CHARS)
147
+ return false;
148
+ if (path.startsWith('/') || path.startsWith('~') || /^[a-zA-Z]:\//.test(path))
149
+ return false;
150
+ return !path.split('/').includes('..');
151
+ }
152
+ /**
153
+ * The report to record for a run whose reproduction step CONCEDED — the structural
154
+ * infeasibility declaration. Built by the engine (not the harness, which never runs for a
155
+ * concede), so "could not be reproduced" reaches the pull request as a real statement with its
156
+ * reason and the agent's stated alternative verification, rather than as an empty section
157
+ * indistinguishable from a run that never tried.
158
+ *
159
+ * Returns `undefined` when the run carries no concede, so the caller can fold it in branch-free.
160
+ */
161
+ export function concededReproductionReport(steps, currentStep, now) {
162
+ const declaration = reproductionDeclarationFrom(steps, currentStep);
163
+ if (!declaration || declaration.outcome !== 'not_reproducible')
164
+ return undefined;
165
+ const reason = declaration.notes?.trim();
166
+ const alternativeVerification = declaration.alternativeVerification?.trim();
167
+ return {
168
+ status: 'declared_infeasible',
169
+ command: '',
170
+ testPaths: [],
171
+ attempts: 0,
172
+ maxAttempts: 0,
173
+ ...(reason ? { reason } : {}),
174
+ ...(alternativeVerification ? { alternativeVerification } : {}),
175
+ // A concede that named NEITHER a reason nor an alternative is a declaration in form only.
176
+ // Say so, rather than rendering an infeasibility card whose body happens to be blank — the
177
+ // blank is indistinguishable from a rendering bug, which is how "nobody tried" creeps back in
178
+ // through the door this feature closed.
179
+ ...(reason || alternativeVerification
180
+ ? {}
181
+ : { note: 'The reproduction step declared the bug non-reproducible but gave no reason.' }),
182
+ at: now,
183
+ };
184
+ }
185
+ /**
186
+ * Fold a harness-produced reproduction report onto a step, returning whether anything changed.
187
+ *
188
+ * Applied on all three poll paths — the live republish (so a failed verification is visible while
189
+ * the repair loop still runs), the successful terminal result, and the failed terminal result (a
190
+ * job that died for an UNRELATED reason after the proof ran; a failed verification never fails a
191
+ * job by itself). Lenient by construction: a malformed or absent payload leaves the step
192
+ * untouched rather than failing the run, because the report is evidence, never a control signal.
193
+ */
194
+ export function applyReproductionReport(step, raw) {
195
+ const report = coerceReproductionReport(raw);
196
+ if (!report)
197
+ return false;
198
+ if (sameReproductionReport(step.reproduction ?? null, report))
199
+ return false;
200
+ step.reproduction = report;
201
+ return true;
202
+ }
203
+ /** Parse a harness report defensively; `null` for absent/unparseable payloads. */
204
+ export function coerceReproductionReport(raw) {
205
+ if (raw === undefined || raw === null)
206
+ return null;
207
+ try {
208
+ return parseReproductionReport(raw);
209
+ }
210
+ catch {
211
+ return null;
212
+ }
213
+ }
214
+ /**
215
+ * Record a settled coding step's reproduction outcome: the harness's verdict when one came back,
216
+ * else — for a run whose reproduction step CONCEDED, which dispatches no proof because there is
217
+ * nothing to run — the structural infeasibility declaration the engine mints itself.
218
+ *
219
+ * The concede branch is gated on the PR-opening producer kind, so every other step in the run
220
+ * doesn't pick up the same declaration and litter the timeline with duplicate cards.
221
+ *
222
+ * Lives here rather than inline in `RunDispatcher.recordStepResult` so the dispatcher keeps a
223
+ * one-line delegate and the whole "which report does this step get" rule sits with the rest of
224
+ * the feature's pure logic, where it is directly testable.
225
+ */
226
+ export function recordReproductionOutcome(step, raw, run, now) {
227
+ if (applyReproductionReport(step, raw))
228
+ return;
229
+ // A report already on the step is never displaced by the minted concede. `applyReproductionReport`
230
+ // returns false BOTH for "nothing came back" and for "the terminal result re-offered the report
231
+ // the live poll already applied" — without this guard the second case would overwrite a proof
232
+ // that actually ran with the older, weaker declaration.
233
+ if (step.reproduction)
234
+ return;
235
+ if (step.agentKind !== REPRODUCTION_PROOF_PRODUCER_KIND)
236
+ return;
237
+ const conceded = concededReproductionReport(run.steps, run.currentStep, now);
238
+ if (conceded)
239
+ step.reproduction = conceded;
240
+ }
241
+ /**
242
+ * Whether two reports are the same publish. Compared on the verdict identity rather than
243
+ * deep-equality of the (potentially several KB of) captured output tails, so an idle poll
244
+ * re-offering the same report doesn't churn storage or the event stream — the
245
+ * `sameValidationReport` treatment, for the same reason.
246
+ *
247
+ * `at` participates, so the harness MUST stamp a fresh timestamp on every publish (a Phase B
248
+ * invariant); every other field compared here is one whose change a reviewer would actually see,
249
+ * so a same-timestamp republish that altered the verdict still lands.
250
+ */
251
+ function sameReproductionReport(a, b) {
252
+ if (!a)
253
+ return false;
254
+ return (a.status === b.status &&
255
+ a.attempts === b.attempts &&
256
+ a.at === b.at &&
257
+ a.note === b.note &&
258
+ samePhase(a.base, b.base) &&
259
+ samePhase(a.final, b.final));
260
+ }
261
+ function samePhase(a, b) {
262
+ return a?.exitCode === b?.exitCode && a?.passed === b?.passed && a?.setupFailed === b?.setupFailed;
263
+ }
264
+ //# sourceMappingURL=reproductionProof.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reproductionProof.logic.js","sourceRoot":"","sources":["../../../src/modules/execution/reproductionProof.logic.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ export interface ModelPresetServiceDependencies {
17
17
  * mapping from). A preset is one `baseModelId` applied to every agent kind plus
18
18
  * per-kind `overrides`. Maintains the invariant that a workspace always has at least
19
19
  * one preset, exactly one of which is the default: {@link list} lazily seeds the
20
- * built-in catalog ({@link seedModelPresets}: Kimi K2.7, GLM-5.2, Claude Opus 4.8) on
20
+ * built-in catalog ({@link seedModelPresets}: Kimi K2.7, GLM-5.2, Claude Opus 5) on
21
21
  * first use, with the deployment's {@link ModelPresetServiceDependencies.defaultPresetId}
22
22
  * flagged default, and the default cannot be deleted. The single-default promotion is
23
23
  * enforced in the repository. {@link reseed} restores a built-in to the current catalog
@@ -4,7 +4,7 @@ import { assertFound, ConflictError, DEFAULT_MODEL_PRESET_ID, modelForKindFromPr
4
4
  * mapping from). A preset is one `baseModelId` applied to every agent kind plus
5
5
  * per-kind `overrides`. Maintains the invariant that a workspace always has at least
6
6
  * one preset, exactly one of which is the default: {@link list} lazily seeds the
7
- * built-in catalog ({@link seedModelPresets}: Kimi K2.7, GLM-5.2, Claude Opus 4.8) on
7
+ * built-in catalog ({@link seedModelPresets}: Kimi K2.7, GLM-5.2, Claude Opus 5) on
8
8
  * first use, with the deployment's {@link ModelPresetServiceDependencies.defaultPresetId}
9
9
  * flagged default, and the default cannot be deleted. The single-default promotion is
10
10
  * enforced in the repository. {@link reseed} restores a built-in to the current catalog
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/orchestration",
3
- "version": "0.142.0",
3
+ "version": "0.143.1",
4
4
  "description": "Delivery-workflow engine for the Agent Architecture Board (execution, bootstrap, pipelines, board, boardScan, requirements, and composition root).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,21 +24,21 @@
24
24
  "access": "public"
25
25
  },
26
26
  "dependencies": {
27
- "ai": "^7.0.35",
28
- "@cat-factory/agents": "0.69.10",
29
- "@cat-factory/caching": "0.10.43",
30
- "@cat-factory/contracts": "0.167.0",
31
- "@cat-factory/integrations": "0.100.0",
32
- "@cat-factory/kernel": "0.161.0",
33
- "@cat-factory/prompt-fragments": "0.14.15",
34
- "@cat-factory/sandbox": "0.9.148",
35
- "@cat-factory/spend": "0.12.87",
36
- "@cat-factory/workspaces": "0.18.3"
27
+ "ai": "^7.0.37",
28
+ "@cat-factory/agents": "0.70.1",
29
+ "@cat-factory/caching": "0.10.45",
30
+ "@cat-factory/contracts": "0.168.0",
31
+ "@cat-factory/integrations": "0.100.2",
32
+ "@cat-factory/kernel": "0.163.0",
33
+ "@cat-factory/prompt-fragments": "0.14.16",
34
+ "@cat-factory/sandbox": "0.9.150",
35
+ "@cat-factory/spend": "0.12.89",
36
+ "@cat-factory/workspaces": "0.18.5"
37
37
  },
38
38
  "devDependencies": {
39
39
  "typescript": "7.0.2",
40
40
  "vitest": "^4.1.10",
41
- "@cat-factory/sandbox-fixtures": "0.7.198"
41
+ "@cat-factory/sandbox-fixtures": "0.7.199"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsc -b tsconfig.build.json",