@svenroth-ai/shipwright 0.25.0 → 0.26.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/client/dist/assets/{EmbeddedTerminal-5QvKe3_a.js → EmbeddedTerminal-D3wpPNZP.js} +1 -1
- package/client/dist/assets/{abnfDiagram-VRR7QNED-CXi9HegQ.js → abnfDiagram-VRR7QNED-BkLIltB3.js} +1 -1
- package/client/dist/assets/{arc-DLh4GiqR.js → arc-Sw-Gh0nI.js} +1 -1
- package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DUypQ8dQ.js → architectureDiagram-ZJ3FMSHR-rdxUi9Ks.js} +1 -1
- package/client/dist/assets/{blockDiagram-677ZJIJ3-D2cVMKJG.js → blockDiagram-677ZJIJ3-Ch_9dj8a.js} +1 -1
- package/client/dist/assets/{c4Diagram-LMCZKHZV-DtruBGJw.js → c4Diagram-LMCZKHZV-CkFlO65x.js} +1 -1
- package/client/dist/assets/channel-BYPbLjRl.js +1 -0
- package/client/dist/assets/{chunk-2Q5K7J3B-CAfQkFw2.js → chunk-2Q5K7J3B-CypX83xu.js} +1 -1
- package/client/dist/assets/{chunk-32BRIVSS-CPWXoLnQ.js → chunk-32BRIVSS-DxVLYGdl.js} +1 -1
- package/client/dist/assets/{chunk-5VM5RSS4-xVc3oppQ.js → chunk-5VM5RSS4-Cxk1evhx.js} +1 -1
- package/client/dist/assets/{chunk-EX3LRPZG-CUpl6fRR.js → chunk-EX3LRPZG-n9q5S4yJ.js} +1 -1
- package/client/dist/assets/{chunk-JWPE2WC7-NejUp56x.js → chunk-JWPE2WC7-jeL4xvir.js} +1 -1
- package/client/dist/assets/{chunk-MOJQB5TN-C9-2lLg0.js → chunk-MOJQB5TN-DDSHN0cj.js} +1 -1
- package/client/dist/assets/{chunk-RYQCIY6F-BAPtwABy.js → chunk-RYQCIY6F-C0bo383g.js} +1 -1
- package/client/dist/assets/{chunk-V7JOEXUC-Dwzihw26.js → chunk-V7JOEXUC-C0jDXXAU.js} +1 -1
- package/client/dist/assets/{chunk-VR4S4FIN-9-iArFJM.js → chunk-VR4S4FIN-h-Rr4Pn2.js} +1 -1
- package/client/dist/assets/{chunk-XXDRQBXY-DiWHOrqe.js → chunk-XXDRQBXY-BexSo0-s.js} +1 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-CsFIeTju.js +1 -0
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsFIeTju.js +1 -0
- package/client/dist/assets/{cose-bilkent-JH36ORCC-Cp04EOcH.js → cose-bilkent-JH36ORCC-BQXzaioj.js} +1 -1
- package/client/dist/assets/{cynefin-VYW2F7L2-D--GN1v8.js → cynefin-VYW2F7L2-BJIofhfe.js} +1 -1
- package/client/dist/assets/{cynefinDiagram-TSTJHNR4-BGH0o_qp.js → cynefinDiagram-TSTJHNR4-DmPqTM1T.js} +1 -1
- package/client/dist/assets/{dagre-VKFMJZFB-DSKkIKlj.js → dagre-VKFMJZFB-1xljvw6X.js} +1 -1
- package/client/dist/assets/{diagram-FQU43EPY-Cs_C4lb-.js → diagram-FQU43EPY-iyL9muCG.js} +1 -1
- package/client/dist/assets/{diagram-G47NLZAW-oDtAA8O_.js → diagram-G47NLZAW-DREp2Th6.js} +1 -1
- package/client/dist/assets/{diagram-NH7WQ7WH-BiFMjqSH.js → diagram-NH7WQ7WH-h0X3Is2S.js} +1 -1
- package/client/dist/assets/{diagram-OA4YK3LP-Ccs3thCj.js → diagram-OA4YK3LP-Bj8YZRFJ.js} +1 -1
- package/client/dist/assets/{diagram-WEI45ONY-CdZNqgO3.js → diagram-WEI45ONY-BZOf805d.js} +1 -1
- package/client/dist/assets/{ebnfDiagram-CCIWWBDH-CapTA0VL.js → ebnfDiagram-CCIWWBDH-DO5JnXda.js} +1 -1
- package/client/dist/assets/{erDiagram-Q63AITRT-BcRNEP8s.js → erDiagram-Q63AITRT-DRgcqg1T.js} +1 -1
- package/client/dist/assets/{flowDiagram-23GEKE2U-CJ_zF7e_.js → flowDiagram-23GEKE2U-C3J9QmrW.js} +1 -1
- package/client/dist/assets/{ganttDiagram-NO4QXBWP-CnJdcg9A.js → ganttDiagram-NO4QXBWP-BIEl3Tkm.js} +1 -1
- package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-YTUQ_ELk.js → gitGraphDiagram-IHSO6WYX-BNF0tFWC.js} +1 -1
- package/client/dist/assets/{index-irQhGNpn.js → index-BnTOrFHb.js} +203 -202
- package/client/dist/assets/index-CYPc6qxw.css +1 -0
- package/client/dist/assets/{infoDiagram-FWYZ7A6U-CLOP_ZWD.js → infoDiagram-FWYZ7A6U-DEyFxiyY.js} +1 -1
- package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-aFTIzr7o.js → ishikawaDiagram-FXEZZL3T-B_ehlg3I.js} +1 -1
- package/client/dist/assets/{journeyDiagram-5HDEW3XC-CbPJB4xd.js → journeyDiagram-5HDEW3XC-Dp00FyJS.js} +1 -1
- package/client/dist/assets/{kanban-definition-HUTT4EX6-BoyhytIS.js → kanban-definition-HUTT4EX6-CTAf16q8.js} +1 -1
- package/client/dist/assets/{linear-1VXA-uBg.js → linear-9vNUgmYd.js} +1 -1
- package/client/dist/assets/{mermaid.core-D_lO2yK9.js → mermaid.core-A6tjaEVD.js} +4 -4
- package/client/dist/assets/{mindmap-definition-LN4V7U3C-iFK7LXMx.js → mindmap-definition-LN4V7U3C-DRW3bmCY.js} +1 -1
- package/client/dist/assets/{pegDiagram-2B236MQR-DNmcmfA-.js → pegDiagram-2B236MQR-DJFCjHp2.js} +1 -1
- package/client/dist/assets/{pieDiagram-ENE6RG2P-ekx83O5b.js → pieDiagram-ENE6RG2P-KRd-sGvC.js} +1 -1
- package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-DayyD1l8.js → quadrantDiagram-ABIIQ3AL-9TLZE3Hu.js} +1 -1
- package/client/dist/assets/{railroadDiagram-RFXS5EU6-Bdgz7S6G.js → railroadDiagram-RFXS5EU6-y4tLtjXg.js} +1 -1
- package/client/dist/assets/{requirementDiagram-TGXJPOKE-szP3Muld.js → requirementDiagram-TGXJPOKE-B9EOQDQM.js} +1 -1
- package/client/dist/assets/{sankeyDiagram-HTMAVEWB-Ct3rzgUj.js → sankeyDiagram-HTMAVEWB-zfwiDzkT.js} +1 -1
- package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-_69EfmOU.js → sequenceDiagram-DBY2YBRQ-DW1LWepL.js} +1 -1
- package/client/dist/assets/{sizeCapture-X5ZJPWSS-BSOU06J2.js → sizeCapture-X5ZJPWSS-BM81Mik0.js} +1 -1
- package/client/dist/assets/{stateDiagram-2N3HPSRC-HmOmFwQm.js → stateDiagram-2N3HPSRC-D0EMIw1w.js} +1 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-B3E4_xxT.js +1 -0
- package/client/dist/assets/{swimlanes-5IMT3BWC-CVg_4oT7.js → swimlanes-5IMT3BWC-CKXNCX6M.js} +2 -2
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-BegQBqnC.js +8 -0
- package/client/dist/assets/{timeline-definition-FHXFAJF6-CBBaDKXm.js → timeline-definition-FHXFAJF6-ByzIfvL5.js} +1 -1
- package/client/dist/assets/{vennDiagram-L72KCM5P-CBXiWPMc.js → vennDiagram-L72KCM5P-Xep38xBH.js} +1 -1
- package/client/dist/assets/{wardleyDiagram-EHGQE667-uhBCZoW0.js → wardleyDiagram-EHGQE667-DKWDpx6g.js} +1 -1
- package/client/dist/assets/{xychartDiagram-FW5EYKEG-xxE_wY5O.js → xychartDiagram-FW5EYKEG-BGcwZTnu.js} +1 -1
- package/client/dist/index.html +27 -27
- package/lib/claude-cli.mjs +173 -173
- package/lib/preflight.mjs +252 -252
- package/lib/probe-path.mjs +84 -84
- package/lib/server.mjs +369 -369
- package/lib/util.mjs +157 -157
- package/lib/win32-spawn.mjs +253 -253
- package/package.json +68 -68
- package/scripts/deploy-procs.mjs +208 -208
- package/scripts/deploy-swap.mjs +276 -276
- package/scripts/kill-targets.js +140 -140
- package/scripts/repair-claude-json.mjs +295 -295
- package/server/dist/config/default-actions.json +90 -90
- package/server/dist/core/mission-context/association.d.ts +46 -0
- package/server/dist/core/mission-context/association.d.ts.map +1 -1
- package/server/dist/core/mission-context/association.js +69 -0
- package/server/dist/core/mission-context/association.js.map +1 -1
- package/server/dist/core/mission-context/resolver-iterate.d.ts +6 -0
- package/server/dist/core/mission-context/resolver-iterate.d.ts.map +1 -0
- package/server/dist/core/mission-context/resolver-iterate.js +202 -0
- package/server/dist/core/mission-context/resolver-iterate.js.map +1 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts +20 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver-parts.js +92 -0
- package/server/dist/core/mission-context/resolver-parts.js.map +1 -1
- package/server/dist/core/mission-context/resolver.d.ts +1 -1
- package/server/dist/core/mission-context/resolver.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver.js +17 -199
- package/server/dist/core/mission-context/resolver.js.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.d.ts +21 -5
- package/server/dist/core/mission-context/run-id-recovery.d.ts.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.js +32 -5
- package/server/dist/core/mission-context/run-id-recovery.js.map +1 -1
- package/server/dist/core/mission-context/scenario.d.ts +18 -11
- package/server/dist/core/mission-context/scenario.d.ts.map +1 -1
- package/server/dist/core/mission-context/scenario.js +40 -3
- package/server/dist/core/mission-context/scenario.js.map +1 -1
- package/server/dist/core/path-guard.d.ts +1 -1
- package/server/dist/core/path-guard.d.ts.map +1 -1
- package/server/dist/core/path-guard.js +9 -2
- package/server/dist/core/path-guard.js.map +1 -1
- package/server/dist/core/shipslog-docs-reader.d.ts +4 -0
- package/server/dist/core/shipslog-docs-reader.d.ts.map +1 -0
- package/server/dist/core/shipslog-docs-reader.js +181 -0
- package/server/dist/core/shipslog-docs-reader.js.map +1 -0
- package/server/dist/core/shipslog-docs-types.d.ts +15 -0
- package/server/dist/core/shipslog-docs-types.d.ts.map +1 -0
- package/server/dist/core/shipslog-docs-types.js +14 -0
- package/server/dist/core/shipslog-docs-types.js.map +1 -0
- package/server/dist/external/design-review/serve.js +27 -27
- package/server/dist/external/mission-context/association-write.d.ts +22 -0
- package/server/dist/external/mission-context/association-write.d.ts.map +1 -0
- package/server/dist/external/mission-context/association-write.js +90 -0
- package/server/dist/external/mission-context/association-write.js.map +1 -0
- package/server/dist/external/mission-context/routes.d.ts.map +1 -1
- package/server/dist/external/mission-context/routes.js +18 -31
- package/server/dist/external/mission-context/routes.js.map +1 -1
- package/server/dist/external/routes.d.ts.map +1 -1
- package/server/dist/external/routes.js +9 -6
- package/server/dist/external/routes.js.map +1 -1
- package/server/dist/external/shipslog-docs/routes.d.ts +10 -0
- package/server/dist/external/shipslog-docs/routes.d.ts.map +1 -0
- package/server/dist/external/shipslog-docs/routes.js +41 -0
- package/server/dist/external/shipslog-docs/routes.js.map +1 -0
- package/server/package.json +1 -1
- package/server/profiles/PROFILE_SCHEMA_VERSION +1 -1
- package/server/profiles/README.md +27 -27
- package/server/profiles/python-plugin-monorepo.json +35 -35
- package/server/profiles/supabase-nextjs.json +253 -253
- package/server/profiles/vite-hono.json +92 -92
- package/client/dist/assets/channel-C_k-9jsa.js +0 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-CsEPq9Ac.js +0 -1
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsEPq9Ac.js +0 -1
- package/client/dist/assets/index-6nZ1bt0a.css +0 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-BW8H33dv.js +0 -1
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-BaRlxcPD.js +0 -8
|
@@ -10,6 +10,7 @@ import { createHash } from "node:crypto";
|
|
|
10
10
|
import { statSync } from "node:fs";
|
|
11
11
|
import { readBoundedFile } from "./fs-read.js";
|
|
12
12
|
import { MAX_DOC_BYTES } from "./worktree-roots.js";
|
|
13
|
+
import { recoverRunIdFromTranscript } from "./run-id-recovery.js";
|
|
13
14
|
import { MISSION_CONTEXT_SCHEMA_VERSION, } from "./types.js";
|
|
14
15
|
/**
|
|
15
16
|
* mtime+size fingerprint of every source a response depends on.
|
|
@@ -86,6 +87,97 @@ export const CACHE_CAP = 256;
|
|
|
86
87
|
export function _clearResolverCache() {
|
|
87
88
|
cache.clear();
|
|
88
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Memoizes a CONFIRMED SUPERSESSION for THIS transcript content against THIS
|
|
92
|
+
* association (iterate-2026-08-31-mission-feed-gaps, scenario.ts rule 2b) —
|
|
93
|
+
* not merely "already checked". Content-fingerprinted, not time-based: a poll
|
|
94
|
+
* with no new transcript content is a guaranteed no-op, and the memo is
|
|
95
|
+
* naturally invalidated the moment the association itself changes (a
|
|
96
|
+
* different key) or the transcript grows (a different fingerprint).
|
|
97
|
+
*
|
|
98
|
+
* Caching the RESULT, not a checked/unchecked boolean, is load-bearing
|
|
99
|
+
* (external code review, openai HIGH): the route persists a confirmed
|
|
100
|
+
* supersession via `supersedeMissionContext` (association.ts) AFTER
|
|
101
|
+
* `resolveMissionContext` returns, so a poll can legitimately land again with
|
|
102
|
+
* the SAME stale `associationRunId` before that write lands (or if it fails
|
|
103
|
+
* outright). A boolean-only memo would then return `null` on that second
|
|
104
|
+
* poll — discarding an already-found answer and reverting the Mission
|
|
105
|
+
* context from the newly recovered run back to the stale one.
|
|
106
|
+
*
|
|
107
|
+
* ONLY a non-null (confirmed, corroborated, provably-newer) recovery is ever
|
|
108
|
+
* cached (external code review, openai MEDIUM): `recoverRunIdFromTranscript`
|
|
109
|
+
* returns `null` for two different reasons — "no marker in this text" (a
|
|
110
|
+
* purely textual fact, already covered by the SEPARATE negative-scan memo in
|
|
111
|
+
* run-id-recovery.ts) and "marker found but corroboration failed", which that
|
|
112
|
+
* module deliberately re-checks every poll because the project's own records
|
|
113
|
+
* can gain the run LATER. Caching a `null` here for the second reason would
|
|
114
|
+
* silently override that decision for the whole rule-2b class, so this memo
|
|
115
|
+
* never stores one. Mirrors the negative-scan memo, kept separate because
|
|
116
|
+
* this one also has to remember WHICH association it checked against, not
|
|
117
|
+
* just whether a marker existed at all.
|
|
118
|
+
*/
|
|
119
|
+
const supersessionResult = new Map();
|
|
120
|
+
const SUPERSESSION_CAP = 512;
|
|
121
|
+
/**
|
|
122
|
+
* A full-content SHA-256, not length+suffix (external code review, openai
|
|
123
|
+
* MEDIUM): two distinct bounded transcript snapshots can share both length
|
|
124
|
+
* and final 256 characters while differing earlier in the tail — exactly
|
|
125
|
+
* where an EARLIER `Run-ID:` footer could sit. A suffix-only fingerprint
|
|
126
|
+
* would then replay a stale memoized answer for genuinely different content
|
|
127
|
+
* instead of re-scanning. Hashing costs one pass over a string already read
|
|
128
|
+
* into memory for the scan this memo exists to skip — cheap relative to what
|
|
129
|
+
* it replaces.
|
|
130
|
+
*/
|
|
131
|
+
function supersessionFingerprint(transcript) {
|
|
132
|
+
return createHash("sha256").update(transcript).digest("hex");
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The memoized, CONFIRMED supersession for this (session, association,
|
|
136
|
+
* transcript-content) triple — `undefined` when none is cached (either this
|
|
137
|
+
* content was never checked, or it was checked and found nothing, which is
|
|
138
|
+
* deliberately never memoized here; a scan is owed either way).
|
|
139
|
+
*/
|
|
140
|
+
export function supersessionMemoHit(sessionUuid, associationRunId, transcript) {
|
|
141
|
+
const entry = supersessionResult.get(`${sessionUuid}::${associationRunId}`);
|
|
142
|
+
if (!entry || entry.fingerprint !== supersessionFingerprint(transcript))
|
|
143
|
+
return undefined;
|
|
144
|
+
return entry.recovered;
|
|
145
|
+
}
|
|
146
|
+
/** Record this triple's CONFIRMED recovery, so the next unchanged poll reuses it instead of re-scanning. */
|
|
147
|
+
export function markSupersessionResult(sessionUuid, associationRunId, transcript, recovered) {
|
|
148
|
+
const key = `${sessionUuid}::${associationRunId}`;
|
|
149
|
+
if (supersessionResult.size >= SUPERSESSION_CAP)
|
|
150
|
+
supersessionResult.clear();
|
|
151
|
+
supersessionResult.set(key, { fingerprint: supersessionFingerprint(transcript), recovered });
|
|
152
|
+
}
|
|
153
|
+
/** Test-only: drop the supersession-check memo between cases. */
|
|
154
|
+
export function _clearSupersessionMemo() {
|
|
155
|
+
supersessionResult.clear();
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Builds the LAZY `recoverTranscriptRunId` thunk `detectScenario` calls for
|
|
159
|
+
* both rule 5 (no association) and rule 2b (supersession check) — wiring the
|
|
160
|
+
* throttle above around `recoverRunIdFromTranscript` in one place so the
|
|
161
|
+
* orchestrator (resolver.ts) stays a one-line call site. `memoHit` is read at
|
|
162
|
+
* BUILD time (this resolve's transcript/association snapshot), not
|
|
163
|
+
* re-evaluated inside the thunk, since neither changes within one call.
|
|
164
|
+
*/
|
|
165
|
+
export function buildRecoveryThunk(projectRoot, sessionUuid, transcript, associationRunId) {
|
|
166
|
+
const memoHit = associationRunId !== null ? supersessionMemoHit(sessionUuid, associationRunId, transcript) : undefined;
|
|
167
|
+
return () => {
|
|
168
|
+
// A cache HIT is a CONFIRMED prior supersession for this exact content —
|
|
169
|
+
// returned as-is, never re-scanned. There is no cached-null case (see the
|
|
170
|
+
// memo's own doc comment): an unconfirmed result always re-scans, since
|
|
171
|
+
// corroboration can succeed later even when the text has not changed.
|
|
172
|
+
if (associationRunId !== null && memoHit !== undefined)
|
|
173
|
+
return memoHit;
|
|
174
|
+
const recovered = recoverRunIdFromTranscript(projectRoot, transcript, sessionUuid);
|
|
175
|
+
if (associationRunId !== null && recovered !== null) {
|
|
176
|
+
markSupersessionResult(sessionUuid, associationRunId, transcript, recovered);
|
|
177
|
+
}
|
|
178
|
+
return recovered;
|
|
179
|
+
};
|
|
180
|
+
}
|
|
89
181
|
/**
|
|
90
182
|
* Bounded read of a document body (mid-run planned impact + the detail
|
|
91
183
|
* endpoint). Atomic: the size cap is enforced against the SAME descriptor the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver-parts.js","sourceRoot":"","sources":["../../../src/core/mission-context/resolver-parts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolver-parts.js","sourceRoot":"","sources":["../../../src/core/mission-context/resolver-parts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { _clearResolverCache } from "./resolver-parts.js";
|
|
1
|
+
export { _clearResolverCache, _clearSupersessionMemo } from "./resolver-parts.js";
|
|
2
2
|
export { readDocumentBody } from "./document-read.js";
|
|
3
3
|
import type { ResolveDeps, ResolveRequest, ResolveResult } from "./resolver-io.js";
|
|
4
4
|
export type { ResolveDeps, ResolveRequest, ResolveResult, } from "./resolver-io.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/resolver.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGnF,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,cAAc,EACnB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,aAAa,CAAC,CAkExB"}
|
|
@@ -10,27 +10,16 @@
|
|
|
10
10
|
* source-mtime `rev` (resolver-parts.ts); merge is refreshed per call
|
|
11
11
|
* (merge-refresh.ts) because it is the one field no source file tracks.
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
14
|
-
export { _clearResolverCache } from "./resolver-parts.js";
|
|
13
|
+
import { buildRecoveryThunk, computeSourceRev, integrityResult, } from "./resolver-parts.js";
|
|
14
|
+
export { _clearResolverCache, _clearSupersessionMemo } from "./resolver-parts.js";
|
|
15
15
|
// Re-exported so the detail endpoint keeps its single import site (§5.2).
|
|
16
16
|
export { readDocumentBody } from "./document-read.js";
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { refreshMerge } from "./merge-refresh.js";
|
|
20
|
-
import { mintDocId } from "./doc-ids.js";
|
|
17
|
+
import { specPath } from "./fold-map.js";
|
|
18
|
+
import { eventsPath } from "./iterate-record.js";
|
|
21
19
|
import { readIteratePointer } from "./pointer.js";
|
|
22
20
|
import { detectScenario } from "./scenario.js";
|
|
23
|
-
import { buildRequirementArtifact, buildSpecArtifact } from "./artifacts.js";
|
|
24
|
-
import { buildCommitArtifact } from "./artifacts-commit.js";
|
|
25
|
-
import { buildSlice2Artifacts, slice2RevPaths } from "./slice2-sources.js";
|
|
26
21
|
import { buildNonIterateContext } from "./slice3-sources.js";
|
|
27
|
-
import {
|
|
28
|
-
import { resolveWorkCompleted } from "./merged-events.js";
|
|
29
|
-
import { campaignSpecCandidates, specCandidates, specHintCandidate, } from "./spec-candidates.js";
|
|
30
|
-
import { recoverRunIdFromTranscript } from "./run-id-recovery.js";
|
|
31
|
-
import { toMissionTests } from "./artifacts-tests.js";
|
|
32
|
-
import { chooseRoot, readAllowedRootsCached, resolveFirstDoc } from "./worktree-roots.js";
|
|
33
|
-
import { MISSION_CONTEXT_SCHEMA_VERSION, } from "./types.js";
|
|
22
|
+
import { resolveIterateContext } from "./resolver-iterate.js";
|
|
34
23
|
/**
|
|
35
24
|
* Resolve the Mission context. Pure read — the caller performs the association
|
|
36
25
|
* write, because persistence needs the store's lock and this module stays
|
|
@@ -39,20 +28,17 @@ import { MISSION_CONTEXT_SCHEMA_VERSION, } from "./types.js";
|
|
|
39
28
|
export async function resolveMissionContext(req, deps = {}) {
|
|
40
29
|
const { projectRoot, sessionUuid } = req;
|
|
41
30
|
const pointer = readIteratePointer(projectRoot, sessionUuid);
|
|
42
|
-
// LAZY.
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
// plan review proposed the guard for a future rule that consulted the footer
|
|
50
|
-
// twice — but a guard would make that mistake invisible, and this is a hot
|
|
51
|
-
// read path where silence is exactly what produced the finding being fixed.
|
|
31
|
+
// LAZY. Called only if rules 1-4 all miss (rule 5) or rule 2b is checking an
|
|
32
|
+
// association for supersession — "at most once per resolve" is pinned by a
|
|
33
|
+
// TEST over the table (recovery-schedule.test.ts), not a guard here (a guard
|
|
34
|
+
// would make a future double-consult invisible, on a hot read path where
|
|
35
|
+
// silence is what produced the finding being fixed). Rule 2b's use is
|
|
36
|
+
// additionally throttled by transcript content — see `buildRecoveryThunk`
|
|
37
|
+
// in resolver-parts.ts for why and how (iterate-2026-08-31-mission-feed-gaps).
|
|
52
38
|
const decision = detectScenario({
|
|
53
39
|
pointer,
|
|
54
40
|
association: req.association ?? null,
|
|
55
|
-
recoverTranscriptRunId: (
|
|
41
|
+
recoverTranscriptRunId: buildRecoveryThunk(projectRoot, sessionUuid, req.transcript, req.association?.runId ?? null),
|
|
56
42
|
actions: req.actions,
|
|
57
43
|
runConfigStatus: req.runConfigStatus,
|
|
58
44
|
phaseTaskId: req.phaseTaskId,
|
|
@@ -85,177 +71,9 @@ export async function resolveMissionContext(req, deps = {}) {
|
|
|
85
71
|
associateSource: "iterate_active_pointer",
|
|
86
72
|
};
|
|
87
73
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
// A worktree git does not know is simply NOT USED as a read root — that is
|
|
93
|
-
// `chooseRoot`'s contract, and it is the normal post-Finalize state, not an
|
|
94
|
-
// integrity failure. MEASURED 2026-07-21: git registered 0 of this project's
|
|
95
|
-
// 20 live pointers' worktrees (removed at Finalize, directory left behind),
|
|
96
|
-
// and the earlier hard failure here erased all six artifacts for every one of
|
|
97
|
-
// them although every run had its record in the main root. See ADR.
|
|
98
|
-
const chosen = chooseRoot(roots, worktreePath);
|
|
99
|
-
// --- Records (the spec candidates below are built from them). The event
|
|
100
|
-
// lookup is (mtime,size)-indexed: ahead of the cache check it is a Map hit.
|
|
101
|
-
const iterateDoc = readIterateDoc(projectRoot, runId);
|
|
102
|
-
// Working tree first, then — for a FINISHED run whose worktree is gone
|
|
103
|
-
// (`!isWorktree`) and whose row is not local — the default remote ref where
|
|
104
|
-
// the squash landed it. This is the "merged but not pulled" case that
|
|
105
|
-
// otherwise leaves only Decisions on the rail (merged-events.ts).
|
|
106
|
-
const { events, mergedRefMiss } = await resolveWorkCompleted(projectRoot, runId, chosen.isWorktree, { git: deps.git });
|
|
107
|
-
const run = events.status === "found" ? events.run : null;
|
|
108
|
-
// --- Spec: known layout, agent-doc hint, then that same campaign path rebuilt
|
|
109
|
-
// from the never-evicted event log — APPENDED, so preference order is
|
|
110
|
-
// unchanged and it only adds reach once the doc evicts (trg-92c0c36b).
|
|
111
|
-
const hint = specHintCandidate(iterateDoc?.specHint);
|
|
112
|
-
const candidates = [
|
|
113
|
-
...specCandidates(runId, slug),
|
|
114
|
-
...(hint ? [hint] : []),
|
|
115
|
-
...campaignSpecCandidates(chosen.root, run?.campaign, run?.subIterateId),
|
|
116
|
-
];
|
|
117
|
-
const doc = resolveFirstDoc(chosen.root, candidates);
|
|
118
|
-
// The rev covers EVERY source used, incl. the iterate + agent docs AND the
|
|
119
|
-
// Slice-2 sources. An input missing from here is an input FROZEN by the cache.
|
|
120
|
-
const rev = computeSourceRev([
|
|
121
|
-
...baseRevPaths,
|
|
122
|
-
iterateDocPath(projectRoot, runId),
|
|
123
|
-
...slice2RevPaths(projectRoot, runId),
|
|
124
|
-
...(doc.ok ? [doc.absolute] : []),
|
|
125
|
-
], [runId, chosen.root, req.taskId]);
|
|
126
|
-
// Task terminal state is server-owned input, not a filesystem revision. It
|
|
127
|
-
// must participate in the cache identity so a completed task cannot reuse a
|
|
128
|
-
// previously-live context while its worktree and event log are unchanged.
|
|
129
|
-
const cacheKey = `${projectRoot}::${sessionUuid}::${runId}::${req.taskTerminal ? "terminal" : "active"}`;
|
|
130
|
-
// Persist on a LIVE pointer, and on a corroborated transcript recovery — which
|
|
131
|
-
// is the whole point of the recovery: pay the scan once. Read back off the
|
|
132
|
-
// WINNING rule, so the id and its provenance cannot disagree; an id that came
|
|
133
|
-
// from the store is not re-persisted.
|
|
134
|
-
const associate = decision.runIdSource === "pointer" || decision.runIdSource === "transcript" ? runId : null;
|
|
135
|
-
const associateSource = decision.runIdSource === "transcript" ? "transcript_run_id" : "iterate_active_pointer";
|
|
136
|
-
const hit = cache.get(cacheKey);
|
|
137
|
-
if (hit && hit.rev === rev) {
|
|
138
|
-
// NOT returned verbatim — merge is the one time-varying field and must be
|
|
139
|
-
// re-derived, or it freezes at "pending" forever. See merge-refresh.ts.
|
|
140
|
-
return {
|
|
141
|
-
context: await refreshMerge(hit.context, projectRoot, req.transcript, deps),
|
|
142
|
-
associateRunId: associate,
|
|
143
|
-
associateSource,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
let documentId = null, title = null, specText = null;
|
|
147
|
-
if (doc.ok) {
|
|
148
|
-
// BY INDEX — a suffix-compare against the realpath misses on a leaf-casing
|
|
149
|
-
// normalisation and silently pairs candidates[0] with the OTHER file's
|
|
150
|
-
// fingerprint (see resolveFirstDoc).
|
|
151
|
-
// BY INDEX — what resolveFirstDoc returns it for. See
|
|
152
|
-
// resolver.candidate-pairing.test.ts for why re-deriving it is a trap.
|
|
153
|
-
const rel = candidates[doc.index].join("/");
|
|
154
|
-
title = rel.slice(rel.lastIndexOf("/") + 1);
|
|
155
|
-
documentId = mintDocId({
|
|
156
|
-
t: req.taskId,
|
|
157
|
-
s: sessionUuid,
|
|
158
|
-
p: projectRoot,
|
|
159
|
-
r: runId,
|
|
160
|
-
root: chosen.root,
|
|
161
|
-
rel,
|
|
162
|
-
rev,
|
|
163
|
-
f: docFingerprint(doc.absolute),
|
|
164
|
-
});
|
|
165
|
-
specText = readBounded(doc.absolute);
|
|
166
|
-
}
|
|
167
|
-
const foldMap = loadFoldMap(projectRoot);
|
|
168
|
-
const requirementsDocument = mintDocId({
|
|
169
|
-
t: req.taskId,
|
|
170
|
-
s: sessionUuid,
|
|
171
|
-
p: projectRoot,
|
|
172
|
-
r: runId,
|
|
173
|
-
root: projectRoot,
|
|
174
|
-
rel: SPEC_REL_PARTS.join("/"),
|
|
175
|
-
rev,
|
|
176
|
-
f: docFingerprint(specPath(projectRoot)),
|
|
177
|
-
});
|
|
178
|
-
// --- Commit + merge -------------------------------------------------------
|
|
179
|
-
// The marker must belong to THIS project's own origin repo (a sibling repo's
|
|
180
|
-
// PR number would grep our origin/main), and merge is only checked once the
|
|
181
|
-
// run completed — a per-poll git call mid-run is waste (§5.3).
|
|
182
|
-
const marker = extractPrMarker(req.transcript, await readOriginSlug(projectRoot, deps.git));
|
|
183
|
-
const merge = run && marker
|
|
184
|
-
? await checkSquashMerged(projectRoot, marker.number, { git: deps.git, ...deps.merge })
|
|
185
|
-
: "unknown";
|
|
186
|
-
const slice2 = await buildSlice2Artifacts({
|
|
187
|
-
projectRoot,
|
|
188
|
-
runId,
|
|
189
|
-
events,
|
|
190
|
-
commit: run?.commit?.trim() || null,
|
|
191
|
-
git: deps.git,
|
|
192
|
-
});
|
|
193
|
-
// `runLive` retains its visual worktree meaning. Requirement planning has a
|
|
194
|
-
// separate authority: the server-owned task state, which can mark a run
|
|
195
|
-
// terminal while a worktree lingers (or active while root selection fell back).
|
|
196
|
-
const runLive = chosen.isWorktree && !req.taskTerminal && events.status !== "found";
|
|
197
|
-
const requirementLive = !req.taskTerminal && events.status !== "found";
|
|
198
|
-
// CONTRACT §6 order: Spec · Requirement · Tests · Review · Decisions · Commit.
|
|
199
|
-
const artifacts = [
|
|
200
|
-
buildSpecArtifact({
|
|
201
|
-
documentId,
|
|
202
|
-
title,
|
|
203
|
-
denied: !doc.ok && doc.reason === "denied",
|
|
204
|
-
fromWorktree: chosen.isWorktree,
|
|
205
|
-
intent: run?.intent ?? null,
|
|
206
|
-
}),
|
|
207
|
-
buildRequirementArtifact({
|
|
208
|
-
foldMap,
|
|
209
|
-
doc: iterateDoc,
|
|
210
|
-
events,
|
|
211
|
-
specText,
|
|
212
|
-
runLive: requirementLive,
|
|
213
|
-
sourceDocument: {
|
|
214
|
-
documentId: requirementsDocument,
|
|
215
|
-
title: "Requirements specification",
|
|
216
|
-
},
|
|
217
|
-
}),
|
|
218
|
-
...slice2.artifacts,
|
|
219
|
-
buildCommitArtifact({ events, prNumber: marker?.number ?? null, prUrl: marker?.url ?? null, merge }),
|
|
220
|
-
];
|
|
221
|
-
const requirement = artifacts[1];
|
|
222
|
-
const servesFrId = requirement.kind === "requirement" && requirement.detail?.rows.length
|
|
223
|
-
? requirement.detail.rows[0].displayFrId
|
|
224
|
-
: null;
|
|
225
|
-
const context = {
|
|
226
|
-
schemaVersion: MISSION_CONTEXT_SCHEMA_VERSION,
|
|
227
|
-
scenario: "iterate",
|
|
228
|
-
missionTabVisible: true,
|
|
229
|
-
runId,
|
|
230
|
-
// IN FLIGHT = git still registers the pointer's worktree AND the run has not
|
|
231
|
-
// recorded completion. The worktree alone is a filesystem PROXY (external
|
|
232
|
-
// plan review, openai MEDIUM): an abandoned or already-finished run can
|
|
233
|
-
// leave a registered worktree behind, and "pending" for a run that is over
|
|
234
|
-
// is the same lie in the other direction. A `work_completed` record is a
|
|
235
|
-
// terminal fact, so it ends live-ness. Both inputs participate in `rev`
|
|
236
|
-
// (`chosen.root` + the event log's mtime), so neither can freeze in cache.
|
|
237
|
-
runLive,
|
|
238
|
-
artifacts,
|
|
239
|
-
// Shares artifacts-tests.ts's constructor so this never diverges from
|
|
240
|
-
// the Tests artifact's own `detail.results` on the `{0,0}` edge case.
|
|
241
|
-
tests: run ? toMissionTests(run.tests, run.ts) : null,
|
|
242
|
-
servesFrId,
|
|
243
|
-
sourceRev: rev,
|
|
244
|
-
};
|
|
245
|
-
// A TRANSIENT git failure is not cached: git's answer is not a statted file,
|
|
246
|
-
// so it cannot participate in `rev`, and caching it would pin Tests at
|
|
247
|
-
// "currently unavailable" until an unrelated source file changed. A merged-ref
|
|
248
|
-
// MISS is excluded for the same reason — the run may land on the ref after a
|
|
249
|
-
// later fetch, which `rev` would not see; re-resolving is cheap (the ref blob
|
|
250
|
-
// is TTL-cached in merged-events). A merged-ref HIT is stable and caches.
|
|
251
|
-
if (slice2.cacheable && !mergedRefMiss) {
|
|
252
|
-
if (cache.size >= CACHE_CAP)
|
|
253
|
-
cache.clear();
|
|
254
|
-
cache.set(cacheKey, { rev, context });
|
|
255
|
-
}
|
|
256
|
-
// `associate` comes from EVIDENCE — a validated pointer or a corroborated
|
|
257
|
-
// footer — never from the task's `state`, which decays to `idle` on a parked
|
|
258
|
-
// design gate. See association.ts.
|
|
259
|
-
return { context, associateRunId: associate, associateSource };
|
|
74
|
+
// The iterate-scenario body (spec/requirement/commit artifact assembly,
|
|
75
|
+
// caching, association) lives in resolver-iterate.ts — split out to stay
|
|
76
|
+
// under the file-size limit; this hand-off is the sole call site.
|
|
77
|
+
return resolveIterateContext(req, deps, decision, decision.runId, pointer, baseRevPaths);
|
|
260
78
|
}
|
|
261
79
|
//# sourceMappingURL=resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/mission-context/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/mission-context/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,19 @@ export declare const MAX_SCAN_CHARS: number;
|
|
|
15
15
|
* point that adds evidence.
|
|
16
16
|
*/
|
|
17
17
|
export declare function findRunIdFooter(transcript: string): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* True only when `candidate` is PROVABLY newer than `current` by its embedded
|
|
20
|
+
* date — a same-day or unparseable id is NOT proof either way, and the caller
|
|
21
|
+
* (scenario.ts rule 2b) must fail toward the server-observed association
|
|
22
|
+
* rather than an ambiguous comparison (external code review, openai MEDIUM).
|
|
23
|
+
* This is what closes the KNOWN LIMITATION disclosed above `isUserTypeLine`:
|
|
24
|
+
* an assistant turn that merely NARRATES an older run's footer in prose can
|
|
25
|
+
* still survive `stripUserTypeLines` and be picked as "last" — previously
|
|
26
|
+
* that could only promote a session with NO association at all (rule 5, low
|
|
27
|
+
* stakes), but without this check it could DOWNGRADE a correct,
|
|
28
|
+
* server-observed association back to an older run.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isProvablyNewerRunId(candidate: string, current: string): boolean;
|
|
18
31
|
/**
|
|
19
32
|
* Does THIS project's own record set know `runId`?
|
|
20
33
|
*
|
|
@@ -28,11 +41,14 @@ export declare function _clearRecoveryMemo(): void;
|
|
|
28
41
|
/**
|
|
29
42
|
* The recovered run id for this session, or null.
|
|
30
43
|
*
|
|
31
|
-
* Called
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
44
|
+
* Called from rule 5 of the ordered scenario table (scenario.ts) once rules
|
|
45
|
+
* 1-4 — custom-actions, pointer, association, pipeline, campaign — have all
|
|
46
|
+
* missed, AND from rule 2b to check whether a stale association has been
|
|
47
|
+
* superseded (iterate-2026-08-31-mission-feed-gaps). Rule 5's caller RESOLVES
|
|
48
|
+
* on the answer and the route persists it, so that path pays the scan once
|
|
49
|
+
* per task. Rule 2b's use is separately throttled by transcript content in
|
|
50
|
+
* resolver-parts.ts (`buildRecoveryThunk`), so it likewise does not re-pay the
|
|
51
|
+
* scan on every unchanged poll.
|
|
36
52
|
*
|
|
37
53
|
* It was not always so: until iterate-2026-07-21-mission-recovery-memo-perf the
|
|
38
54
|
* resolver computed this BEFORE the table, so a campaign- or pipeline-resolved
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-id-recovery.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAc,CAAC;AAkF1C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAejE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIxE;AAkCD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED
|
|
1
|
+
{"version":3,"file":"run-id-recovery.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAc,CAAC;AAkF1C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAejE;AAQD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKhF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIxE;AAkCD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAqBf"}
|
|
@@ -148,6 +148,30 @@ export function findRunIdFooter(transcript) {
|
|
|
148
148
|
}
|
|
149
149
|
return last;
|
|
150
150
|
}
|
|
151
|
+
/** The `YYYY-MM-DD` embedded in a canonical `iterate-<date>-<slug>` run id, or null. */
|
|
152
|
+
function runIdDate(runId) {
|
|
153
|
+
const m = /^iterate-(\d{4}-\d{2}-\d{2})-/.exec(runId);
|
|
154
|
+
return m ? m[1] : null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* True only when `candidate` is PROVABLY newer than `current` by its embedded
|
|
158
|
+
* date — a same-day or unparseable id is NOT proof either way, and the caller
|
|
159
|
+
* (scenario.ts rule 2b) must fail toward the server-observed association
|
|
160
|
+
* rather than an ambiguous comparison (external code review, openai MEDIUM).
|
|
161
|
+
* This is what closes the KNOWN LIMITATION disclosed above `isUserTypeLine`:
|
|
162
|
+
* an assistant turn that merely NARRATES an older run's footer in prose can
|
|
163
|
+
* still survive `stripUserTypeLines` and be picked as "last" — previously
|
|
164
|
+
* that could only promote a session with NO association at all (rule 5, low
|
|
165
|
+
* stakes), but without this check it could DOWNGRADE a correct,
|
|
166
|
+
* server-observed association back to an older run.
|
|
167
|
+
*/
|
|
168
|
+
export function isProvablyNewerRunId(candidate, current) {
|
|
169
|
+
const candidateDate = runIdDate(candidate);
|
|
170
|
+
const currentDate = runIdDate(current);
|
|
171
|
+
if (!candidateDate || !currentDate)
|
|
172
|
+
return false;
|
|
173
|
+
return candidateDate > currentDate;
|
|
174
|
+
}
|
|
151
175
|
/**
|
|
152
176
|
* Does THIS project's own record set know `runId`?
|
|
153
177
|
*
|
|
@@ -202,11 +226,14 @@ export function _clearRecoveryMemo() {
|
|
|
202
226
|
/**
|
|
203
227
|
* The recovered run id for this session, or null.
|
|
204
228
|
*
|
|
205
|
-
* Called
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
229
|
+
* Called from rule 5 of the ordered scenario table (scenario.ts) once rules
|
|
230
|
+
* 1-4 — custom-actions, pointer, association, pipeline, campaign — have all
|
|
231
|
+
* missed, AND from rule 2b to check whether a stale association has been
|
|
232
|
+
* superseded (iterate-2026-08-31-mission-feed-gaps). Rule 5's caller RESOLVES
|
|
233
|
+
* on the answer and the route persists it, so that path pays the scan once
|
|
234
|
+
* per task. Rule 2b's use is separately throttled by transcript content in
|
|
235
|
+
* resolver-parts.ts (`buildRecoveryThunk`), so it likewise does not re-pay the
|
|
236
|
+
* scan on every unchanged poll.
|
|
210
237
|
*
|
|
211
238
|
* It was not always so: until iterate-2026-07-21-mission-recovery-memo-perf the
|
|
212
239
|
* resolver computed this BEFORE the table, so a campaign- or pipeline-resolved
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-id-recovery.js","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"run-id-recovery.js","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,17 +39,18 @@ export interface ScenarioInputs {
|
|
|
39
39
|
* A run id recovered from this session's OWN transcript and already
|
|
40
40
|
* corroborated by the project's records (`run-id-recovery.ts`).
|
|
41
41
|
*
|
|
42
|
-
* The last-resort identification source
|
|
43
|
-
* build shipped: measured 2026-07-21, only 19 of
|
|
44
|
-
* could be identified from a pointer or an
|
|
45
|
-
*
|
|
46
|
-
* is open during the run.
|
|
42
|
+
* The last-resort identification source when NO association exists, for the
|
|
43
|
+
* tasks that ran before this build shipped: measured 2026-07-21, only 19 of
|
|
44
|
+
* this project's 150 sessions could be identified from a pointer or an
|
|
45
|
+
* association, because the pointer is pruned at Finalize and the
|
|
46
|
+
* association is only written while the Mission tab is open during the run.
|
|
47
47
|
*
|
|
48
|
-
* Ranked BELOW pipeline and campaign
|
|
49
|
-
* is a SERVER-OBSERVED fact (this session really was running that iterate),
|
|
50
|
-
* whereas the footer is text the session happens to contain. Measured, a
|
|
48
|
+
* Ranked BELOW pipeline and campaign in THAT (no-association) branch: a
|
|
51
49
|
* campaign session quotes its sub-iterates' footers — ranking this higher
|
|
52
|
-
* would demote a genuine campaign to `iterate`.
|
|
50
|
+
* there would demote a genuine campaign to `iterate`. Rule 2b (above) also
|
|
51
|
+
* consults this thunk, but only to check whether a corroborated footer
|
|
52
|
+
* SUPERSEDES an existing, possibly stale, association — never to out-rank
|
|
53
|
+
* pipeline/campaign, since 2b's own branch is reached before 3/4 regardless.
|
|
53
54
|
*
|
|
54
55
|
* A THUNK, not a value, and that is the whole point (internal code review of
|
|
55
56
|
* PR #309, PERF). Computing it eagerly meant a campaign- or pipeline-resolved
|
|
@@ -57,7 +58,10 @@ export interface ScenarioInputs {
|
|
|
57
58
|
* the record lookup on every poll forever: it never reached rule 5, so nothing
|
|
58
59
|
* ever persisted, and the negative memo does not cover a POSITIVE find.
|
|
59
60
|
* Deferring removes that work instead of remembering it, and makes this table
|
|
60
|
-
* the single place that decides whether the footer matters at all.
|
|
61
|
+
* the single place that decides whether the footer matters at all. The
|
|
62
|
+
* resolver additionally rate-limits its OWN invocation from rule 2b by
|
|
63
|
+
* transcript content, so a stable association is not re-scanned on every
|
|
64
|
+
* poll either (resolver.ts).
|
|
61
65
|
*/
|
|
62
66
|
recoverTranscriptRunId?: (() => string | null) | null;
|
|
63
67
|
/** Actions catalog facts, resolved SERVER-side from the project. */
|
|
@@ -111,7 +115,10 @@ export interface ScenarioDecision {
|
|
|
111
115
|
* pointer and the transcript, never for the one it read back from the store —
|
|
112
116
|
* deriving that from `pointer.status` plus a separately-computed candidate is
|
|
113
117
|
* how the two could disagree (they did: the association branch reported
|
|
114
|
-
* `transcript_run_id` beside a null id).
|
|
118
|
+
* `transcript_run_id` beside a null id). `"transcript"` now also covers rule
|
|
119
|
+
* 2b's supersession case — a corroborated footer overriding a stale
|
|
120
|
+
* association is exactly as persistence-worthy as one identifying a session
|
|
121
|
+
* with no association at all.
|
|
115
122
|
*/
|
|
116
123
|
runIdSource: "pointer" | "association" | "transcript" | null;
|
|
117
124
|
/** Set when a pointer existed but could not be trusted (§5.1e) → `unavailable`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/scenario.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/scenario.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAKjD,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB;AAC3B,gFAAgF;AAC9E,IAAI;AACN,sEAAsE;GACpE,SAAS;AACX,sFAAsF;GACpF,YAAY,CAAC;AAEjB,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,OAAO,EAAE,iBAAiB,CAAC;IAC3B;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,sBAAsB,CAAC,EAAE,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,oEAAoE;IACpE,OAAO,EAAE;QACP,oEAAoE;QACpE,QAAQ,EAAE,OAAO,CAAC;QAClB,wEAAwE;QACxE,cAAc,EAAE,OAAO,CAAC;QACxB,gCAAgC;QAChC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;KAC9B,GAAG,IAAI,CAAC;IACT,iFAAiF;IACjF,eAAe,EAAE,iBAAiB,CAAC;IACnC,kDAAkD;IAClD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAmBxE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;;;;OASG;IACH,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,IAAI,CAAC;IAC7D,mFAAmF;IACnF,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA6GvE"}
|