muse-crew 0.14.10 → 0.14.11
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/API.md +1 -0
- package/docs/decisions/AGENTS.md +1 -0
- package/docs/decisions/publish-path.md +11 -0
- package/lib/crew-api.js +72 -3
- package/package.json +1 -1
- package/seed/cron-body-template.md +6 -2
- package/workflows/bugfix.js +2 -2
- package/workflows/chore.js +2 -2
- package/workflows/standard.js +2 -2
package/API.md
CHANGED
|
@@ -114,6 +114,7 @@ Records the tick worker's direct issuance outcome (0.14.6). Compare-and-swap on
|
|
|
114
114
|
| `refusal_text` | string | no | Required when `refused` |
|
|
115
115
|
| `reclaimed` | boolean | no | Copy verbatim from the `scan-publish-intent` entry — true when a previous tick died mid-issuance |
|
|
116
116
|
| `receipt_check` | `different`\|`unreadable`\|`match` | required when `reclaimed` is true, forbidden otherwise | The tick worker's step-2 version-receipt check outcome for the reclaimed claim |
|
|
117
|
+
| `transmitted_payload_sha256` | 64-hex sha256 | no | Optional attestation of the payload bytes transmitted in the `artifact_edit` handoff (0.14.11 §2). Verbatim paste: attest the step-1-verified staged `diff_sha256` (those bytes are what was transmitted). Re-typed paste: hash the exact transmitted diff text (between the handoff's diff fences) via file-write + `sha256sum`, never through the shell. The handoff's wrapper prose is not attested. Must be 64-hex when present (usage error otherwise). Code compares it to the staged `diff_sha256` at record time; the hashes ride the `submitted` ledger entry and a MISMATCH is carried into the `version-acknowledged` note as `payload-fidelity: MISMATCH (transmitted <h> != staged <h>)` — diagnosis only, feeds no verdict. Honesty limit: this instrument measures self-reported consistency, a lower bound on the true mutation rate. Only an honest worker's MISMATCH carries signal — MATCH is uninformative by construction (copying `diff_sha256` from step 1 is uncloseable) and pre-transport paste truncation yields a silent false-MATCH. Absent attestation changes nothing. |
|
|
117
118
|
|
|
118
119
|
`accepted` writes the issuer-stamped `submitted` ledger entry + `publish: edit-issued` note. `refused` writes `rejected` + terminal `publish: publish-refused`. Returns `{ "recorded": true, "edit_outcome" }` or `{ "recorded": false }` on CAS mismatch.
|
|
119
120
|
|
package/docs/decisions/AGENTS.md
CHANGED
|
@@ -50,6 +50,7 @@ re-verified that every `docs/decisions/*.md#anchor` reference in
|
|
|
50
50
|
- `#publish-verify` — Publish verification
|
|
51
51
|
- `#integrate-verify` — Integrate verification
|
|
52
52
|
- `#already-merged-idem` — Already-merged idempotency
|
|
53
|
+
- `#already-satisfied-spec` — Already-satisfied spec (baseline-pre-existing work; 2026-09-23, 0.14.11 §4)
|
|
53
54
|
- `#ledger-trigger` — Ledger trigger
|
|
54
55
|
- `#trigger-await` — Trigger await
|
|
55
56
|
- `#diff-computation` — Diff computation
|
|
@@ -1214,6 +1214,17 @@ Applies to: standard, bugfix, chore.
|
|
|
1214
1214
|
// interpolating it into the shell command cannot inject.
|
|
1215
1215
|
```
|
|
1216
1216
|
|
|
1217
|
+
<a id="already-satisfied-spec"></a>
|
|
1218
|
+
## Already-satisfied spec (baseline-pre-existing work)
|
|
1219
|
+
|
|
1220
|
+
**The machine, not the paraphrase.** The Build prompt invites the already-satisfied claim: "If you verified the deliverable is already on the integration target (a prior merge landed it — do NOT re-implement working code), make no commit and declare `repo_diff: none` … The workflow verifies the claim mechanically from git — the task's own merge records, never your declaration, are the proof of delivery." The verification runs — and an unattributable claim verifies as `empty-no-work` → Cass plausibility (which correctly rejects non-runtime-state) or mechanical FAIL → rework budget → **park-with-reason**. That is the designed fail-closed outcome (Eric, 2026-09-22): if it parked with an understandable reason, that's even better.
|
|
1221
|
+
|
|
1222
|
+
Why attribution-identity-first matters: `classify-branch` (the blocker-34 redesign) attributes `already-merged:<sha>` ONLY to the task's own lineage — a live merge carrying the branch tip, or the task's durable merge records. Work pre-existing in the pinned baseline (e.g. a feature commit that is an ancestor of the pinned baseline before the task existed) is neither — it is `empty-no-work`. Blocker-11's "accept already-merged as steady state" referred to the task's own merge lineage (a deliverable the task itself had merged), never to baseline-pre-existing work. There is no no-op-accept path, and none goes in without machine verification — a broken Build producing nothing must never read as DONE (critic-panel constraint, 2026-09-22). `parked-to-Todo` stays the designed human escape hatch.
|
|
1223
|
+
|
|
1224
|
+
Prevention lives outside the product: the room-spec generator checklist carries `baseline-absence-verified` — the real absence check (e.g. `git merge-base --is-ancestor <feature> <baseline>`) with its command output recorded in the room spec JSON at filing time. If the check shows the work present in the pinned baseline, the spec is not filed as-is. (A mechanical baseline-absence check on a once-per-room human filing is process theater — Eric, 2026-09-22 — so the generator stays human and outside the system under test on purpose.)
|
|
1225
|
+
|
|
1226
|
+
Applies to: standard, bugfix, chore.
|
|
1227
|
+
|
|
1217
1228
|
<a id="ledger-trigger"></a>
|
|
1218
1229
|
## Ledger trigger
|
|
1219
1230
|
|
package/lib/crew-api.js
CHANGED
|
@@ -1882,23 +1882,49 @@ function findSubmittedEntries(entries, commit) {
|
|
|
1882
1882
|
return matches;
|
|
1883
1883
|
}
|
|
1884
1884
|
|
|
1885
|
+
// 0.14.11 §2 — extract the record-time payload-fidelity fact from a
|
|
1886
|
+
// submitted ledger entry for the ack note. Only a MISMATCH is carried: MATCH
|
|
1887
|
+
// and absent attestation leave the note verbatim (strictly additive). The
|
|
1888
|
+
// compare is recomputed from the two co-located hashes — no stored flag
|
|
1889
|
+
// (stale-flag hazard). Deliberately no trimmed/lenient compare: the reframed
|
|
1890
|
+
// worker instruction dissolves the benign causes (shell mangling, newline
|
|
1891
|
+
// drift, fence confusion) at the source, so residual drift in the fallback
|
|
1892
|
+
// path is genuine paste deviation by definition.
|
|
1893
|
+
function entryFidelity(entry) {
|
|
1894
|
+
if (!entry) return null;
|
|
1895
|
+
const transmitted = entry.transmitted_payload_sha256 || null;
|
|
1896
|
+
const staged = entry.diff_sha256 || null;
|
|
1897
|
+
if (!transmitted || !staged || transmitted === staged) return null;
|
|
1898
|
+
return { transmitted, staged };
|
|
1899
|
+
}
|
|
1900
|
+
|
|
1885
1901
|
// 0.14.6 §1.3 — record a positive version acknowledgement: stamp provenance
|
|
1886
1902
|
// (certifying the issuance REQUEST was acknowledged — never byte equality),
|
|
1887
1903
|
// write the terminal `publish: version-acknowledged` note, and re-queue the
|
|
1888
1904
|
// task. Shared by scan-ack-pending and the record-version-ack command (the
|
|
1889
1905
|
// re-claim path). The strict release cross-check refuses to stamp from a
|
|
1890
1906
|
// stale cron body or a mid-deploy swap — fail closed.
|
|
1891
|
-
|
|
1907
|
+
//
|
|
1908
|
+
// 0.14.11 §2: `fidelity` is entryFidelity(entry) — when the issued payload's
|
|
1909
|
+
// attested hash differed from the staged diff, the deviation rides the note
|
|
1910
|
+
// as a first-class diagnosis fact. The ack still counts: the contract prices
|
|
1911
|
+
// receipt-attestation, not byte equality.
|
|
1912
|
+
function recordVersionAck(db, ctx, { taskId, projectId, commit, version, via, fidelity }) {
|
|
1892
1913
|
const releaseName = resolveActiveRelease(ctx.crewHome);
|
|
1893
1914
|
const ts = now();
|
|
1894
1915
|
stampProvenance(db, {
|
|
1895
1916
|
project_id: projectId, source_commit: commit, crew_release: releaseName,
|
|
1896
1917
|
published_at: ts, task_id: taskId,
|
|
1897
1918
|
});
|
|
1919
|
+
const fidelityText = fidelity
|
|
1920
|
+
? ` payload-fidelity: MISMATCH (transmitted ${fidelity.transmitted} != staged ${fidelity.staged})`
|
|
1921
|
+
: "";
|
|
1898
1922
|
writeGuardedPublishNote(db, taskId,
|
|
1899
1923
|
`publish: version-acknowledged ${commit} via=${via} — the artifact acknowledged this attempt's exact version ` +
|
|
1900
1924
|
`(${via === "disk" ? "on-disk receipt .crew-publish-version" : "version-echoing builder report"}); ` +
|
|
1901
|
-
`provenance stamped for crew release ${releaseName} (certifies the issuance request was acknowledged, not byte equality)
|
|
1925
|
+
`provenance stamped for crew release ${releaseName} (certifies the issuance request was acknowledged, not byte equality).` +
|
|
1926
|
+
fidelityText +
|
|
1927
|
+
` Task re-queued.`,
|
|
1902
1928
|
ts);
|
|
1903
1929
|
db.prepare("UPDATE tasks SET state = 'in_progress', updated_at = ? WHERE id = ?").run(ts, taskId);
|
|
1904
1930
|
return { ok: true, task_id: taskId, commit, version, via, crew_release: releaseName };
|
|
@@ -2138,8 +2164,30 @@ commands["scan-publish-intent"] = (db, args, ctx) => {
|
|
|
2138
2164
|
// tick worker calls this exactly once per artifact_edit call that completed
|
|
2139
2165
|
// without error and without an explicit refusal.
|
|
2140
2166
|
//
|
|
2167
|
+
// 0.14.11 §2 — payload-fidelity attestation (diagnosis only, never a
|
|
2168
|
+
// verdict): the optional `transmitted_payload_sha256` is the worker's
|
|
2169
|
+
// honest-effort attestation of the payload bytes it transmitted in the
|
|
2170
|
+
// artifact_edit handoff. Two sanctioned paths (seed/cron-body-template.md
|
|
2171
|
+
// 3b): verbatim paste → attest the step-1-verified staged diff_sha256
|
|
2172
|
+
// (those bytes are what was transmitted); re-typed paste → hash the exact
|
|
2173
|
+
// transmitted diff text (between the handoff's diff fences) via the
|
|
2174
|
+
// file-write tool + sha256sum, never through the shell. Code compares it to
|
|
2175
|
+
// the staged diff_sha256 at record time; a mismatch is carried into the
|
|
2176
|
+
// version-acknowledged note as a first-class fact and feeds no verdict.
|
|
2177
|
+
// The wrapper prose around the handoff is not attestable (no canonical
|
|
2178
|
+
// intended bytes exist for it) and is deliberately excluded: the payload is
|
|
2179
|
+
// the patch. Perfect attestation is impossible; this instrument measures
|
|
2180
|
+
// self-reported consistency — a lower bound on the true mutation rate.
|
|
2181
|
+
// Only an honest worker's MISMATCH carries signal: MATCH is uninformative by
|
|
2182
|
+
// construction (copying diff_sha256 from step 1 is uncloseable), and
|
|
2183
|
+
// pre-transport truncation yields a silent false-MATCH — the quiet direction,
|
|
2184
|
+
// accepted under diagnosis-only. The failure the attestation misses
|
|
2185
|
+
// (attested-match with garbage transmitted) degrades to today's behavior
|
|
2186
|
+
// (builder refuses → attempt times out).
|
|
2187
|
+
//
|
|
2141
2188
|
// Args: { task_id, claim_expiry, edit_outcome: "accepted"|"refused",
|
|
2142
|
-
// refusal_text? } — omit refusal_text
|
|
2189
|
+
// refusal_text?, transmitted_payload_sha256? } — omit refusal_text
|
|
2190
|
+
// unless refused.
|
|
2143
2191
|
//
|
|
2144
2192
|
// `accepted` writes the issuer-stamped `submitted` ledger entry (carrying
|
|
2145
2193
|
// the attempt's version) and mirrors `publish: edit-issued` — the ack scan
|
|
@@ -2212,6 +2260,15 @@ commands["record-intent-issuance"] = (db, args, ctx) => {
|
|
|
2212
2260
|
} else if (receiptCheck !== undefined && receiptCheck !== null) {
|
|
2213
2261
|
throw usageError("receipt_check is only valid for a reclaimed claim.");
|
|
2214
2262
|
}
|
|
2263
|
+
// 0.14.11 §2 — payload-fidelity attestation: optional, validated, strictly
|
|
2264
|
+
// additive. A malformed-but-present attestation is a programmer error and
|
|
2265
|
+
// fails closed at the API boundary.
|
|
2266
|
+
const transmittedSha = args.transmitted_payload_sha256;
|
|
2267
|
+
if (transmittedSha !== undefined && transmittedSha !== null &&
|
|
2268
|
+
!/^[0-9a-f]{64}$/.test(String(transmittedSha))) {
|
|
2269
|
+
throw usageError("transmitted_payload_sha256 must be a 64-hex sha256.");
|
|
2270
|
+
}
|
|
2271
|
+
const attestedSha = transmittedSha ? String(transmittedSha) : null;
|
|
2215
2272
|
|
|
2216
2273
|
db.exec("BEGIN");
|
|
2217
2274
|
try {
|
|
@@ -2250,6 +2307,13 @@ commands["record-intent-issuance"] = (db, args, ctx) => {
|
|
|
2250
2307
|
// registry — the writer-side guard pattern from D7).
|
|
2251
2308
|
note = `publish: publish-refused ${commit} attempt=${publishAttempt} — the platform refused the issued edit (${refusalText}). No re-issue; parked for human attention.`;
|
|
2252
2309
|
} else {
|
|
2310
|
+
// 0.14.11 §2 — the record-time fidelity compare: the attested hash of
|
|
2311
|
+
// the transmitted payload bytes against the staged diff_sha256. The
|
|
2312
|
+
// hashes ride the submitted entry; code recomputes MATCH/MISMATCH
|
|
2313
|
+
// wherever it needs the verdict (entryFidelity), never a stored flag.
|
|
2314
|
+
// Null attestation (absent) is strictly additive — the machine's
|
|
2315
|
+
// behavior is unchanged. Feeds no verdict — diagnosis only.
|
|
2316
|
+
ledgerLine.transmitted_payload_sha256 = attestedSha;
|
|
2253
2317
|
ledgerLine.outcome = "submitted";
|
|
2254
2318
|
ledgerLine.detail = "edit issued directly by the session-carrying tick worker (one-party publish); the staged diff carried the per-attempt version receipt" +
|
|
2255
2319
|
(reclaimed ? `; reclaimed claim, step-2 receipt check was '${receiptCheck}' (a differing or unreadable receipt is not proof the prior attempt's edit did not land)` : "");
|
|
@@ -2442,8 +2506,12 @@ commands["scan-ack-pending"] = (db, args, ctx) => {
|
|
|
2442
2506
|
// explicit REFUSALS only (negative evidence).
|
|
2443
2507
|
const ackedAttempt = attempts.find((a) => diskVersion === expectedVersion(a));
|
|
2444
2508
|
if (ackedAttempt !== undefined) {
|
|
2509
|
+
// 0.14.11 §2 — the record-time fidelity fact rides the ack note
|
|
2510
|
+
// (diagnosis only; the ack still counts).
|
|
2511
|
+
const ackedEntry = validEntries.find((e) => e.publish_attempt === ackedAttempt) || null;
|
|
2445
2512
|
recordVersionAck(db, ctx, {
|
|
2446
2513
|
taskId, projectId: project.id, commit, version: expectedVersion(ackedAttempt), via: "disk",
|
|
2514
|
+
fidelity: entryFidelity(ackedEntry),
|
|
2447
2515
|
});
|
|
2448
2516
|
acknowledged.push({ task_id: taskId, commit, attempt: ackedAttempt, via: "disk", crew_release: releaseName });
|
|
2449
2517
|
continue;
|
|
@@ -2712,6 +2780,7 @@ commands["record-version-ack"] = (db, args, ctx) => {
|
|
|
2712
2780
|
try {
|
|
2713
2781
|
const res = recordVersionAck(db, ctx, {
|
|
2714
2782
|
taskId, projectId: project.id, commit: matched.commit, version, via,
|
|
2783
|
+
fidelity: entryFidelity(matched),
|
|
2715
2784
|
});
|
|
2716
2785
|
db.exec("COMMIT");
|
|
2717
2786
|
return res;
|
package/package.json
CHANGED
|
@@ -87,9 +87,13 @@ The failures below are settled and recorded in the Gate 1 OODA state. The author
|
|
|
87
87
|
The diff and rules are suggestions now, not byte-exact commands (this also sidesteps the platform newline-escaping defect on verbatim requests — the receipt file is what matters, not byte fidelity).
|
|
88
88
|
Edit-request contract: call artifact_edit exactly once. Never retry the edit yourself. Tool unavailable (the artifact namespace would not load), a timeout, a transport error, or any otherwise ambiguous result is inconclusive: record NOTHING for this task, log the ambiguity in one line, and let the claim expire; the next scan re-claims and step 2's receipt check decides. An unrecorded outcome is the only honest record of an unknown one.
|
|
89
89
|
After the call returns, inspect the result text. (2026-09-20 REVIEW) Do NOT record an "acknowledged" builder report — the positive builder-report path was circular (the worker knows the version, so the report proves nothing) and is removed; the ack scan reads the version receipt from the artifact's disk as the sole positive evidence. If the result is an explicit refusal → `node {crewHome}/lib/crew-api.js --crew-home {crewHome} record-builder-report --json '{"task_id":"<task_id>","version":"<version>","outcome":"refused","report_text":"<refusal text verbatim>"}'` (the command MECHANICALLY rejects unless `report_text` contains the exact version — if the refusal text lacks the version, do NOT call record-builder-report; just proceed to the record step with `refused`).
|
|
90
|
+
3b. **Attest the payload (code, diagnosis only — never a verdict).** After the `artifact_edit` call returns (only when it completed without error and without an explicit refusal), attest what you transmitted as the payload — two branches, no judgment:
|
|
91
|
+
- **Verbatim paste:** if you pasted the staged diff file's content unchanged into the handoff's `SUGGESTED PATCH` slot, the transmitted bytes are exactly the staged bytes: attest the `diff_sha256` you already verified in step 1's `sha256sum` (reuse that output — no second hashing needed).
|
|
92
|
+
- **Re-typed or altered paste:** if you re-typed, reformatted, or otherwise changed the diff while pasting, write the EXACT diff text you transmitted — the text between the ` ```diff ` fences of the handoff's `SUGGESTED PATCH` slot, fences excluded — to a temp file with your file-write tool (never through the shell: interpolating diff bytes into a quoted shell string corrupts `$`, backticks, quotes, and backslashes and would hash bytes that were never transmitted), then `sha256sum /tmp/<task_id>-payload.txt`. The write tool preserves exact bytes, including the trailing newline.
|
|
93
|
+
The wrapper prose around the patch is not attested — there is no canonical intended bytes for it; the payload is the patch. Pass the 64-hex hash as `transmitted_payload_sha256` on the `record-intent-issuance` call (step 4). Code compares it to the staged `diff_sha256` at record time: MATCH means the attested bytes matched the staged bytes; MISMATCH means the paste deviated (re-typing in transit is the failure mode this catches — the blocker-26 family). A MISMATCH is carried into the `version-acknowledged` note (`payload-fidelity: MISMATCH (transmitted <h> != staged <h>)`) — it never changes any verdict (the ack contract prices receipt-attestation, not byte equality). If the paste deviated, attest the deviation honestly and proceed to step 4 — do not re-paste, do not re-issue (step 3: never retry the edit). Perfect attestation is impossible (the paste itself can deviate); this instrument measures self-reported consistency — a lower bound on the true mutation rate, not the rate. Only an honest worker's MISMATCH carries signal: MATCH is uninformative by construction (copying `diff_sha256` from step 1 is uncloseable), and pre-transport truncation of the paste yields a silent false-MATCH — the quiet direction, accepted under diagnosis-only. Omit `transmitted_payload_sha256` if you cannot attest honestly; absent attestation changes nothing.
|
|
90
94
|
4. **Record the outcome (code):**
|
|
91
|
-
`node {crewHome}/lib/crew-api.js --crew-home {crewHome} record-intent-issuance --json '{"task_id": "<task_id>", "claim_expiry": "<claim_expiry>", "edit_outcome": "<accepted|refused>", "refusal_text": "<first line>", "reclaimed": <true|false>, "receipt_check": "<different|unreadable>"}'`
|
|
92
|
-
(omit `refusal_text` unless refused; copy `reclaimed` verbatim from the scan entry — it is mechanical, never inferred; `receipt_check` is REQUIRED when `reclaimed` is true and must name the exact step-2 outcome — omit `receipt_check` when `reclaimed` is false. A `match` in step 2 never reaches this step: the edit already landed, so you ack instead of issuing.) Copy `claim_expiry` verbatim from the scan entry — it is the compare-and-swap. If the command returns `recorded: false`, log the reason and stop: another tick owns the task. `accepted` writes the issuer-stamped `submitted` ledger entry and mirrors `publish: edit-issued <commit> attempt=<n> version=<commit>:<attempt>` (the 4.5 ack scan claims it on a later tick); `refused` writes `rejected` and the terminal `publish: publish-refused` note. There is no outcome for an inconclusive call (step 3) — do not call record-intent-issuance at all when the edit's fate is unknown.
|
|
95
|
+
`node {crewHome}/lib/crew-api.js --crew-home {crewHome} record-intent-issuance --json '{"task_id": "<task_id>", "claim_expiry": "<claim_expiry>", "edit_outcome": "<accepted|refused>", "refusal_text": "<first line>", "reclaimed": <true|false>, "receipt_check": "<different|unreadable>", "transmitted_payload_sha256": "<64-hex attested in step 3b>"}'`
|
|
96
|
+
(omit `refusal_text` unless refused; omit `transmitted_payload_sha256` unless you attested in step 3b (accepted outcomes only); copy `reclaimed` verbatim from the scan entry — it is mechanical, never inferred; `receipt_check` is REQUIRED when `reclaimed` is true and must name the exact step-2 outcome — omit `receipt_check` when `reclaimed` is false. A `match` in step 2 never reaches this step: the edit already landed, so you ack instead of issuing.) Copy `claim_expiry` verbatim from the scan entry — it is the compare-and-swap. If the command returns `recorded: false`, log the reason and stop: another tick owns the task. `accepted` writes the issuer-stamped `submitted` ledger entry and mirrors `publish: edit-issued <commit> attempt=<n> version=<commit>:<attempt>` (the 4.5 ack scan claims it on a later tick); `refused` writes `rejected` and the terminal `publish: publish-refused` note. There is no outcome for an inconclusive call (step 3) — do not call record-intent-issuance at all when the edit's fate is unknown.
|
|
93
97
|
- Prose never mints `publish:` notes directly. Any tick-authored publish note goes through exactly one path (code asserts the verb against the closed registry, rejects unknown verbs):
|
|
94
98
|
`node {crewHome}/lib/crew-api.js --crew-home {crewHome} record-publish-note --json '{"task_id":"<task_id>","note":"<full note text>"}'`
|
|
95
99
|
- Crash rules (fail closed, never blind re-issue): if this tick dies between the artifact_edit call and the record step, the next scan re-claims with `reclaimed: true` and step 2's version-receipt check decides between ack (`record-version-ack` with `via: "disk"`) and a fresh issuance — recorded with its explicit `receipt_check`, since a differing/unreadable receipt is not proof the prior attempt's edit did not land. The issuance contract is at-most-one RECORDED issuance per attempt; a duplicate physical issuance across a lease expiry is content-identical (the same checksummed staged diff) and bounded by the ack scan's 2-hour budget.
|
package/workflows/bugfix.js
CHANGED
|
@@ -1637,7 +1637,7 @@ while (i < STEPS.length) {
|
|
|
1637
1637
|
reviewChangeExam =
|
|
1638
1638
|
"The branch has no commits ahead of the integration target (see MECHANICAL FACT below) — there is no diff to examine. Judge the Build report's `repo_diff: none` claim on its plausibility.\n\n";
|
|
1639
1639
|
reviewBranchRule =
|
|
1640
|
-
"MECHANICAL FACT (computed by the workflow from git — never by a reviewer): the branch has no commits ahead of the integration target and no task-attributed merge on the target was verified; the Build report declares `repo_diff: none` (no repo change). Approve ONLY if the task's deliverable is plausibly runtime state (e.g. a cron definition, scheduler change, or dashboard/config state created outside the repo). Otherwise report 'no commits ahead of the integration target and no plausible runtime-state deliverable — the
|
|
1640
|
+
"MECHANICAL FACT (computed by the workflow from git — never by a reviewer): the branch has no commits ahead of the integration target and no task-attributed merge on the target was verified; the Build report declares `repo_diff: none` (no repo change). Approve ONLY if the task's deliverable is plausibly runtime state (e.g. a cron definition, scheduler change, or dashboard/config state created outside the repo). Otherwise report 'no commits ahead of the integration target and no plausible runtime-state deliverable — the branch is empty and no task-attributed merge was verified', then end your report with exactly this line: VERDICT: FAIL.\n";
|
|
1641
1641
|
} else {
|
|
1642
1642
|
// Mechanical FAIL — Cass is never dispatched (see the dispatch gate
|
|
1643
1643
|
// below). Instructions are unused; keep the shape.
|
|
@@ -2285,7 +2285,7 @@ while (i < STEPS.length) {
|
|
|
2285
2285
|
: "Branch state (classified by the workflow from git): empty-no-work — the task branch has no commits ahead of the integration target, " +
|
|
2286
2286
|
"no task-attributed merge on the target was verified" + (branchStateErr ? " (branch classification itself failed: " + branchStateErr + ")" : "") + ", " +
|
|
2287
2287
|
"and the accepted Build report declared no `repo_diff: none` deliverable. " +
|
|
2288
|
-
"No change was reviewed because there is no change to review. The
|
|
2288
|
+
"No change was reviewed because there is no change to review. The branch is empty and no task-attributed merge was verified.\n") +
|
|
2289
2289
|
"Worktree: " + WORKTREE_HINT + "\n" +
|
|
2290
2290
|
"Recovery: commit the deliverable on the task branch in the worktree above and re-run Review. If the deliverable is genuinely runtime state outside the repo, declare `repo_diff: none` in the Build report instead of leaving the branch empty without a declaration.\n" +
|
|
2291
2291
|
"VERDICT: FAIL";
|
package/workflows/chore.js
CHANGED
|
@@ -1500,7 +1500,7 @@ while (i < STEPS.length) {
|
|
|
1500
1500
|
reviewChangeExam =
|
|
1501
1501
|
"The branch has no commits ahead of the integration target (see MECHANICAL FACT below) — there is no diff to examine. Judge the Build report's `repo_diff: none` claim on its plausibility.\n\n";
|
|
1502
1502
|
reviewBranchRule =
|
|
1503
|
-
"MECHANICAL FACT (computed by the workflow from git — never by a reviewer): the branch has no commits ahead of the integration target and no task-attributed merge on the target was verified; the Build report declares `repo_diff: none` (no repo change). Approve ONLY if the task's deliverable is plausibly runtime state (e.g. a cron definition, scheduler change, or dashboard/config state created outside the repo). Otherwise report 'no commits ahead of the integration target and no plausible runtime-state deliverable — the
|
|
1503
|
+
"MECHANICAL FACT (computed by the workflow from git — never by a reviewer): the branch has no commits ahead of the integration target and no task-attributed merge on the target was verified; the Build report declares `repo_diff: none` (no repo change). Approve ONLY if the task's deliverable is plausibly runtime state (e.g. a cron definition, scheduler change, or dashboard/config state created outside the repo). Otherwise report 'no commits ahead of the integration target and no plausible runtime-state deliverable — the branch is empty and no task-attributed merge was verified', then end your report with exactly this line: VERDICT: FAIL.\n";
|
|
1504
1504
|
} else {
|
|
1505
1505
|
// Mechanical FAIL — Cass is never dispatched (see the dispatch gate
|
|
1506
1506
|
// below). Instructions are unused; keep the shape.
|
|
@@ -1985,7 +1985,7 @@ while (i < STEPS.length) {
|
|
|
1985
1985
|
: "Branch state (classified by the workflow from git): empty-no-work — the task branch has no commits ahead of the integration target, " +
|
|
1986
1986
|
"no task-attributed merge on the target was verified" + (branchStateErr ? " (branch classification itself failed: " + branchStateErr + ")" : "") + ", " +
|
|
1987
1987
|
"and the accepted Build report declared no `repo_diff: none` deliverable. " +
|
|
1988
|
-
"No change was reviewed because there is no change to review. The
|
|
1988
|
+
"No change was reviewed because there is no change to review. The branch is empty and no task-attributed merge was verified.\n") +
|
|
1989
1989
|
"Worktree: " + WORKTREE_HINT + "\n" +
|
|
1990
1990
|
"Recovery: commit the deliverable on the task branch in the worktree above and re-run Review. If the deliverable is genuinely runtime state outside the repo, declare `repo_diff: none` in the Build report instead of leaving the branch empty without a declaration.\n" +
|
|
1991
1991
|
"VERDICT: FAIL";
|
package/workflows/standard.js
CHANGED
|
@@ -1526,7 +1526,7 @@ while (i < STEPS.length) {
|
|
|
1526
1526
|
reviewChangeExam =
|
|
1527
1527
|
"The branch has no commits ahead of the integration target (see MECHANICAL FACT below) — there is no diff to examine. Judge the Build report's `repo_diff: none` claim on its plausibility.\n\n";
|
|
1528
1528
|
reviewBranchRule =
|
|
1529
|
-
"MECHANICAL FACT (computed by the workflow from git — never by a reviewer): the branch has no commits ahead of the integration target and no task-attributed merge on the target was verified; the Build report declares `repo_diff: none` (no repo change). Approve ONLY if the task's deliverable is plausibly runtime state (e.g. a cron definition, scheduler change, or dashboard/config state created outside the repo). Otherwise report 'no commits ahead of the integration target and no plausible runtime-state deliverable — the
|
|
1529
|
+
"MECHANICAL FACT (computed by the workflow from git — never by a reviewer): the branch has no commits ahead of the integration target and no task-attributed merge on the target was verified; the Build report declares `repo_diff: none` (no repo change). Approve ONLY if the task's deliverable is plausibly runtime state (e.g. a cron definition, scheduler change, or dashboard/config state created outside the repo). Otherwise report 'no commits ahead of the integration target and no plausible runtime-state deliverable — the branch is empty and no task-attributed merge was verified', then end your report with exactly this line: VERDICT: FAIL.\n";
|
|
1530
1530
|
} else {
|
|
1531
1531
|
// Mechanical FAIL — Cass is never dispatched (see the dispatch gate
|
|
1532
1532
|
// below). Instructions are unused; keep the shape.
|
|
@@ -2152,7 +2152,7 @@ while (i < STEPS.length) {
|
|
|
2152
2152
|
: "Branch state (classified by the workflow from git): empty-no-work — the task branch has no commits ahead of the integration target, " +
|
|
2153
2153
|
"no task-attributed merge on the target was verified" + (branchStateErr ? " (branch classification itself failed: " + branchStateErr + ")" : "") + ", " +
|
|
2154
2154
|
"and the accepted Build report declared no `repo_diff: none` deliverable. " +
|
|
2155
|
-
"No change was reviewed because there is no change to review. The
|
|
2155
|
+
"No change was reviewed because there is no change to review. The branch is empty and no task-attributed merge was verified.\n") +
|
|
2156
2156
|
"Worktree: " + WORKTREE_HINT + "\n" +
|
|
2157
2157
|
"Recovery: commit the deliverable on the task branch in the worktree above and re-run Review. If the deliverable is genuinely runtime state outside the repo, declare `repo_diff: none` in the Build report instead of leaving the branch empty without a declaration.\n" +
|
|
2158
2158
|
"VERDICT: FAIL";
|