Skip to content

Two PENDING changesets ship false connector-ledger mechanism claims into CHANGELOG.md — and they are two different classes, only one of which may be corrected #19729

Description

@os-warren

Filed by the domain:spec execution seat 2, session session_01UDXER3sdqfeVYpEWZs5mZx, 2026-09-22T13:15Z. ⛔ Unlabelled and unrouted — an execution seat files, triage grades and routes. Suggested lane: domain:spec (both fragments describe packages/spec's connector ledger).

⏱️ This card has a deadline that most do not. Both fragments are PENDING .changeset/ entries. changeset version deletes the fragment and publishes its text into CHANGELOG.md, so every hour they sit there is an hour closer to a false mechanism claim shipping to consumers as a released changelog entry. ⛔ Do not let this age on the queue like an ordinary p3.

What is wrong, in two DIFFERENT classes — and the split is the whole point

The two fragments look like one finding. They are not, and conflating them is how a fixer produces a half-corrected record.

Class 1 — FALSE WHEN WRITTEN. These are defects in the record and must be corrected.

.changeset/18582-connector-analytics-cube-liveness-ledgers.md:9 carries two:

(a)authentication is planned: refused outright by ADR-0097 §3, never ignored」

Measured at the merge base of PR #19657 — i.e. before any of this work touched anything:

  • packages/spec/src/integration/connector.zod.ts:776 already read authentication: ConnectorAuthConfigSchema.optional().default({ type: 'none' });
  • and packages/spec/liveness/connector.json's own authentication row — seeded by the very PR that wrote this changeset — already read 「the only value an author may write is { type: 'none' }, and anything else is LOUDLY REFUSED rather than silently dropped … Not live: the accepted value does nothing」.

the same PR wrote the false claim in its changeset and the correct one in its ledger row. That is an internal contradiction at authoring time, so ⛔ no historical archaeology is needed to call it false-when-written. And ADR-0097 §3, the instrument the sentence names, is titled 「Credentials are references」 and rejects inline secrets in stack metadata — ⛔ not the key.

(b) 「The keys an authored entry can actually reach are the ConnectorProviderContext fields plus name and enabled

Three counts, none of which depended on anything that changed since: name is one of those fields (connector-provider.ts:68), so 「plus name」 double-counts; provider is read on the authoring door (plugin.ts:1478, :1533) and is not on the interface, so it is missing; loadPackageFile is on the interface but is host-injected (plugin.ts:1601), so it is over-included.

Class 2 — TRUE WHEN WRITTEN, stale now. ⛔ These are a DATED RECORD and must NOT be rewritten.

⭐ The ruling this card asks for, and why the obvious objection dissolves

The delivering round declined to touch either fragment and asked the seat. Its stated worry was that 「rewriting the mechanism sentences while leaving the dated counts produces exactly the half-corrected row this round exists to stop」.

That worry dissolves once the two classes above are separated. A dated record's job is to say what was true when it was written. So:

  • a sentence that was never true is a defect in the record ⇒ correct it;
  • a sentence that was true and has since been overtaken is the record working ⇒ ⛔ leave it, and if anything add the later fact beside it rather than overwriting it.

That is not a hybrid. It is the same rule packages/spec/liveness/README.md already applies to its own Notes, and the same one PR #19657's round 5 applied when it recorded both halves of an overtaken falsification rather than overwriting the old claim.

The ask: correct Class 1 only, in .changeset/18582:9. ⛔ Leave every Class 2 sentence exactly as written, in both fragments. If the taker judges .changeset/18983 worth a dated 「as of #18975 it also carries …」 note, that is a judgement call, ⛔ not a correction — and its conclusion stands either way.

The corrected wording already exists and can be lifted verbatim from packages/spec/liveness/README.md:942 and from connector.json's _note at PR #19657's head 657788103c9bd6cfca04ad4aaae85b6920476514 — ⛔ the taker does not need to re-derive any of it.

⛔ Why this is not a rider on PR #19657

Ruling 5644350230 item 4's lane-split logic and the ordinary scope rule both apply: these are another card's release inputs, outside packages/spec and outside that PR's touched set. ⭐ And the distinction that makes the refusal principled rather than convenient: round 5 of that PR was failed precisely because it left a stale claim in a line its own diff touched. Neither of these fragments is such a line. ⇒ correcting them there would be a cross-card rider; correcting them here is the record.

Duplicate-search words

changeset ConnectorProviderContext, authentication refused outright, connector ledger seeding counts, changeset-18983 interface enumeration, pending changeset false mechanism

Maintainer-action: countersign PR #19746 in writing on the PR (the route-0 DELIBERATE CORRECTION confirmation pr-automation.yml asks for), then merge it over the deliberately red Check Changeset — done when PR #19746 is MERGED and .changeset/18582-connector-analytics-cube-liveness-ledgers.md on origin/main carries the corrected line 9


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsbugSomething isn't workingdomain:specpm:awaiting-maintainerpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions