Question
Nothing in this fleet notices when a new SDK version publishes, so the reader list goes stale silently and is only ever corrected by someone tripping over it. What watches it, and where does that watcher live?
Split out of #327, which found it while answering a narrower question.
The gap, measured
Both halves of the reader list in COMPATIBILITY.md are stale right now, and both gates that guard it are green:
| row |
pinned |
published |
gate that reads it |
crates.io pg-core |
0.6.1 (moving to 0.6.3 in #352) |
0.6.3 |
pg-compat/tests/support_window.rs |
npm @e4a/pg-wasm |
0.6.1 |
0.6.3 |
pg-compat-js/test/manifest.test.mjs |
Both gates check internal consistency and nothing else: the Rust one compares the document's rows against pg-compat's readers(), the Node one compares the document's rows against the installed alias's own package.json. Document versus install, never install versus registry. So a row can be years old with every check passing.
This is the root cause under #268 and #327 both — and note #268's framing, that "the crates.io rows are unchecked", was only half of it. The npm rows are checked, just not for the property that goes stale.
Why the obvious reuse does not work
The first answer was to reuse postguard-e2e#22's publish-watcher, which already opens a PR when a new SDK version ships. Checked, and it cannot reach:
compat/registries.mjs:8-11 — registryOf handles npm and nuget and throws on anything else. There is no crates.io backend. (One implementation note if it gains one: crates.io's API rejects requests without a User-Agent.)
- It rewrites its own repo's
compat/manifest.json and its coupled pins. Aiming it at this repo means cross-repo PR writes, needing a credential this fleet has deliberately not granted — the same trade-off #332 and #334 are weighing. Decide them together if more than one wants a credential.
The schedule: tension, which is not a contradiction
#318 deliberately gave its drift detector no schedule:, reasoning that a disarmed gate can only do harm when something merges, that every merge already fires a pull_request and a push run, and that a nightly nobody reads would be a silent gate about a silent gate.
That reasoning does not transfer here, and the difference is the whole point. A ruleset drifts because someone edited something, so a merge-triggered check always fires on the change that caused it. A reader row goes stale because the world changed — a version published in another registry, with no commit in this repo — so a merge-triggered check never fires at all. The event that matters happens while nobody is pushing.
Say this explicitly wherever it lands, or the next person reads the two decisions as contradictory and reverts one.
To settle
- Scheduled job here, or teach the e2e watcher crates.io plus a cross-repo token? The first is self-contained and needs no credential; the second centralises the logic but pays the credential price and couples two repos' release paths.
- What it does on a finding — open a PR moving the row and the pin (the e2e watcher's shape, and the only one that produces something mergeable), or fail loudly and leave it to a human. Note a PR here is not a two-line edit: moving the crates.io row means regenerating
pg-compat/Cargo.lock, and moving an npm row means reinstalling an alias.
- Whether staleness should ever be an error rather than a notification. A row two patches behind is not a broken gate — it is a gate testing an older reader than it claims. That is weaker than advertised but not wrong, so a red build may be the wrong instrument.
- The
nuget E4A.PostGuard 0.6.0 row, which is declared-but-ungated by decision in #268 and would be covered for free by anything that watches registries. Fold it in or restate why not.
The half a coding agent cannot do
A scheduled job in this repo means a file under .github/workflows/, and the dobby-coder App lacks workflows: write — the push is rejected at the remote. Whoever builds this ships the pushable half (script, tests, documents) and hands the maintainer ready-to-paste YAML. Confirm the handover comment exists at the URL it is claimed to be at: this map has one recorded case (#324) of a handover being reported and never posted.
Part of #247 (workstream C).
Question
Nothing in this fleet notices when a new SDK version publishes, so the reader list goes stale silently and is only ever corrected by someone tripping over it. What watches it, and where does that watcher live?
Split out of #327, which found it while answering a narrower question.
The gap, measured
Both halves of the reader list in
COMPATIBILITY.mdare stale right now, and both gates that guard it are green:crates.io pg-core0.6.1(moving to0.6.3in #352)pg-compat/tests/support_window.rsnpm @e4a/pg-wasm0.6.1pg-compat-js/test/manifest.test.mjsBoth gates check internal consistency and nothing else: the Rust one compares the document's rows against
pg-compat'sreaders(), the Node one compares the document's rows against the installed alias's ownpackage.json. Document versus install, never install versus registry. So a row can be years old with every check passing.This is the root cause under #268 and #327 both — and note
#268's framing, that "the crates.io rows are unchecked", was only half of it. The npm rows are checked, just not for the property that goes stale.Why the obvious reuse does not work
The first answer was to reuse postguard-e2e#22's publish-watcher, which already opens a PR when a new SDK version ships. Checked, and it cannot reach:
compat/registries.mjs:8-11—registryOfhandlesnpmandnugetand throws on anything else. There is no crates.io backend. (One implementation note if it gains one: crates.io's API rejects requests without aUser-Agent.)compat/manifest.jsonand its coupled pins. Aiming it at this repo means cross-repo PR writes, needing a credential this fleet has deliberately not granted — the same trade-off #332 and #334 are weighing. Decide them together if more than one wants a credential.The
schedule:tension, which is not a contradiction#318 deliberately gave its drift detector no
schedule:, reasoning that a disarmed gate can only do harm when something merges, that every merge already fires apull_requestand apushrun, and that a nightly nobody reads would be a silent gate about a silent gate.That reasoning does not transfer here, and the difference is the whole point. A ruleset drifts because someone edited something, so a merge-triggered check always fires on the change that caused it. A reader row goes stale because the world changed — a version published in another registry, with no commit in this repo — so a merge-triggered check never fires at all. The event that matters happens while nobody is pushing.
Say this explicitly wherever it lands, or the next person reads the two decisions as contradictory and reverts one.
To settle
pg-compat/Cargo.lock, and moving an npm row means reinstalling an alias.nuget E4A.PostGuard 0.6.0row, which is declared-but-ungated by decision in#268and would be covered for free by anything that watches registries. Fold it in or restate why not.The half a coding agent cannot do
A scheduled job in this repo means a file under
.github/workflows/, and thedobby-coderApp lacksworkflows: write— the push is rejected at the remote. Whoever builds this ships the pushable half (script, tests, documents) and hands the maintainer ready-to-paste YAML. Confirm the handover comment exists at the URL it is claimed to be at: this map has one recorded case (#324) of a handover being reported and never posted.Part of #247 (workstream C).