Skip to content

fix: fail-closed Crave wrapper (status, log, pull) + audit answers to the lock - #7

Open
BangerSoul wants to merge 8 commits into
masterfrom
fix/crave-fail-closed-wrapper
Open

BangerSoul wants to merge 8 commits into
masterfrom
fix/crave-fail-closed-wrapper

Conversation

@BangerSoul

@BangerSoul BangerSoul commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Why

Three defects, all found the same way - by asking a check to fail and watching it refuse to:

  1. revision_audit was a tautology. It compared the checkout against repo manifest -r output - the witness of itself - so disk-vs-disk could never disagree. Job 303324 proved it: 190 SHA-pinned projects drifted, and the audit printed OK all 1175 active projects over the same tree the canonical gate rejected.
  2. status could not fail. It looked for a Your jobs header the client has never printed, ran getlog unpinned, and exited 0 through the client's own Error: lines (observed live: Error: could not get matching git url at: ... with exit 0).
  3. log and pull still had the unpinned fallbacks, and pull would copy + verify whatever the previous pull had left in the ticket's staging dir.

What changed

  • audit (066deec): the lock is the sole yardstick. SHA pins compared directly against it; tag pins resolved in-project; an unresolvable pin fails closed as MISMATCH; repo manifest -r demoted to corroboration with per-class counters - its disagreements become note lines, so the witness can neither rescue a bad tree nor convict a good one.
  • status (51177d8): pins --projectID/--jobID (refuses to guess when there is neither), parses the real section tables with any other header ending the section, distinguishes "left the queue" from "the client drew no table at all" (UNKNOWN), judges every probe on exit status AND text, exits nonzero naming the failing probe.
  • log/pull (0e89318): same treatment - refuse without a job id, pinned calls, fail closed on client errors. pull also clears the ticket's eb/image/out/ before fetching, so a failed pull can never leave the previous job's artifacts to be hashed and presented as this job's record.
  • json probe (27373b0): status now reads the client's machine-readable list --jobID <id> --json record first - status, exit code, start/end and the duration between them, job url - because the human tables stopped being drawn for this account entirely on 2026-10-05 (job 303483: list answered with projects/platforms only for hours, so the table parse could only say UNKNOWN). The tables stay as fallback and as corroboration; the two probes disagreeing is reported as DISPUTED rather than resolved in favour of one.
  • watch reads the same probe (6869b28): watch decides completion, so the table-only read was the dangerous half of that blind spot - with no table drawn, it could see the job leave the queue only by concluding it had not left, and its miss counter turned the rest into "the client answered nothing 10 times in a row". The probe is now a shared function asked on every poll, with status's precedence: json first, table as fallback and corroboration, and a disagreement reported as DISPUTED and waited on - never resolved into a completion in either direction. A record with no such job is its own state (unseen), waited on and explicitly not a completion. The give-up guard is kept for genuine silence and is now per-condition and bounded by WATCH_MAX_MISSES; WATCH_ONCE=1 runs a single poll. Also fixed: building/syncing used to read as TERMINAL, so a job in either state had its log captured mid-build.

Tests

  • test-revision-audit.sh scenario 9 rewritten around the new contract + a negative control through EMBERBIRD_RECIPE: the old logic goes red over a drifted tree, reproducing the exact false OK line 303324 printed.
  • test-crave-remote-build.sh (new): a stub client on CRAVE_SHIM records argv; 89 assertions drive the real script through the pins, the table parsing, the refusals, both failure modes, the json probe, watch one poll at a time (WATCH_ONCE=1), and a full pull happy path (copy + x2 provenance verification) in which a deliberately stale leftover never reaches image/out/.
  • Negative control for the wrapper: pointed at the pre-log/pull revision (51177d8), the new assertions go red - including the old pull copying a stale .iso into image/out/.
  • Negative control for the json probe (540c549): red on 14 of its 18 assertions - the probe is never issued, so its state is neither reported nor judged - and green on the four that assert the table fallback the old revision already had. Verified live: the new status against job 303483 prints finished, status 'done', exit code 130, 2h18m and the job url, where the previous revision printed UNKNOWN.
  • Negative control for watch (babd63e): red on exactly the 21 assertions scenario 10 adds, green on all of scenarios 1-9 - the new behaviour is missing and nothing else moved. Two of the 21 are the old loop polling a stub forever (exit 124 under the suite's own timeout bound), because it has no WATCH_ONCE. The control recipe itself was wrong until now too: a control runner written to /tmp dies at 128/127 on every assertion, because the script derives REPO_ROOT from its own location - so it is written inside the tree. Verified live: watch against job 303483 reads the state out of the json behind the client's Error: line (state=done) and reports the real verdict - exit code 130 (2h18m) - where the old loop would have burned its miss counter and given up blind.
  • Full offline suite: 13 passed, 0 failed.

Risk / known gap

The foreign-base .repo seed is still warning-only (inspect_seed reports, does not refuse). Job 303324 failed on exactly that, so the next submission may fail the same way (~8 min) until seed validation is escalated to fatal.

Resubmission

Submitted 2026-10-04 as job 303483, pinned to this branch's head (540c549 tree, recipe recorded at 0e89318), into the free slot: https://foss.crave.io/app/#/build/info/303483?team=14. Outcome (2026-10-05, via list --jobID 303483 --json): the job is finished and did NOT succeed - status done, exit code 130 (interrupted), after 2h18m (2026-10-04T02:29:20Z -> 04:47:38Z). The recipe demonstrably fetched the pinned commit 0e89318 and ran build-from-manifest.sh; the ~8-minute foreign-base seed failure class is ruled out by the duration. The platform retained no telemetry - getlog says "Could not find job stdout", fetchdiagnostics says "not available", pull says "no running jobs on this workspace" - so the in-job cause is not determinable from the client; the web UI build page is the only place the full log may still exist. The hardened wrapper behaved as designed throughout: status reported UNKNOWN rather than guessing while the tables were absent, and pull failed closed naming the probe. After the fact, watch running against this same job now reports the real outcome - state=done, exit code 130 after 2h18m - from the json probe, where the table-only loop it replaces would have hit its 10-empty-poll give-up. PR left open, not merged.

BangerSoul and others added 3 commits October 4, 2026 07:23
revision_audit compared the checkout against `repo manifest -r` output -
the witness of itself - so disk-vs-disk could never disagree, and a tree
with 190 drifted projects passed as "OK all 1175 active projects"
(job 303324). The lock is now the sole yardstick: SHA pins are compared
directly against it, tag pins are resolved in-project, an unresolvable
pin fails closed as MISMATCH, and `repo manifest -r` is demoted to
corroboration with per-class counters - its disagreements become note
lines, so it can neither rescue a bad tree nor convict a good one.

Scenario 9 of test-revision-audit.sh is rewritten around that contract
(unresolvable pin, witness cannot rescue it, clean corroboration, the
303324 regression, a contradicting witness), and a negative control via
EMBERBIRD_RECIPE confirms the old logic goes red over a drifted tree
with the exact false OK line 303324 printed.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
status ran an unpinned getlog, looked for a "Your jobs" header the client
has never printed, and exited 0 even while the client answered with
"Error: could not get matching git url at: ..." on the same stream as its
data (observed live against job 303324). A status command that cannot
fail converts "I could not look" into "there is nothing wrong" - the one
confusion this runbook cannot afford.

It now pins --projectID/--jobID from $JOB or the run record and refuses
to guess when there is neither; parses the real section tables
("Your active jobs:" / "Job History:") with any other header ending the
section, so a project row can never be read as a job row; distinguishes
"left the queue" from "the client drew no table at all" (UNKNOWN, not a
guess); and judges every probe on both its exit status and its text,
exiting nonzero and naming the failing probe.

Pinned offline by the new tools/checks/test-crave-remote-build.sh: a stub
client on CRAVE_SHIM records the argv it was called with, and 15
assertions drive the real script through the pins, the table parsing, the
refusal to guess, and both failure modes. Wired into
run-offline-checks.sh; a control run against the pre-fix script goes red.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
Same treatment status got: both refuse without a job id instead of
falling back to whichever job the cwd resolves to, both judge the client
on its exit status and its text, and both exit nonzero with the reason
named. `log` still streams whatever it received - a client error message
is the most useful thing to show an operator who asked for a log - it
just can no longer exit 0 while doing it. `pull` dies before the copy +
verify steps, which would otherwise hash whatever the PREVIOUS pull left
in the ticket and present it as this job's record; pull now also clears
the ticket's eb/image/out before fetching, so a failed or empty pull
reports "produced no directory" instead of quietly verifying leftovers.

The stub client gains a pull mode; the offline test pins all three
subcommands (33 assertions), including a full happy path through copy +
x2 provenance verification with a stale leftover proving it never lands.
A control run against the pre-fix revision goes red on the new
assertions, among them the old pull copying a previous job's stale .iso
into image/out.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / Security Evidence

Commit: 0e89318ee37e462792a3099213975c7525e62d04

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 7 changed file(s). No missing scanner-evidence signal was detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / PR Risk Taxonomy

Commit: 0e89318ee37e462792a3099213975c7525e62d04

PR taxonomy clear (success)

Scanned 7 changed file(s). No taxonomy bucket signals were detected.

Scanned 7 changed file(s).

No PR taxonomy bucket signals were detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / Reference Set Readiness

Commit: 0e89318ee37e462792a3099213975c7525e62d04

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 7 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / Hosted Promotion Readiness

Commit: 0e89318ee37e462792a3099213975c7525e62d04

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 7 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

Submission note for the resubmission from the PR branch tip (0e89318):
run pinned the recipe only after the push, per the origin-reachability
guard the 302852 lesson produced, and the live `status` dogfood shows
the queued row alongside this machine's interleaved client error while
exiting 1 - "answered partially" is now distinguishable from "answered".
The known foreign-base seed risk (303324's ~8-minute failure mode) stays
documented as the outstanding gap until inspect_seed refuses the node.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / Security Evidence

Commit: 540c549db6e53f7ec78e8ca147846796da30c079

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 7 changed file(s). No missing scanner-evidence signal was detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / PR Risk Taxonomy

Commit: 540c549db6e53f7ec78e8ca147846796da30c079

PR taxonomy clear (success)

Scanned 7 changed file(s). No taxonomy bucket signals were detected.

Scanned 7 changed file(s).

No PR taxonomy bucket signals were detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / Reference Set Readiness

Commit: 540c549db6e53f7ec78e8ca147846796da30c079

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 7 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 4, 2026

Copy link
Copy Markdown

ECC Tools / Hosted Promotion Readiness

Commit: 540c549db6e53f7ec78e8ca147846796da30c079

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 7 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

… can vanish

Job 303483 exposed a blind spot the 2026-10-03 hardening could not close.
The client's human job tables stopped being drawn for this account
entirely - `list` answered with Configured Projects / Configured Platforms
only, hour after hour, ~10 calls, while the job had in fact left the
queue - so the table parse could only ever report UNKNOWN, and the job's
real outcome had to be recovered by hand.

The same client answers `list --jobID <id> --json` with the record that
matters: status, exitCode, startTime, endTime, job_url. status now asks
for it first, pinned to the job id, and keeps the tables as fallback and
as corroboration, so a client that cannot answer json behaves exactly as
before. The three cases are kept distinct: json locates the job (state,
exit code, start -> end, the duration between them, the job url); json
cannot be parsed or lacks the job (the table verdict stands); the two
disagree about whether the job exists (reported as DISPUTED, exit
nonzero - neither probe wins by default, because quietly preferring the
convenient answer is how a dead job gets reported as healthy).

The error-on-the-data-stream rule is unchanged and applies here too:
verified live, the json arrives behind "Error: could not get matching git
url" with the client exiting 0, so the state behind it is still printed
and the command still exits nonzero.

Against 303483 this prints `finished`, status 'done', exit code 130 and
2h18m where the previous revision printed UNKNOWN. Scenario 9 pins it (18
new assertions, 56 overall); the control run against 540c549 goes red on
14 of the 18 - the rest assert the table fallback it already had.

The runbook records the 303483 post-mortem: the job ran 2h18m, so it was
not the ~8-minute foreign-base seed class, and the platform retained no
stdout, no diagnostics and no pullable artifacts, which leaves exit 130
unattributable from the client. PR #7 stays unmerged for that reason.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Security Evidence

Commit: 27373b0424e3f60e0189e87e5e1089a1bef51b4e

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 7 changed file(s). No missing scanner-evidence signal was detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / PR Risk Taxonomy

Commit: 27373b0424e3f60e0189e87e5e1089a1bef51b4e

PR taxonomy clear (success)

Scanned 7 changed file(s). No taxonomy bucket signals were detected.

Scanned 7 changed file(s).

No PR taxonomy bucket signals were detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Reference Set Readiness

Commit: 27373b0424e3f60e0189e87e5e1089a1bef51b4e

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 7 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Hosted Promotion Readiness

Commit: 27373b0424e3f60e0189e87e5e1089a1bef51b4e

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 7 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

Two numbers in M2-CRAVE-BUILD.md were wrong, and a runbook that argues
for measured claims should not carry unmeasured ones. "then 15
assertions" for the 2026-10-03 status fix is 17 - measured by running
51177d8's own test against 51177d8's own runner (17 pass, 0 fail). The
33 attributed to the log/pull fix is 38 (scenarios 1-8 today, none of
which scenario 9 touched), and the current total is 56 with 18 of them
new. The quoted `client error:` line is also brought in line with the
2026-10-05 attribution fix, which names the probe that printed it.

Docs only: the offline suite is re-run and still reports 13 passed,
0 failed.
@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Security Evidence

Commit: babd63ed5d80702a4c89b9609ff7d392d6146fc4

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 7 changed file(s). No missing scanner-evidence signal was detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / PR Risk Taxonomy

Commit: babd63ed5d80702a4c89b9609ff7d392d6146fc4

PR taxonomy clear (success)

Scanned 7 changed file(s). No taxonomy bucket signals were detected.

Scanned 7 changed file(s).

No PR taxonomy bucket signals were detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Reference Set Readiness

Commit: babd63ed5d80702a4c89b9609ff7d392d6146fc4

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 7 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Hosted Promotion Readiness

Commit: babd63ed5d80702a4c89b9609ff7d392d6146fc4

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 7 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

`status` already asked the client for `list --jobID <id> --json` after the
human tables stopped being drawn for this account (job 303483, 2026-10-05),
but `watch` still decided completion from that table alone - so the same blind
spot was fatal there rather than merely inconvenient: with no table drawn, a
table-only watcher could see the job leave the queue only by concluding it had
not, and its miss counter turned the rest into "the client answered nothing 10
times in a row" while the real outcome sat one query away.

The probe is now a shared function, asked on every poll, and `watch` follows the
precedence `status` uses: json first, table as fallback and corroboration, and a
disagreement between them reported and waited on - never resolved into a
completion in either direction, because the one failure mode this must not have
is "watch declared the build over while it was still running". A record with no
such job at all is its own state (unseen), waited on and reported as not a
completion. The give-up guard is kept for genuine silence and is now per-
condition and bounded by WATCH_MAX_MISSES. WATCH_ONCE=1 runs a single poll,
which is how the offline suite drives `watch` with no queue behind it.

Also fixed on the way: `building`/`syncing` read as TERMINAL before, so a job in
either state had its log captured mid-build; both are in the one shared
still-active list the two probes are compared against. The negative control is
also documented correctly now - a control runner written to /tmp dies at 128 on
every assertion because the script derives REPO_ROOT from its own location, so
the recipe writes it inside the tree instead.

Scenario 10 adds 33 assertions (89 overall). Against `babd63e` it goes red on
exactly those 21 that describe the new behaviour and on nothing in scenarios
1-9, which is what a correct control looks like.

Live, against job 303483: the state is read out of the json behind the client's
diagnostic (state=done), and the watch reports the real verdict - exit code 130
after 2h18m - instead of timing out blind.
@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Security Evidence

Commit: 6869b283e2be60d7132122723cf7632fbf91fd24

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 7 changed file(s). No missing scanner-evidence signal was detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / PR Risk Taxonomy

Commit: 6869b283e2be60d7132122723cf7632fbf91fd24

PR taxonomy clear (success)

Scanned 7 changed file(s). No taxonomy bucket signals were detected.

Scanned 7 changed file(s).

No PR taxonomy bucket signals were detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Reference Set Readiness

Commit: 6869b283e2be60d7132122723cf7632fbf91fd24

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 7 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Hosted Promotion Readiness

Commit: 6869b283e2be60d7132122723cf7632fbf91fd24

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 7 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

…ader

The suite's header explained why the json probe exists for `status` and stopped
there, so a reader had no way to tell that scenario 10 drives `watch` through the
same probe - which is the half that decides completion rather than reporting it.
Header only; no assertion changes (still 89).
@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Security Evidence

Commit: 3fbc5b20ece7e1670f52fc054b47079d2711ee0e

Security evidence gate passed (success)

No security-sensitive scanner-evidence gap detected.

Mode: enforce

Scanned 7 changed file(s). No missing scanner-evidence signal was detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / PR Risk Taxonomy

Commit: 3fbc5b20ece7e1670f52fc054b47079d2711ee0e

PR taxonomy clear (success)

Scanned 7 changed file(s). No taxonomy bucket signals were detected.

Scanned 7 changed file(s).

No PR taxonomy bucket signals were detected.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Reference Set Readiness

Commit: 3fbc5b20ece7e1670f52fc054b47079d2711ee0e

Reference set readiness gaps detected (neutral)

Reference evidence present for 0/7 areas (0%) across 7 changed file(s).

This check is based on files changed in this PR. Repository-level readiness is still reported by /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Missing Add retrieval or evaluator reference-set comparison fixtures with expected ranking behavior.
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@ecc-tools

ecc-tools Bot commented Oct 5, 2026

Copy link
Copy Markdown

ECC Tools / Hosted Promotion Readiness

Commit: 3fbc5b20ece7e1670f52fc054b47079d2711ee0e

Hosted promotion readiness passed (success)

No hosted promotion evidence gaps detected across 7 changed file(s); 0 corpus scenarios had matching evidence.

This check compares PR file changes against the evaluator/RAG promotion corpus in src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

No evaluator corpus scenarios matched this PR.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant