specrails-core 5.1.0 → 5.2.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.
- package/dist/installer/commands/init.js +7 -1
- package/dist/installer/commands/init.js.map +1 -1
- package/dist/installer/commands/update.js +7 -1
- package/dist/installer/commands/update.js.map +1 -1
- package/dist/installer/phases/scaffold.js +7 -0
- package/dist/installer/phases/scaffold.js.map +1 -1
- package/dist/installer/runtime/pipeline-state.js +130 -6
- package/dist/installer/runtime/pipeline-state.js.map +1 -1
- package/dist/installer/util/fs.js +130 -0
- package/dist/installer/util/fs.js.map +1 -1
- package/dist/installer/util/install-transaction.js +33 -13
- package/dist/installer/util/install-transaction.js.map +1 -1
- package/docs/user-docs/provider-pipelines.md +43 -0
- package/integration-contract.json +4 -1
- package/package.json +1 -1
- package/templates/agents/sr-architect.md +9 -0
- package/templates/agents/sr-developer.md +9 -0
- package/templates/agents/sr-reviewer.md +11 -0
- package/templates/codex-skills/rails/sr-architect/SKILL.md +9 -0
- package/templates/codex-skills/rails/sr-developer/SKILL.md +9 -0
- package/templates/codex-skills/rails/sr-reviewer/SKILL.md +11 -0
- package/templates/commands/specrails/implement.md +42 -0
- package/templates/runtime/provider-pipeline.md +42 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { closeSync,
|
|
1
|
+
import { closeSync, existsSync, linkSync, lstatSync, mkdirSync, mkdtempSync, openSync, readFileSync, readdirSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import { realpathSync as requireRealpath } from 'node:fs';
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
import { InstallerError } from './errors.js';
|
|
7
7
|
import { isReservedPath, RESERVED_PATHS } from './paths.js';
|
|
8
|
+
import { restoreTree, snapshotTree } from './fs.js';
|
|
8
9
|
function exists(file) {
|
|
9
10
|
try {
|
|
10
11
|
lstatSync(file);
|
|
@@ -139,17 +140,35 @@ function removeForRollback(target, relative) {
|
|
|
139
140
|
}
|
|
140
141
|
/** Snapshot only installer-owned surfaces; never follow links into a shared framework.
|
|
141
142
|
* Backups survive a failed rollback and their location is reported for recovery.
|
|
143
|
+
*
|
|
144
|
+
* Snapshotting requires NO filesystem privilege: links are recorded by target
|
|
145
|
+
* rather than recreated (see `snapshotTree`), so a protected surface that is —
|
|
146
|
+
* or contains — a Windows junction no longer fails the install on an account
|
|
147
|
+
* without SeCreateSymbolicLinkPrivilege.
|
|
142
148
|
*/
|
|
143
149
|
export async function withInstallRollback(paths, apply) {
|
|
144
150
|
const backup = mkdtempSync(path.join(os.tmpdir(), 'specrails-update-backup-'));
|
|
145
|
-
const
|
|
151
|
+
const seen = new Set();
|
|
152
|
+
const snapshots = [];
|
|
153
|
+
for (const entry of paths) {
|
|
154
|
+
const target = typeof entry === 'string' ? entry : entry.path;
|
|
155
|
+
if (seen.has(target))
|
|
156
|
+
continue;
|
|
157
|
+
seen.add(target);
|
|
158
|
+
snapshots.push({
|
|
159
|
+
target,
|
|
160
|
+
saved: path.join(backup, String(snapshots.length)),
|
|
161
|
+
present: exists(target),
|
|
162
|
+
snapshotContents: typeof entry === 'string' ? true : entry.snapshotContents,
|
|
163
|
+
links: [],
|
|
164
|
+
});
|
|
165
|
+
}
|
|
146
166
|
let retainBackup = false;
|
|
147
167
|
try {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
cpSync(row.target, row.saved, { recursive: true, dereference: false, verbatimSymlinks: true, filter: () => true, mode: constants.COPYFILE_FICLONE });
|
|
168
|
+
for (const row of snapshots) {
|
|
169
|
+
if (row.present && row.snapshotContents)
|
|
170
|
+
row.links = snapshotTree(row.target, row.saved);
|
|
171
|
+
}
|
|
153
172
|
try {
|
|
154
173
|
return await apply();
|
|
155
174
|
}
|
|
@@ -157,16 +176,17 @@ export async function withInstallRollback(paths, apply) {
|
|
|
157
176
|
const failures = [];
|
|
158
177
|
for (const row of [...snapshots].reverse()) {
|
|
159
178
|
try {
|
|
179
|
+
// A pre-existing surface we deliberately did not copy is left alone:
|
|
180
|
+
// there is no backup to put back, and removing it would destroy work
|
|
181
|
+
// the transaction never owned.
|
|
182
|
+
if (row.present && !row.snapshotContents)
|
|
183
|
+
continue;
|
|
160
184
|
const relative = path.basename(row.target);
|
|
161
185
|
removeForRollback(row.target, relative);
|
|
162
186
|
if (row.present) {
|
|
163
187
|
mkdirSync(path.dirname(row.target), { recursive: true });
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
// Node 20 on Windows passes namespaced paths (\\?\) to
|
|
167
|
-
// cpSync filters; newer releases may pass ordinary paths. Put
|
|
168
|
-
// both operands in the same namespace before checking ownership.
|
|
169
|
-
filter: (source) => !isReservedPath([relative, path.relative(path.toNamespacedPath(row.saved), path.toNamespacedPath(source)).split(path.sep).join('/')].filter(Boolean).join('/')),
|
|
188
|
+
restoreTree(row.saved, row.target, row.links, {
|
|
189
|
+
skip: (rel) => isReservedPath([relative, rel].filter(Boolean).join('/')),
|
|
170
190
|
});
|
|
171
191
|
}
|
|
172
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-transaction.js","sourceRoot":"","sources":["../../../src/installer/util/install-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"install-transaction.js","sourceRoot":"","sources":["../../../src/installer/util/install-transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,3 +51,46 @@ make paid model calls or claim identical behavior across every native CLI releas
|
|
|
51
51
|
|
|
52
52
|
See [Core installation and update consistency](core-updates.md) for version
|
|
53
53
|
selection, rollback and Desktop integration.
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
## Acceptance evidence and completion
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
After development, normal review MUST write `stateDir/acceptance.json` and run
|
|
60
|
+
`acceptance --request <absolute-path>` before `phase --phase reviewer --status done`.
|
|
61
|
+
The request is `{criteria: [...], checks: [...], findings: [...]}`:
|
|
62
|
+
- Each criterion has `specId` (string), `criterionIndex` (zero-based), `requirement`
|
|
63
|
+
(exact frozen text), `status` (`met`, `exception`, `blocked`, `pending`) and a
|
|
64
|
+
nonempty `evidence` array of concrete code/test/capture references and observations.
|
|
65
|
+
Cover every frozen acceptance criterion once. If a spec has no explicit criteria,
|
|
66
|
+
use its complete frozen description (or title if empty) at index 0.
|
|
67
|
+
- An `exception` MUST include `{reason, impact, material, acceptedBy, approvalEvidence}`.
|
|
68
|
+
`acceptedBy` is `reviewer`, `user`, or `host`. Material scope changes require actual
|
|
69
|
+
user/host authorization; do not invent approval or label material changes minor.
|
|
70
|
+
Previously authorized decisions need no new confirmation. Unresolved requirements
|
|
71
|
+
remain `blocked` or `pending`, never `met` through a rewritten interpretation.
|
|
72
|
+
- Each check has `{name, status, required, evidence, scope, limitations}`; status is
|
|
73
|
+
`passed`, `failed`, or `unavailable`. Include required and supplementary checks from
|
|
74
|
+
the design. Record the original required classification; never downgrade a failed
|
|
75
|
+
check to make the gate pass. For benchmarks state what is measured and excluded:
|
|
76
|
+
a Node microbenchmark does not establish browser Canvas/GPU/frame performance.
|
|
77
|
+
- `findings` lists concrete review conclusions, risks and resolutions; use an empty
|
|
78
|
+
array only when no findings remain. Numeric confidence cannot replace this report.
|
|
79
|
+
|
|
80
|
+
The runtime binds this evidence to frozen scope, source and design. Missing/stale
|
|
81
|
+
acceptance or unresolved requirements/required checks block review and archive.
|
|
82
|
+
Accepted exceptions and supplementary failures produce `with-exceptions` validation.
|
|
83
|
+
Replacing the report requires review and archive authorization again; a green command
|
|
84
|
+
receipt alone is insufficient. Evidence references and approval attribution remain
|
|
85
|
+
reviewer assertions, not independently authenticated proof of human approval.
|
|
86
|
+
|
|
87
|
+
Keep operational completion notes, check requests and reports in `stateDir` from
|
|
88
|
+
start to finish. Run scoped checks for repairs and one final full verification after
|
|
89
|
+
all edits. Reuse that full receipt while runtime status says it is valid and its
|
|
90
|
+
commands cover required checks. New prose/phase handoffs alone do not warrant reruns.
|
|
91
|
+
|
|
92
|
+
End with ONE concise summary from runtime `status.completion`: implementation,
|
|
93
|
+
validation (including exceptions), archive, delivery, and evidence references.
|
|
94
|
+
Host-owned delivery stays `pending-host`; do not call uncommitted files "landed".
|
|
95
|
+
Report phase durations/attempts from `status.phases`; report per-phase cost only when
|
|
96
|
+
provider telemetry attributes it, otherwise unavailable. Do not invent cost splits.
|
|
@@ -259,12 +259,15 @@
|
|
|
259
259
|
"status",
|
|
260
260
|
"phase",
|
|
261
261
|
"verify",
|
|
262
|
+
"acceptance",
|
|
262
263
|
"archive-check",
|
|
263
264
|
"preview",
|
|
264
265
|
"apply-preview"
|
|
265
266
|
],
|
|
266
267
|
"statePath": "<backlogRoot>/.specrails/pipeline/<runId>/state.json",
|
|
267
268
|
"verification": "Successful argv-based commands captured by the runtime, bound to frozen scope, candidate files and relevant execution environment. Unknown or stale evidence cannot pass archive.",
|
|
268
|
-
"hostOwnership": "Host worktrees are used directly; host git/backlog are not mutated by Core delivery."
|
|
269
|
+
"hostOwnership": "Host worktrees are used directly; host git/backlog are not mutated by Core delivery.",
|
|
270
|
+
"acceptance": "acceptance --request JSON records every exact frozen requirement, evidence, exception authority, check scope/limitations and findings. Required by reviewer done/archive-check; bound to scope, candidate and design.",
|
|
271
|
+
"completion": "status.completion separates implementation, validation (verified|with-exceptions|pending|blocked), archive and delivery (pending-host|complete|pending); status.phases includes observed durationMs and attempts."
|
|
269
272
|
}
|
|
270
273
|
}
|
package/package.json
CHANGED
|
@@ -313,3 +313,12 @@ This is non-negotiable for code-navigation work: plugin authors choose tools bec
|
|
|
313
313
|
- Is this a symbol/reference/definition lookup? → MCP tool, not `Grep`/`Read`.
|
|
314
314
|
- Am I about to read a file just to edit one function? → MCP tool, not `Read` + `Edit`.
|
|
315
315
|
- No documented MCP tool fits the current need? → built-in, document why in your reasoning.
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
## Acceptance and measurement plan
|
|
319
|
+
|
|
320
|
+
Map frozen requirements to behavioral evidence before implementation. Declare required
|
|
321
|
+
and supplementary checks and their measurement scope/limitations. Visual work needs
|
|
322
|
+
real rendered evidence at supported viewports and peak effect states; browser frame
|
|
323
|
+
performance needs browser measurements. Flag contradictory requirements and material
|
|
324
|
+
scope interpretations explicitly; do not weaken frozen acceptance text in the design.
|
|
@@ -272,3 +272,12 @@ Guidelines:
|
|
|
272
272
|
## MEMORY.md
|
|
273
273
|
|
|
274
274
|
Your MEMORY.md is currently empty.
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
## Verification evidence handoff
|
|
278
|
+
|
|
279
|
+
Keep operational notes and check requests under runtime `stateDir`, outside the design
|
|
280
|
+
artifacts. Supply evidence per frozen requirement and report failed/unavailable checks.
|
|
281
|
+
Declare benchmark scope and exclusions; Node timings do not prove browser frame time.
|
|
282
|
+
Use scoped checks during repairs and one final full receipt, reused while valid.
|
|
283
|
+
Return a concise handoff; the coordinator owns the single final run summary.
|
|
@@ -369,3 +369,14 @@ This is non-negotiable for code-navigation work: plugin authors choose tools bec
|
|
|
369
369
|
- Is this a symbol/reference/definition lookup? → MCP tool, not `Grep`/`Read`.
|
|
370
370
|
- Am I about to read a file just to edit one function? → MCP tool, not `Read` + `Edit`.
|
|
371
371
|
- No documented MCP tool fits the current need? → built-in, document why in your reasoning.
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
## Structured acceptance handoff
|
|
375
|
+
|
|
376
|
+
Follow the executable pipeline acceptance contract. Return a `stateDir/acceptance.json`
|
|
377
|
+
request covering every frozen requirement with evidence, explicit exceptions, required
|
|
378
|
+
and supplementary checks (including benchmark scope/limitations), and concrete findings.
|
|
379
|
+
Have the coordinator record it with `acceptance --request` before reviewer done and
|
|
380
|
+
archive-check. Inspect visual evidence at supported viewports and extreme states for
|
|
381
|
+
visual changes. A confidence score or checked tasks cannot substitute for acceptance.
|
|
382
|
+
Do not self-authorize material scope changes; cite actual existing user/host decisions.
|
|
@@ -312,3 +312,12 @@ state is corrupt, etc.), instead reply with:
|
|
|
312
312
|
|
|
313
313
|
and end your turn. Do not invent fake plans or empty OpenSpec
|
|
314
314
|
packages to keep the pipeline moving.
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
## Acceptance and measurement plan
|
|
318
|
+
|
|
319
|
+
Map frozen requirements to behavioral evidence before implementation. Declare required
|
|
320
|
+
and supplementary checks and their measurement scope/limitations. Visual work needs
|
|
321
|
+
real rendered evidence at supported viewports and peak effect states; browser frame
|
|
322
|
+
performance needs browser measurements. Flag contradictory requirements and material
|
|
323
|
+
scope interpretations explicitly; do not weaken frozen acceptance text in the design.
|
|
@@ -205,3 +205,12 @@ no executable behaviour to test), reply with:
|
|
|
205
205
|
|
|
206
206
|
and end your turn. Do not invent half-implementations or
|
|
207
207
|
skip the RED step to pretend a task was completed.
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
## Verification evidence handoff
|
|
211
|
+
|
|
212
|
+
Keep operational notes and check requests under runtime `stateDir`, outside the design
|
|
213
|
+
artifacts. Supply evidence per frozen requirement and report failed/unavailable checks.
|
|
214
|
+
Declare benchmark scope and exclusions; Node timings do not prove browser frame time.
|
|
215
|
+
Use scoped checks during repairs and one final full receipt, reused while valid.
|
|
216
|
+
Return a concise handoff; the coordinator owns the single final run summary.
|
|
@@ -289,3 +289,14 @@ Verdict: <"clean" | "fix needed: <one-sentence>" | "blocked: <reason>">
|
|
|
289
289
|
Then end your turn. The orchestrator decides whether to spawn
|
|
290
290
|
a second developer pass (if "fix needed") or to close the
|
|
291
291
|
ticket (if "clean").
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
## Structured acceptance handoff
|
|
295
|
+
|
|
296
|
+
Follow the executable pipeline acceptance contract. Return a `stateDir/acceptance.json`
|
|
297
|
+
request covering every frozen requirement with evidence, explicit exceptions, required
|
|
298
|
+
and supplementary checks (including benchmark scope/limitations), and concrete findings.
|
|
299
|
+
Have the coordinator record it with `acceptance --request` before reviewer done and
|
|
300
|
+
archive-check. Inspect visual evidence at supported viewports and extreme states for
|
|
301
|
+
visual changes. A confidence score or checked tasks cannot substitute for acceptance.
|
|
302
|
+
Do not self-authorize material scope changes; cite actual existing user/host decisions.
|
|
@@ -247,3 +247,45 @@ Only Core-owned backlog can close after all required delivery succeeds. First co
|
|
|
247
247
|
## Completion
|
|
248
248
|
|
|
249
249
|
Report run/change, frozen tickets/roots, phase statuses, actual receipt commands, acceptance, confidence, archive and per-repository delivery. Distinguish reused evidence, newly executed checks and gaps. Keep failure excerpts bounded and refer to durable receipts. Missing workers, failed gates or incomplete required repositories stay blocked/failed, never falsely complete.
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
### Acceptance evidence and completion
|
|
253
|
+
|
|
254
|
+
After development, normal review MUST write `stateDir/acceptance.json` and run
|
|
255
|
+
`acceptance --request <absolute-path>` before `phase --phase reviewer --status done`.
|
|
256
|
+
The request is `{criteria: [...], checks: [...], findings: [...]}`:
|
|
257
|
+
- Each criterion has `specId` (string), `criterionIndex` (zero-based), `requirement`
|
|
258
|
+
(exact frozen text), `status` (`met`, `exception`, `blocked`, `pending`) and a
|
|
259
|
+
nonempty `evidence` array of concrete code/test/capture references and observations.
|
|
260
|
+
Cover every frozen acceptance criterion once. If a spec has no explicit criteria,
|
|
261
|
+
use its complete frozen description (or title if empty) at index 0.
|
|
262
|
+
- An `exception` MUST include `{reason, impact, material, acceptedBy, approvalEvidence}`.
|
|
263
|
+
`acceptedBy` is `reviewer`, `user`, or `host`. Material scope changes require actual
|
|
264
|
+
user/host authorization; do not invent approval or label material changes minor.
|
|
265
|
+
Previously authorized decisions need no new confirmation. Unresolved requirements
|
|
266
|
+
remain `blocked` or `pending`, never `met` through a rewritten interpretation.
|
|
267
|
+
- Each check has `{name, status, required, evidence, scope, limitations}`; status is
|
|
268
|
+
`passed`, `failed`, or `unavailable`. Include required and supplementary checks from
|
|
269
|
+
the design. Record the original required classification; never downgrade a failed
|
|
270
|
+
check to make the gate pass. For benchmarks state what is measured and excluded:
|
|
271
|
+
a Node microbenchmark does not establish browser Canvas/GPU/frame performance.
|
|
272
|
+
- `findings` lists concrete review conclusions, risks and resolutions; use an empty
|
|
273
|
+
array only when no findings remain. Numeric confidence cannot replace this report.
|
|
274
|
+
|
|
275
|
+
The runtime binds this evidence to frozen scope, source and design. Missing/stale
|
|
276
|
+
acceptance or unresolved requirements/required checks block review and archive.
|
|
277
|
+
Accepted exceptions and supplementary failures produce `with-exceptions` validation.
|
|
278
|
+
Replacing the report requires review and archive authorization again; a green command
|
|
279
|
+
receipt alone is insufficient. Evidence references and approval attribution remain
|
|
280
|
+
reviewer assertions, not independently authenticated proof of human approval.
|
|
281
|
+
|
|
282
|
+
Keep operational completion notes, check requests and reports in `stateDir` from
|
|
283
|
+
start to finish. Run scoped checks for repairs and one final full verification after
|
|
284
|
+
all edits. Reuse that full receipt while runtime status says it is valid and its
|
|
285
|
+
commands cover required checks. New prose/phase handoffs alone do not warrant reruns.
|
|
286
|
+
|
|
287
|
+
End with ONE concise summary from runtime `status.completion`: implementation,
|
|
288
|
+
validation (including exceptions), archive, delivery, and evidence references.
|
|
289
|
+
Host-owned delivery stays `pending-host`; do not call uncommitted files "landed".
|
|
290
|
+
Report phase durations/attempts from `status.phases`; report per-phase cost only when
|
|
291
|
+
provider telemetry attributes it, otherwise unavailable. Do not invent cost splits.
|
|
@@ -53,3 +53,45 @@ verification block success. Record reviewer done after semantic review, then run
|
|
|
53
53
|
`archive-check`. ONLY a successful gate authorizes reviewer archive-only execution.
|
|
54
54
|
Verify the archive exists and the active change is gone before recording archive
|
|
55
55
|
done. Never archive inside an ordinary review before the combined gates run.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
### Acceptance evidence and completion
|
|
59
|
+
|
|
60
|
+
After development, normal review MUST write `stateDir/acceptance.json` and run
|
|
61
|
+
`acceptance --request <absolute-path>` before `phase --phase reviewer --status done`.
|
|
62
|
+
The request is `{criteria: [...], checks: [...], findings: [...]}`:
|
|
63
|
+
- Each criterion has `specId` (string), `criterionIndex` (zero-based), `requirement`
|
|
64
|
+
(exact frozen text), `status` (`met`, `exception`, `blocked`, `pending`) and a
|
|
65
|
+
nonempty `evidence` array of concrete code/test/capture references and observations.
|
|
66
|
+
Cover every frozen acceptance criterion once. If a spec has no explicit criteria,
|
|
67
|
+
use its complete frozen description (or title if empty) at index 0.
|
|
68
|
+
- An `exception` MUST include `{reason, impact, material, acceptedBy, approvalEvidence}`.
|
|
69
|
+
`acceptedBy` is `reviewer`, `user`, or `host`. Material scope changes require actual
|
|
70
|
+
user/host authorization; do not invent approval or label material changes minor.
|
|
71
|
+
Previously authorized decisions need no new confirmation. Unresolved requirements
|
|
72
|
+
remain `blocked` or `pending`, never `met` through a rewritten interpretation.
|
|
73
|
+
- Each check has `{name, status, required, evidence, scope, limitations}`; status is
|
|
74
|
+
`passed`, `failed`, or `unavailable`. Include required and supplementary checks from
|
|
75
|
+
the design. Record the original required classification; never downgrade a failed
|
|
76
|
+
check to make the gate pass. For benchmarks state what is measured and excluded:
|
|
77
|
+
a Node microbenchmark does not establish browser Canvas/GPU/frame performance.
|
|
78
|
+
- `findings` lists concrete review conclusions, risks and resolutions; use an empty
|
|
79
|
+
array only when no findings remain. Numeric confidence cannot replace this report.
|
|
80
|
+
|
|
81
|
+
The runtime binds this evidence to frozen scope, source and design. Missing/stale
|
|
82
|
+
acceptance or unresolved requirements/required checks block review and archive.
|
|
83
|
+
Accepted exceptions and supplementary failures produce `with-exceptions` validation.
|
|
84
|
+
Replacing the report requires review and archive authorization again; a green command
|
|
85
|
+
receipt alone is insufficient. Evidence references and approval attribution remain
|
|
86
|
+
reviewer assertions, not independently authenticated proof of human approval.
|
|
87
|
+
|
|
88
|
+
Keep operational completion notes, check requests and reports in `stateDir` from
|
|
89
|
+
start to finish. Run scoped checks for repairs and one final full verification after
|
|
90
|
+
all edits. Reuse that full receipt while runtime status says it is valid and its
|
|
91
|
+
commands cover required checks. New prose/phase handoffs alone do not warrant reruns.
|
|
92
|
+
|
|
93
|
+
End with ONE concise summary from runtime `status.completion`: implementation,
|
|
94
|
+
validation (including exceptions), archive, delivery, and evidence references.
|
|
95
|
+
Host-owned delivery stays `pending-host`; do not call uncommitted files "landed".
|
|
96
|
+
Report phase durations/attempts from `status.phases`; report per-phase cost only when
|
|
97
|
+
provider telemetry attributes it, otherwise unavailable. Do not invent cost splits.
|