Skip to content

The vendor freshness gate is advisory and nothing runs it — and #669 describes it wrongly - #670

Merged
syncytium2 merged 2 commits into
mainfrom
todo/vendor-freshness-is-advisory
Sep 19, 2026
Merged

syncytium2 merged 2 commits into
mainfrom
todo/vendor-freshness-is-advisory

Conversation

@syncytium2

@syncytium2 syncytium2 commented Sep 19, 2026

Copy link
Copy Markdown
Owner

Three things about one gate, filed as a todo plus the INDEX row that was missing.

The gate nobody runs

tools/check_vendor_freshness.sh checks four vendored families against their upstreams. A grep of the tree finds it named in CLAUDE.md, docs/SESSIONS.md, docs/DEPLOY_HOLD.md, four todos and a sapper-feedback note — and in no workflow under .github/, no test under tests/, no hook under .githooks/. It runs when a session remembers to type it.

Worth naming because the failure it exists to catch already happened: third_party/draughtsman/ sat pinned at cb7fc2a for three days while draughtsman had fixed a mis-routed edge in bb83174, and the front page published that figure with nothing red.

The todo says why wiring it into CI is not a one-liner — it resolves upstream through gh against two private repositories, and BUGARACH_INTERFACE2 names a machine-local clone no runner has — and lists the candidates in order of cost. Its own design anticipates this: exit 2 means could not determine, chosen deliberately because a false STALE is its own harm.

The upstream answer can be twelve hours old, and the report doesn't say so

murderboard_freshness.sh caches the resolved upstream HEAD per family in the git common dir for TTL seconds — default 43,200. --refresh is the only bypass. The verdict line names the cached sha as "upstream" without marking it as cached.

That is not hypothetical: it is where #669's wrong claim came from. Its cache held a draughtsman sha written before draughtsman #1 merged, so the session reasoned about a repository state that had stopped existing hours earlier.

The gate does guard the behind-cache direction, with a self-test ("a BEHIND cache is not stale") that keeps a consumer stamped at or after the cached sha from being accused. But provably at-or-ahead of a twelve-hour-old sha is weaker than current, and nothing in the output separates them — in the exact window the gate exists for: upstream merges, a session re-vendors the same day and checks its work.

Credit where it is due: the session that wrote the wrong claim is the one that traced it to this.

A published misreading, corrected

#669 said in its body that the gate "compares each family file with the last upstream commit touching that file" and therefore that the draughtsman family "reports stale permanently." Neither holds, and its author has since corrected the body and confirmed the reading here. The correction is recorded in the tree anyway, because the PR is merged and a later session will meet the claim before it meets any reply:

One more thing recorded

#669 was opened at 17:42 EDT and merged at 17:44 — before CI finished, on a branch whose suite now takes two hours. Three stamp lines over a byte-identical package, so nothing broke. But tools/merge_when_green.sh exists to refuse exactly that, and merging through the API goes around it. Noted, not escalated.

Docs only: one new todo, one INDEX row. tests/test_index_resolves.py 334 passed; sapper, check_quotes and check_pipelines clear.

🤖 Generated with Claude Code

https://claude.ai/code/session_017hQX6iESxBsQk7Jan875e3

…describes it wrongly

Two things, one subject.

The gate: tools/check_vendor_freshness.sh checks four vendored families against their
upstreams, and a grep of the tree finds it named only in prose — CLAUDE.md, the boards,
DEPLOY_HOLD, four todos, a sapper note — and in no workflow, test or hook. It runs when
a session remembers to type it. That is worth naming because the failure it exists to
catch already happened: third_party/draughtsman/ sat pinned at cb7fc2a for three days
while the upstream had fixed a mis-routed edge, and the front page published the bad
figure with nothing red. The todo records why wiring it into CI is not a one-liner —
two private upstreams and a machine-local clone path — and lists the candidates.

The misreading: #669, merged today, says in its body that the gate compares each family
file with the last upstream commit touching that file, and concludes the draughtsman
family will read stale permanently. Neither holds. There is no per-file history lookup
in murderboard_freshness.sh; the first listed file supplies one stamp for the family,
the others are reported only when they disagree with it, and that stamp is compared
against upstream HEAD. A family going stale when its upstream moves is the gate working.
A merged PR body cannot be unpublished, so the correction is filed where a later session
reading #669 will meet it.

Also recorded: #669 was opened and merged two minutes apart, before CI finished on a
branch whose suite takes two hours. Three stamp lines over a byte-identical package, so
nothing broke — but merge_when_green.sh exists to refuse exactly that, and the API route
goes around it.

An INDEX row now points at the gate, because there was none.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017hQX6iESxBsQk7Jan875e3
… report does not say so

Found by the session that wrote #669, tracing where its own wrong claim came from —
the useful half of that story.

murderboard_freshness.sh caches the resolved upstream HEAD per family in the git common
dir for TTL seconds, default 43200. --refresh is the only bypass. The verdict line names
the cached sha as "upstream" without marking it as cached, so a session can reason about
a repository state that stopped existing hours ago. That is what happened: the cache held
a draughtsman sha written before draughtsman #1 merged.

The gate guards the behind-cache direction and self-tests it, so a consumer stamped at or
after the cached sha is not accused. But "provably at-or-ahead of a twelve-hour-old sha"
is weaker than "current", and nothing in the output separates them. The window is exactly
the one the gate exists for: upstream merges, a session re-vendors the same day and checks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017hQX6iESxBsQk7Jan875e3
@syncytium2
syncytium2 merged commit 66e6f31 into main Sep 19, 2026
3 checks passed
@syncytium2
syncytium2 deleted the todo/vendor-freshness-is-advisory branch September 19, 2026 22:12
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.

2 participants