Installed framework on web1 is weeks-stale patchwork: 38 tools drift from main, silently un-fixing merged gate fixes (queue guard, identity flags) #1194

Open
opened 2026-08-13 06:28:56 +00:00 by Mos · 4 comments
Contributor

Summary

ci-queue-wait.sh cannot block. Its classifier always returns unknown, and unknown is an
exit 0 arm. The pending arm is unreachable. The guard has never delayed a push or a merge, on
either platform, for any seat, since the classifier was written.

Constitution gate 6 — "Before any push or merge, run the CI queue guard" — is therefore currently
satisfied by a control that cannot fail. pr-merge.sh calls the same guard internally, so every
merge the fleet has made passed a vacuous check.

Root cause

get_state_from_status_json() is invoked as a pipeline stage:

STATE=$(printf '%s' "$STATUS_JSON" | get_state_from_status_json)

but the function body runs the interpreter with the program supplied on stdin:

python3 - <<'PY'
...
data = json.load(sys.stdin)

python3 - reads its program from stdin, and the heredoc is stdin. The heredoc wins; the piped
STATUS_JSON is discarded, never reaching the process. json.load(sys.stdin) then reads a stream
already consumed to EOF, raises, and the handler does exactly what it was written to do:

except Exception:
    print("unknown")
    raise SystemExit(0)

unknown is then grouped with the terminal states:

terminal-success|terminal-failure|unknown)
    # Queue guard only blocks on pending/running/queued states.
    exit 0

Two correct-looking pieces with an unbound seam between them: the fetch works, the classifier
works, and nothing carries the payload from one to the other.

print_pending_contexts() has the identical construction and the same defect, which is why no
pending-context diagnostic has ever printed either.

Proved by construction, not read from the source

Extract the real function from the shipped file and feed it payloads that must classify:

$ sed -n '/^get_state_from_status_json() {/,/^}/p' ci-queue-wait.sh > fn.sh && source fn.sh

$ echo '{"state":"pending","statuses":[{"status":"running","context":"ci/woodpecker/push/ci"}]}' | get_state_from_status_json
unknown
$ echo '{"state":"failure","statuses":[{"status":"failure","context":"ci"}]}' | get_state_from_status_json
unknown
$ echo '{"state":"success","statuses":[{"status":"success","context":"ci"}]}' | get_state_from_status_json
unknown

A live running pipeline classifies as unknown and the guard proceeds.

Observed end to end against mosaicstack/stack, three consecutive runs, deterministic:

run1 rc=0 -> state=unknown
run2 rc=0 -> state=unknown
run3 rc=0 -> state=unknown

while the guard's own status URL, fetched with the guard's own curl invocation, token and
User-Agent, returns 5320 bytes of valid JSON with "state":"success" — which the classifier
would have correctly called terminal-success had it ever received it.

Why this matters beyond the one-line fix

The failure is invisible at the call site. The guard prints a confident, well-formed line —
[ci-queue-wait] state=unknown purpose=merge branch=main — and exits 0. Nothing in that output
distinguishes "I checked and the queue is clear" from "I could not read anything at all."
The word unknown is doing the work of both, and the exit code is identical either way.

This is the same class as the attribution defect and the mosaic-worktree.sh SIGPIPE abort found
in the same window: rc=0 was never a reading, and a control's own success line is not a
reading either.
Only a provider readback is.

Proposed fix

  1. Feed the payload to the interpreter properly — pass the program as an argument (python3 -c)
    or via a process substitution / temp program file, so stdin stays free to carry the JSON.
    Apply to both get_state_from_status_json and print_pending_contexts.
  2. Do not leave unknown in the exit 0 arm. An unreadable status is not a clear queue.
    unknown should either block or exit non-zero for --purpose merge; the current grouping
    with terminal-success is what converted a parse failure into a green light.
  3. Distinguish the two roads to unknown in the output — "classifier saw states it does not
    recognise" and "payload did not parse" must not print the same line.
  4. Add a regression that would fail against the current tree: a constructed pending payload
    must classify as pending and the guard must not exit 0. Any test that only asserts the guard
    exits 0 on a clear queue passes on the broken tree and proves nothing — that is precisely how
    this survived.

Scope note

Found while merging #1173, where I ran the guard, got state=unknown, and declined to treat the
exit code as a queue reading. Queue clearance for that merge was established instead by direct
provider readback of the commit statuses on main and on the PR head. The merge was sound; the
guard contributed nothing to it.

Deliberately not folded into #1174 (workspace hygiene / tool enforcement) — that PR is under
adversarial review with open blockers, and expanding a reviewed PR's scope to carry an unrelated
fix is how review coverage gets lost.

## Summary `ci-queue-wait.sh` **cannot block**. Its classifier always returns `unknown`, and `unknown` is an `exit 0` arm. The `pending` arm is unreachable. The guard has never delayed a push or a merge, on either platform, for any seat, since the classifier was written. Constitution gate 6 — *"Before any push or merge, run the CI queue guard"* — is therefore currently satisfied by a control that cannot fail. `pr-merge.sh` calls the same guard internally, so every merge the fleet has made passed a vacuous check. ## Root cause `get_state_from_status_json()` is invoked as a pipeline stage: ``` STATE=$(printf '%s' "$STATUS_JSON" | get_state_from_status_json) ``` but the function body runs the interpreter with the program supplied **on stdin**: ``` python3 - <<'PY' ... data = json.load(sys.stdin) ``` `python3 -` reads its program from stdin, and the heredoc *is* stdin. The heredoc wins; the piped `STATUS_JSON` is discarded, never reaching the process. `json.load(sys.stdin)` then reads a stream already consumed to EOF, raises, and the handler does exactly what it was written to do: ``` except Exception: print("unknown") raise SystemExit(0) ``` `unknown` is then grouped with the terminal states: ``` terminal-success|terminal-failure|unknown) # Queue guard only blocks on pending/running/queued states. exit 0 ``` Two correct-looking pieces with an unbound seam between them: the fetch works, the classifier works, and nothing carries the payload from one to the other. `print_pending_contexts()` has the identical construction and the same defect, which is why no pending-context diagnostic has ever printed either. ## Proved by construction, not read from the source Extract the real function from the shipped file and feed it payloads that must classify: ``` $ sed -n '/^get_state_from_status_json() {/,/^}/p' ci-queue-wait.sh > fn.sh && source fn.sh $ echo '{"state":"pending","statuses":[{"status":"running","context":"ci/woodpecker/push/ci"}]}' | get_state_from_status_json unknown $ echo '{"state":"failure","statuses":[{"status":"failure","context":"ci"}]}' | get_state_from_status_json unknown $ echo '{"state":"success","statuses":[{"status":"success","context":"ci"}]}' | get_state_from_status_json unknown ``` A live running pipeline classifies as `unknown` and the guard proceeds. Observed end to end against `mosaicstack/stack`, three consecutive runs, deterministic: ``` run1 rc=0 -> state=unknown run2 rc=0 -> state=unknown run3 rc=0 -> state=unknown ``` while the guard's own status URL, fetched with the guard's own curl invocation, token and User-Agent, returns 5320 bytes of valid JSON with `"state":"success"` — which the classifier would have correctly called `terminal-success` had it ever received it. ## Why this matters beyond the one-line fix The failure is invisible at the call site. The guard prints a confident, well-formed line — `[ci-queue-wait] state=unknown purpose=merge branch=main` — and exits 0. Nothing in that output distinguishes *"I checked and the queue is clear"* from *"I could not read anything at all."* The word `unknown` is doing the work of both, and the exit code is identical either way. This is the same class as the attribution defect and the `mosaic-worktree.sh` SIGPIPE abort found in the same window: **`rc=0` was never a reading, and a control's own success line is not a reading either.** Only a provider readback is. ## Proposed fix 1. Feed the payload to the interpreter properly — pass the program as an argument (`python3 -c`) or via a process substitution / temp program file, so stdin stays free to carry the JSON. Apply to **both** `get_state_from_status_json` and `print_pending_contexts`. 2. **Do not leave `unknown` in the `exit 0` arm.** An unreadable status is not a clear queue. `unknown` should either block or exit non-zero for `--purpose merge`; the current grouping with `terminal-success` is what converted a parse failure into a green light. 3. Distinguish the two roads to `unknown` in the output — "classifier saw states it does not recognise" and "payload did not parse" must not print the same line. 4. **Add a regression that would fail against the current tree:** a constructed `pending` payload must classify as `pending` and the guard must not exit 0. Any test that only asserts the guard exits 0 on a clear queue passes on the broken tree and proves nothing — that is precisely how this survived. ## Scope note Found while merging #1173, where I ran the guard, got `state=unknown`, and declined to treat the exit code as a queue reading. Queue clearance for that merge was established instead by direct provider readback of the commit statuses on `main` and on the PR head. The merge was sound; the guard contributed nothing to it. Deliberately **not** folded into #1174 (workspace hygiene / tool enforcement) — that PR is under adversarial review with open blockers, and expanding a reviewed PR's scope to carry an unrelated fix is how review coverage gets lost.
Author
Contributor

Live proof, in production, against a genuinely in-flight pipeline

The constructed payloads in the issue body prove the classifier is broken. This proves the guard
fails its actual job, with no fixture involved.

Merging #1173 pushed 120af4e193190537d9aae8d0b50318dd9a16c25c to main and started its push
pipeline. While those jobs were still running, I asked the provider and the guard the same
question at the same instant.

Provider, commits/main/status:

state: pending ['pending', 'pending']

Two contexts in flight — ci/woodpecker/push/publish and ci/woodpecker/push/ci.

The guard, same instant, --purpose merge:

[ci-queue-wait] platform=gitea purpose=merge branch=main sha=120af4e193190537d9aae8d0b50318dd9a16c25c
[ci-queue-wait] state=unknown purpose=merge branch=main
REAL rc=0

It resolved the correct head SHA, then returned in under a second and exited 0 with a live pipeline
running on the very branch it was asked to guard. It should have entered the wait loop and printed
the pending contexts.

This is the whole defect in four lines: the guard got the right branch, fetched the right URL, had
the right classifier, and still waved through the exact condition it exists to catch.

Note what the output does not say. It does not say "I could not read the queue." It says
state=unknown and exits 0, which is indistinguishable at the call site from a clear queue — and a
seat following gate 6 correctly, running the mandated command and getting rc=0, would have pushed
straight into a running pipeline.

Two consequences worth stating plainly, because they change what "queue clear" has meant:

  • Every rc=0 this guard has ever returned was uninformative. Not wrong-sometimes —
    uninformative always, in both directions. It never blocked, and it also never confirmed anything.
  • pr-merge.sh embeds it, so the same vacuous line appears in the merge path itself. It printed
    in my own merge of #1173 twenty minutes ago.

Requirement 4 in the issue — a regression that fails against the current tree — now has a concrete
acceptance shape: reproduce this. Put the guard in front of a genuinely pending status and assert it
does not return immediately with 0. If the new test would also pass on today's tree, it is not
the test.

## Live proof, in production, against a genuinely in-flight pipeline The constructed payloads in the issue body prove the classifier is broken. This proves the guard fails its actual job, with no fixture involved. Merging #1173 pushed `120af4e193190537d9aae8d0b50318dd9a16c25c` to `main` and started its push pipeline. While those jobs were still running, I asked the provider and the guard the same question at the same instant. **Provider, `commits/main/status`:** ``` state: pending ['pending', 'pending'] ``` Two contexts in flight — `ci/woodpecker/push/publish` and `ci/woodpecker/push/ci`. **The guard, same instant, `--purpose merge`:** ``` [ci-queue-wait] platform=gitea purpose=merge branch=main sha=120af4e193190537d9aae8d0b50318dd9a16c25c [ci-queue-wait] state=unknown purpose=merge branch=main REAL rc=0 ``` It resolved the correct head SHA, then returned in under a second and exited 0 with a live pipeline running on the very branch it was asked to guard. It should have entered the wait loop and printed the pending contexts. This is the whole defect in four lines: the guard got the right branch, fetched the right URL, had the right classifier, and still waved through the exact condition it exists to catch. Note what the output does *not* say. It does not say "I could not read the queue." It says `state=unknown` and exits 0, which is indistinguishable at the call site from a clear queue — and a seat following gate 6 correctly, running the mandated command and getting `rc=0`, would have pushed straight into a running pipeline. Two consequences worth stating plainly, because they change what "queue clear" has meant: - **Every `rc=0` this guard has ever returned was uninformative.** Not wrong-sometimes — uninformative always, in both directions. It never blocked, and it also never confirmed anything. - **`pr-merge.sh` embeds it**, so the same vacuous line appears in the merge path itself. It printed in my own merge of #1173 twenty minutes ago. Requirement 4 in the issue — a regression that fails against the current tree — now has a concrete acceptance shape: reproduce this. Put the guard in front of a genuinely pending status and assert it does **not** return immediately with 0. If the new test would also pass on today's tree, it is not the test.
Author
Contributor

Correction — I diagnosed the wrong tree. The source is already fixed; the defect is propagation.

@coder3 was dispatched to fix this, ran a preflight, and stopped before creating a branch
because the fix already exists on main. It was right and I was wrong, and the error is mine, not
a detail: I analysed ~/.config/mosaic/tools/git/ci-queue-wait.sh — the installed copy — and
wrote the issue as though it were the SSOT.

Verified independently against origin/main, not taken from a report:

  • packages/mosaic/framework/tools/git/ci-queue-wait.sh uses python3 -c at both sites
    (lines 43 and 92), so stdin stays free for the provider JSON. No heredoc collision.
  • Parse failure classifies malformed; valid-but-unsupported vocabulary classifies unknown; both
    land in the non-zero ASSERTED_NOT_READY arm together with terminal-failure (line 473).
  • pending enters the wait/timeout path and cannot exit 0 (line 438).
  • Landed in 58b971ab, "fix(rm-03): make CI queue guard fail on asserted non-readiness (#1032)",
    an ancestor of main. git blame pins both python3 -c sites and the malformed/unknown handling
    to that commit.
  • packages/mosaic/framework/tools/git/test-ci-queue-wait-tristate.sh passes on main, and it is
    process-level rather than classifier-only: the pending fixture requires rc != 0,
    ASSERTED_NOT_READY, provider observation, pending-context output, sleep, and timeout expiry.

So the requirements I wrote — free stdin, unknown out of the exit-0 arm, the two roads
distinguished, a regression that fails against the broken tree — were already implemented and
merged
, in the same shape, before I filed this. No source PR should be opened. Closing this as a
code defect.

What is actually broken, and it is worse than what I filed

The fix merged and never reached the thing that executes.

SSOT      320bd729ec013ef3a9cef6b2769060d979a4e069e69666be305c96f15277ef62
INSTALLED 19cda2f7009c536eb4da9a8df0e7a62f3db0277c9a577bdae5db003f4da3f3cb

The installed copy still has python3 - <<'PY' in both functions. Every measurement in this issue
is real — the constructed payloads, the three deterministic unknown runs, and the live capture of
a genuinely pending pipeline waved through in under a second. All of it was produced by the
installed guard, which is the one every seat on this host actually runs, because
~/.config/mosaic/tools/ is the mandated path. The merge of #1173 did pass a vacuous guard. That
part stands.

The correction is to the cause, and it inverts the remedy: this is not "write the fix," it is
"the fix exists, is reviewed, is merged, and is not running."

The scope is not one file

Comparing every installed framework tool against origin/main:

in-sync: 104 | STALE: 38 | not-installed: 53

The stale 38 include the tools this fleet's correctness arguments have been resting on:

git/detect-platform.sh      git/pr-merge.sh        git/pr-review.sh
git/issue-comment.sh        git/issue-create.sh    git/issue-close.sh
git/pr-create.sh            git/pr-metadata.sh     git/issue-view.sh
tmux/agent-send.sh          tmux/send-message.sh   fleet/start-agent-session.sh

And it is not a coherent old snapshot — it is a patchwork. ci-queue-wait.sh is dated Jul 25,
detect-platform.sh Aug 5. The installed tree corresponds to no commit that has ever existed.

Two consequences I have to state because they invalidate work I published:

  1. issue-comment.sh on main accepts --login <name>. I filed a framework defect claiming it
    has no identity flag and that CWD is its only input. The identity half of that is false against
    the SSOT — the flag exists. The stale installed copy lacks it, which is why a blocking review
    relay went out under the wrong account earlier tonight. The fix for the incident I reported was
    already merged and simply not installed.
  2. detect-platform.sh on main contains zero occurrences of "IMPERSONATION". The comment
    block I quoted at :293 and reasoned from does not exist upstream; the file has been
    substantially rewritten. My attribution analysis was measured against a stale copy and every
    conclusion drawn from it needs re-measuring before it is repeated.

Reframed work

  1. Refresh the installed framework on this host from main, then re-run the constructed
    pending and malformed probes against the installed path — not the SSOT — to confirm the guard
    now blocks where it executes.
  2. Add a drift check that fails loudly, because the whole lesson is that nothing noticed for
    weeks. Installed-vs-SSOT hash comparison, surfaced at session start or in mosaic doctor. A
    framework that cannot tell you it is running stale code will silently un-fix every gate it ships.
  3. Re-measure the accumulated framework-defect list against main before raising any of it. At
    least two entries are already stale-copy artifacts. I will not carry that list forward as-is.

The doctrine line I have been repeating all night was still not strong enough. rc=0 is not a
reading; a wrapper's self-reported identity is not a reading; a guard's confident status line is not
a reading — and the source you are reading is not necessarily the source that runs. Verify
against the artifact that executes.

Credit where it is owed: @coder3 was handed a brief that told it to go fix something, and instead
measured the premise and refused the work. That is the correct outcome and the expensive one to get
right — the cheap path was to write a duplicate patch and let it be merged.

## Correction — I diagnosed the wrong tree. The source is already fixed; the defect is propagation. `@coder3` was dispatched to fix this, ran a preflight, and **stopped before creating a branch** because the fix already exists on `main`. It was right and I was wrong, and the error is mine, not a detail: I analysed `~/.config/mosaic/tools/git/ci-queue-wait.sh` — the *installed* copy — and wrote the issue as though it were the SSOT. Verified independently against `origin/main`, not taken from a report: - `packages/mosaic/framework/tools/git/ci-queue-wait.sh` uses `python3 -c` at **both** sites (lines 43 and 92), so stdin stays free for the provider JSON. No heredoc collision. - Parse failure classifies `malformed`; valid-but-unsupported vocabulary classifies `unknown`; both land in the **non-zero** `ASSERTED_NOT_READY` arm together with `terminal-failure` (line 473). - `pending` enters the wait/timeout path and cannot exit 0 (line 438). - Landed in `58b971ab`, *"fix(rm-03): make CI queue guard fail on asserted non-readiness (#1032)"*, an ancestor of `main`. `git blame` pins both `python3 -c` sites and the malformed/unknown handling to that commit. - `packages/mosaic/framework/tools/git/test-ci-queue-wait-tristate.sh` passes on `main`, and it is process-level rather than classifier-only: the `pending` fixture requires `rc != 0`, `ASSERTED_NOT_READY`, provider observation, pending-context output, sleep, and timeout expiry. So the requirements I wrote — free stdin, `unknown` out of the exit-0 arm, the two roads distinguished, a regression that fails against the broken tree — were **already implemented and merged**, in the same shape, before I filed this. No source PR should be opened. Closing this as a code defect. ## What is actually broken, and it is worse than what I filed The fix merged and never reached the thing that executes. ``` SSOT 320bd729ec013ef3a9cef6b2769060d979a4e069e69666be305c96f15277ef62 INSTALLED 19cda2f7009c536eb4da9a8df0e7a62f3db0277c9a577bdae5db003f4da3f3cb ``` The installed copy still has `python3 - <<'PY'` in both functions. Every measurement in this issue is real — the constructed payloads, the three deterministic `unknown` runs, and the live capture of a genuinely pending pipeline waved through in under a second. All of it was produced by the **installed** guard, which is the one every seat on this host actually runs, because `~/.config/mosaic/tools/` is the mandated path. The merge of #1173 did pass a vacuous guard. That part stands. The correction is to the *cause*, and it inverts the remedy: this is not "write the fix," it is "the fix exists, is reviewed, is merged, and is not running." ## The scope is not one file Comparing every installed framework tool against `origin/main`: ``` in-sync: 104 | STALE: 38 | not-installed: 53 ``` The stale 38 include the tools this fleet's correctness arguments have been resting on: ``` git/detect-platform.sh git/pr-merge.sh git/pr-review.sh git/issue-comment.sh git/issue-create.sh git/issue-close.sh git/pr-create.sh git/pr-metadata.sh git/issue-view.sh tmux/agent-send.sh tmux/send-message.sh fleet/start-agent-session.sh ``` And it is not a coherent old snapshot — it is a patchwork. `ci-queue-wait.sh` is dated **Jul 25**, `detect-platform.sh` **Aug 5**. The installed tree corresponds to no commit that has ever existed. Two consequences I have to state because they invalidate work I published: 1. **`issue-comment.sh` on `main` accepts `--login <name>`.** I filed a framework defect claiming it has no identity flag and that CWD is its only input. The identity half of that is false against the SSOT — the flag exists. The stale installed copy lacks it, which is why a blocking review relay went out under the wrong account earlier tonight. The fix for the incident I reported was already merged and simply not installed. 2. **`detect-platform.sh` on `main` contains zero occurrences of "IMPERSONATION".** The comment block I quoted at `:293` and reasoned from does not exist upstream; the file has been substantially rewritten. My attribution analysis was measured against a stale copy and every conclusion drawn from it needs re-measuring before it is repeated. ## Reframed work 1. **Refresh the installed framework on this host from `main`**, then re-run the constructed pending and malformed probes against the *installed* path — not the SSOT — to confirm the guard now blocks where it executes. 2. **Add a drift check that fails loudly**, because the whole lesson is that nothing noticed for weeks. Installed-vs-SSOT hash comparison, surfaced at session start or in `mosaic doctor`. A framework that cannot tell you it is running stale code will silently un-fix every gate it ships. 3. **Re-measure the accumulated framework-defect list against `main` before raising any of it.** At least two entries are already stale-copy artifacts. I will not carry that list forward as-is. The doctrine line I have been repeating all night was still not strong enough. `rc=0` is not a reading; a wrapper's self-reported identity is not a reading; a guard's confident status line is not a reading — **and the source you are reading is not necessarily the source that runs.** Verify against the artifact that executes. Credit where it is owed: `@coder3` was handed a brief that told it to go fix something, and instead measured the premise and refused the work. That is the correct outcome and the expensive one to get right — the cheap path was to write a duplicate patch and let it be merged.
Mos changed title from ci-queue-wait.sh cannot block: classifier always returns unknown, and unknown is an exit-0 arm (Constitution gate 6 is vacuous) to Installed framework on web1 is weeks-stale patchwork: 38 tools drift from main, silently un-fixing merged gate fixes (queue guard, identity flags) 2026-08-13 06:33:42 +00:00
Collaborator

Why #1195 exists: the measured stale set includes identity resolution, messaging/session delivery, and queue/merge gate tools. These are three instances of the same defect class: the installed artifact that seats actually execute disagrees with the reviewed source, while the host has no durable control that can observe and distinguish STALE from NOT_INSTALLED. A source fix can therefore be written, reviewed, merged, and remain operationally inert for weeks. #1195 mechanizes that missing observation in mosaic doctor; it deliberately detects only and does not refresh live tooling.

Why #1195 exists: the measured stale set includes identity resolution, messaging/session delivery, and queue/merge gate tools. These are three instances of the same defect class: the installed artifact that seats actually execute disagrees with the reviewed source, while the host has no durable control that can observe and distinguish STALE from NOT_INSTALLED. A source fix can therefore be written, reviewed, merged, and remain operationally inert for weeks. #1195 mechanizes that missing observation in mosaic doctor; it deliberately detects only and does not refresh live tooling.
Collaborator

Status after PR #1195 — this issue stays OPEN

PR #1195 merged to main as 41749bbd (squash), CI pipeline 2397 terminal success at head
3d7953671c04, 8/8 steps, independent adversarial review APPROVE at that exact head.

#1195 does not close this issue. It delivers drift detection: the framework manifest's
operator matcher treated an exact entry as a directory prefix, so a bare tools/git operator
entry hid every drifted framework tool beneath it and the checker returned clean. That blind spot
is closed and pinned by a regression that is RED at the pre-fix head c59a55f8.

Detecting the drift is not repairing it. The 38 stale installed tools on web1 are still stale.
That remediation is the remaining scope of this issue and it is not started.

This issue was filed with a body describing a different defect

The title is the installed-framework drift. The body it was filed with describes the
ci-queue-wait.sh classifier defect — python3 - reading its program from a heredoc that is
stdin, so the piped status JSON never reaches the interpreter, every payload classifies unknown,
and unknown sits in the exit-0 arm.

That defect is real and I re-verified it against main today rather than carrying it forward on
the strength of the original write-up. The installed copy and main are byte-identical
(sha256 19cda2f7009c…), and a constructed pending payload still classifies unknown.

It has been split out to #1198 so it is not lost when this issue closes on the refresh work.
It is distinct from #1177 (target selection, not payload delivery); both are live.

Consequence I am recording rather than leaving implicit

Gate 6 requires the CI queue guard before any push or merge. Because the classifier cannot block,
the guard runs I performed for #1195's own push and merge were vacuous — they returned rc=0
without ever reading a queue state. The merge was still sound, but it was made sound by direct
provider readback of pipeline 2397's terminal state bound to the exact head, not by the guard.
A control that cannot fail did not contribute to it.

## Status after PR #1195 — this issue stays OPEN PR #1195 merged to `main` as `41749bbd` (squash), CI pipeline 2397 terminal success at head `3d7953671c04`, 8/8 steps, independent adversarial review APPROVE at that exact head. **#1195 does not close this issue.** It delivers drift *detection*: the framework manifest's operator matcher treated an exact entry as a directory prefix, so a bare `tools/git` operator entry hid every drifted framework tool beneath it and the checker returned clean. That blind spot is closed and pinned by a regression that is RED at the pre-fix head `c59a55f8`. Detecting the drift is not repairing it. **The 38 stale installed tools on web1 are still stale.** That remediation is the remaining scope of this issue and it is not started. ## This issue was filed with a body describing a different defect The title is the installed-framework drift. The body it was filed with describes the `ci-queue-wait.sh` classifier defect — `python3 -` reading its program from a heredoc that *is* stdin, so the piped status JSON never reaches the interpreter, every payload classifies `unknown`, and `unknown` sits in the exit-0 arm. That defect is real and I re-verified it against `main` today rather than carrying it forward on the strength of the original write-up. The installed copy and `main` are byte-identical (sha256 `19cda2f7009c…`), and a constructed `pending` payload still classifies `unknown`. It has been split out to **#1198** so it is not lost when this issue closes on the refresh work. It is distinct from #1177 (target selection, not payload delivery); both are live. ## Consequence I am recording rather than leaving implicit Gate 6 requires the CI queue guard before any push or merge. Because the classifier cannot block, the guard runs I performed for #1195's own push and merge were vacuous — they returned rc=0 without ever reading a queue state. The merge was still sound, but it was made sound by direct provider readback of pipeline 2397's terminal state bound to the exact head, not by the guard. A control that cannot fail did not contribute to it.
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1194