Skip to content

docs(changeset): correct six pending changesets whose surrounding claims a later merge falsified (objectui#9065) - #9139

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-9065-changeset-forward-reference-audit
Sep 11, 2026
Merged

docs(changeset): correct six pending changesets whose surrounding claims a later merge falsified (objectui#9065)#9139
baozhoutao merged 1 commit into
mainfrom
claude/issue-9065-changeset-forward-reference-audit

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #9065

Seven pending .changeset/*.md bodies carried a claim that had expired or was never true. A pending changeset body publishes VERBATIM into a CHANGELOG at the next release, and this repository's Changesets release PR — objectui#5400, chore: release packages, branch changeset-release/main — has been standing open since 2026-08-20. So the deadline here is one maintainer click, not one release cycle.

Prose only. ⛔ No frontmatter moves: scripts/check-changeset-overwrite.mjs prints declared at base and declares now identically for all six edited files, and 0 changeset(s) added, 6 modified, 0 deleted.

⚠️ Six files are edited, not seven. .changeset/olive-pears-invent.md is deliberately left alone as a measured ruling — see its row below.


Site 7 — .changeset/8253-export-tree-view-config.md, taken first

The domain:spec seat routed this here as the strong class, and it is: the paragraph states the opposite of what the tree face now does.

Half 1 — "titleField is declared, not deleted" is FALSE on main

Re-derived on fac5acfa4, three readings:

  1. packages/types/src/views.ts:147TreeViewConfig is now the protocol's own block: NonNullable of SpecListView's tree member.
  2. packages/types/src/__tests__/tree-view-config-readers-8253.test.ts:123 — a compile-time assertion that TreeViewConfig is not structurally equal to that block intersected with an optional titleField. It is a FIRING CONTROL on the parity check next to it, so the parity check can say false.
  3. Same file, :304 — the console rung is asserted not to contain the cast-then-titleField read.

⇒ the declaration is gone. The paragraph is rewritten to past tense and gains a ⚠️ Superseded note naming objectui#8841 / PR objectui#9052 and @objectstack/spec@17.4.0's strictObject refusal, and keeps the historical reason the key was declared. ⛔ The paragraph is not deleted.

Half 2 — "Deleting the read would have … reddened its pin" measured TRUE. ⭐ The card's table is wrong here.

The instruction to drop that clause was explicitly conditional on this measurement, and the condition fired. Measured at 2f6b2bf1a^ = c3a427378, in a dedicated detached worktree, with objectui#6557's pin unedited and each leg proven on disk (anchor counts before/after plus a blob-hash comparison against HEAD, restored to git diff HEAD empty after every leg):

leg what was deleted at 2f6b2bf1a^ objectui#6557's pin
baseline nothing 8 passed (8)
A the console composition's titleField rung in packages/app-shell/src/views/ObjectView.tsx 1 failed, 7 passedexpected 'name' to be 'v_tree_title'
B only plugin-tree's ?? schema.titleField node rung 8 passed (8)
C all four tree titleField reads 1 failed, 7 passed

⇒ under the sentence's own antecedent — the reads it has just enumerated, "all four read sites" — deleting the read does redden the pin. The clause is therefore kept, re-scoped, ⛔ not dropped.

Two premises behind the "it was never true" verdict do not survive measurement:

  • objectui#9052 did NOT edit the pin. packages/app-shell/src/views/ObjectView.titleFieldConvergence.test.tsx has blob 04fd1e306 at 2f6b2bf1a^, at 2f6b2bf1a and at fac5acfa4 — byte-identical. Control: packages/types/src/views.ts moves 544cb074e to 29824e7eb across the same merge. The two phrases attributed to objectui#9052 ("the seam count below dropped from seven to six", "the middle rung is gone") are already present at 2f6b2bf1a^ and belong to objectui#7029 and objectui#6557 respectively.
  • "32/32" is not a reading of this pin. The pin file holds 8 tests; the three app-shell files citing objectui#6557 hold 37 between them. Neither is 32.

What objectui#9052 actually removed is leg B plus the declaration — which is exactly why it could ship without touching the pin, and its own changeset says so: "objectui#6557's pin on that rung stays green".


The six — a per-changeset reading, with the closed card's outcome

⭐ Five of six turned out to be the objectui#9042 class, not the cosmetic one: the citation's surrounding claim was falsified when the card closed.

pending changeset what the closed card actually did the surrounding claim ruling
5293-view-sort-order-spelling.md objectui#6011 closed by PR objectui#6234, which retired direction from the second published export "one published export still accepts direction, and this release does not retire it" — toSortItems "folds s.order or s.direction or 'asc'" EDIT — falsified. view-config-utils.ts:326 now reads "Reads order, and only order", and the body is (s.order or 'asc')
olive-pears-invent.md objectui#7170 closed "option 1, leave it. Already done." — a triage ruling with no code change "it lands on create, tracked as objectui#7170" LEAVE ALONE — still TRUE. packages/data-objectstack/src/index.ts still reads (op?.action ?? 'create') === 'create' ? 'create' : 'update', and the comment above it still explains why. Two independent reasons, below.
7165-grid-dependent-values.md objectui#7188 closed by PR objectui#7241, which carried the staged row across the seam "⚠️ Interim … a parent edited but not yet saved does not re-scope the child" EDIT — falsified. pendingRow is a published member of the renderCellEditor context, and ObjectGrid.tsx:4324 passes dependentValues={ctx.pendingRow ?? ctx.row}
7655-chatbot-registration-authoring-faces.md objectui#7708 closed by PR objectui#8077, "fence chatbot-floating's raw props spread" "Its trailing raw props spread does carry authored keys into the panel todayprocessVisibility, surface and showAvatars are live there" EDIT — falsified. renderer.tsx:448 is now toDomProps(props) spread FIRST, and renderer.authoring-faces-7655.test.tsx:231 pins those three keys as dark
7727-conditional-formatting-record-scope.md objectui#8166 closed by PR objectui#8963, which unbound the ambient data root on record surfaces "data.status == 'x' still lints clean … while resolving against the host's ambient data rather than the row — constant-false, silently" EDIT — half falsified, and it is the material half. The lint still ACCEPTS the spelling (producer-side, @objectstack/formula's SCOPE_ROOTS), but it no longer RESOLVES: it now faults with Unknown variable: data. The silence is gone
8934-chatter-feed-affordance-only.md objectui#8983 closed by PR objectui#9011, "bind the host discussion fallback to the feed pipeline" "The panel the host auto-appends … does not run this pipeline, so it is unchanged and now renders a different feed" EDIT — falsified. record-chatter.tsx:74 — "since objectui#8983 that fallback mounts THIS renderer with no schema"; RecordDetailView.discussionFallbackPipeline-8983.test.tsx pins that both surfaces render the same feed

⭐ Why olive-pears-invent.md is a ruling and not an omission

Two independent measurements, either of which is sufficient:

  1. The surrounding claim is still true. objectui#7170 was closed as a triage ruling not to fix (option 2 ruled out on contract-review allocation, option 3 on measurement). The fabrication is live on main today, so the sentence describing it is accurate.
  2. It cannot reach a reader through a CHANGELOG. Its frontmatter is empty — the repo's explicit no-release declaration — so Changesets writes no entry for it at all. Re-run below with a firing control.

Measurement method — every phrase read FLATTENED, every zero paired with a control

The card names a false zero that already cost one reading: a line-based grep returns 0 for a phrase spanning a line break. Every count below is taken after tr '\n' ' ' | tr -s ' '.

Sweep across all 42 CHANGELOG.md files, one instrument, one run, on each of the two heads:

phrase objectui#5400 head e4ce4f42f main fac5acfa4
tracked as objectui#6011 1 0
tracked as #7188 1 0
tracked as objectui#7708 2 0
tracked as objectui#8166 0 0
tracked as objectui#8983 0 0
is declared, not deleted 0 0
reddened its pin 0 0
UNATTRIBUTED_STRIP_OBJECT 0 0
FIRING CONTROL: Patch Changes 2938 2899

⇒ the instrument fires, and it fires differently on the two heads. UNATTRIBUTED_STRIP_OBJECT reading 0 in the same run where three siblings read 1 / 1 / 2 is a real zero, ⛔ not a dead query.

⚠️ The three zeros in rows 4-6 are NOT safety. objectui#5400's head was last refreshed 2026-09-07; those changesets landed on main after that. The action regenerates that head from main on the next push, so every pending changeset is one refresh away from being staged. A correction on main propagates into it. ⛔ objectui#5400 is not touched by this PR.


Gates, by required-context name

required context the command CI runs exit
Changeset Declaration node scripts/check-changeset-presence.mjs 0
Lint node scripts/check-lint-coverage.mjs and the rest, behind lint.yml's Decide whether this change needs a full run 0 locally; the job's own gate resolves should_run=false for a .changeset/**-only PR and still reports
Type Check ci.yml, same should_run gate same
Test (shard 1/4 .. 4/4) ci.yml, same should_run gate same
Build & E2E ci.yml, same should_run gate same
Build Docs ci.yml, same should_run gate same

Changeset Declaration is the one required context with no path filter, so it evaluates this diff for real. Verbatim:

Compared the working tree with fac5acfa4 (merge-base with origin/main): 6 file(s) changed, 0 of them published source of a package the release covers, 0 of them a manifest whose published contract moved, 0 under a package changesets ignores, 0 changeset(s) added.
✅  No source or published contract of a released package changed in this range, so no changeset is owed.

⇒ no changeset is owed for this PR, and ⛔ no skip-changeset label is applied — in this repository that label is not the mechanism.

The four other gates that read .changeset/, plus two that read every tracked text file, all run and all exit 0:

gate exit note
node scripts/check-changeset-claims.mjs 0 0 file(s) changed outside .changeset/ — nothing to re-read
node scripts/check-changeset-overwrite.mjs 0 REPORTS all six, which is its documented case 2, "You are CORRECTING a declaration on purpose". Report-only. Declarations identical before and after
node scripts/check-changeset-no-major.mjs 0 no major declared
node scripts/check-changeset-fixed.mjs 0 fixed group intact
node scripts/check-control-bytes.mjs 0 7327 tracked text files scanned
node scripts/check-new-cross-file-line-citations.mjs 0 0 new citations

No test pins any rewritten sentence. No file outside .changeset/ names any of the seven changesets; a grep -rl for each rewritten phrase returns nothing outside .changeset/ (with a firing control on applyFeedConfig, which returns three files). TURBO_SCM_BASE against the base reports 0 no packages affected. scripts/__tests__ for the five changeset gates plus control-bytes: 157 passed (157).


A two-sided probe for origin/main after merge

Both legs flattened; floors are per file. ⭐ Leg 2 is leg 1's FIRING CONTROL: same pipeline, same instrument, same run, same .changeset/ files — it must return non-zero, so a leg 1 of all zeros cannot be a broken query. Verified on this branch: leg 1 = 0 six times, leg 2 = 1 six times.

# leg 1 — what must have CHANGED (each must print 0)
for pair in \
  "8253-export-tree-view-config.md|is declared, not deleted" \
  "5293-view-sort-order-spelling.md|still accepts \`direction\`" \
  "7165-grid-dependent-values.md|does not re-scope the child" \
  "7655-chatbot-registration-authoring-faces.md|are live there" \
  "7727-conditional-formatting-record-scope.md|while resolving against the host" \
  "8934-chatter-feed-affordance-only.md|so it is unchanged and now renders"; do
  f=".changeset/${pair%%|*}"; p="${pair#*|}"
  printf '%-52s %s\n' "$p" "$(cat "$f" | tr '\n' ' ' | tr -s ' ' | grep -o -F "$p" | wc -l)"
done

# leg 2 — what must have SURVIVED (each must print exactly 1)
for pair in \
  "8253-export-tree-view-config.md|reddened that pin" \
  "8253-export-tree-view-config.md|the tree's second view-declared rung" \
  "8253-export-tree-view-config.md|declare it if the console writes it, else remove the read" \
  "olive-pears-invent.md|it lands on \`create\`, tracked as objectui#7170" \
  "olive-pears-invent.md|UNATTRIBUTED_STRIP_OBJECT" \
  "7727-conditional-formatting-record-scope.md|tracked as objectui#8166"; do
  f=".changeset/${pair%%|*}"; p="${pair#*|}"
  printf '%-58s %s\n' "$p" "$(cat "$f" | tr '\n' ' ' | tr -s ' ' | grep -o -F "$p" | wc -l)"
done

Expected values come from reads taken on this branch, not from intent. Leg 2 is the one that matters for review: it asserts that site 7's historical reasoning survived — the ruling, the pin citation and the counterfactual clause — and that the one changeset ruled leave-alone was in fact left alone, byte for byte (git diff fac5acfa4 -- .changeset/olive-pears-invent.md must be empty).


Things the card, the triage and the PM claim got wrong

  1. objectui#9052 did not edit objectui#6557's pin. The blob is identical across 2f6b2bf1a^, 2f6b2bf1a and fac5acfa4. The "the pin was rewritten to expect the removal" trap is real as a class but does not apply to this file.
  2. "reddened its pin" was TRUE, not false. Measured at the pre-merge base with the pin unedited: legs A and C red, leg B green. The domain:spec seat's row substitutes a narrower antecedent (the plugin-tree resolver rung) for the one the sentence actually names (all four read sites).
  3. "32/32" is not reproducible. The pin holds 8 tests; the three objectui#6557-citing app-shell files hold 37.
  4. The card under-rated its own six. It says only the citation's implication is stale and ranks this the objectui#9042-least-important clause. Five of the six surrounding claims are flatly false present-tense statements about shipped behaviour — the objectui#9042 class the card said it was probably not.
  5. Triage's all-clear control (Version Packages PRs = 0) does not fire here, as the PM claim already recorded and objectui#9134 now tracks.

Deliberately not done

  • ⛔ objectui#5400 untouched; ⛔ not a rider on objectui#9052; ⛔ not folded into objectui#9064.
  • ⛔ The two the other eight phrase-match neighbours are untouched — different objects, no miscount.
  • ⛔ No published CHANGELOG.md is edited.
  • 7655's displayMode tripwire sentence is left alone on purpose. objectui#7654 has landed the ?: never tombstone, but that sentence carries its own expiry in its own words ("until that PR flips it"), which is what separates it from the five corrected above.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

…merge falsified

Pending `.changeset/*.md` bodies publish VERBATIM into a CHANGELOG at the next
release, and this repository's release PR has been standing open since
2026-08-20, so each of these is one refresh away from being staged.

Site 7 (`8253-export-tree-view-config.md`) carried the strong shape: the
present-tense claim "`titleField` is declared, not deleted" was falsified when
objectui#8841 (PR objectui#9052) derived `TreeViewConfig` from the protocol and
dropped the key. The paragraph keeps the historical reason the key was declared
and gains a superseded note. The "deleting the read would have reddened its pin"
clause is KEPT and re-scoped, because it measured TRUE: at `2f6b2bf1a^`, with
objectui#6557's pin unedited, deleting the console composition's `titleField`
read reddens it (1 failed / 7 passed of 8) while deleting only plugin-tree's
`?? schema.titleField` rung leaves it green (8/8).

Five of the six `tracked as #N` citations turned out to sit inside surrounding
claims that the closed card falsified, which is the objectui#9042 class rather
than the cosmetic one:

  - 5293: objectui#6011 retired `toSortItems`' `direction` read entirely
  - 7165: objectui#7188 landed `pendingRow`, so the "Interim" limitation is gone
  - 7655: objectui#7708 fenced `chatbot-floating`'s raw props spread
  - 7727: objectui#8166 unbound the ambient `data` root, so the silent
          constant-false is now a loud `Unknown variable: data`
  - 8934: objectui#8983 bound the host discussion fallback to the pipeline

`olive-pears-invent.md` is deliberately left alone: its surrounding claim is
still true on `main` (`(op?.action ?? 'create')` is live) because objectui#7170
was closed "option 1, leave it" with no code change, and its empty frontmatter
means it writes no CHANGELOG entry at all.

No frontmatter is touched; this is prose only.

Part of #9065

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
@claude

claude Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

ACCEPT — PR objectui#9139, ⭐ and the round overturned TWO premises, one of them this seat's

Reviewed against the diff, ⛔ not the report. Every reading below is this seat's own, taken independently on origin/main and on head 369dd3c0f.

⭐ First, the correction this seat owes — my ⛔ was FALSE, and the dev measured it

My dispatch order carried, as a ⚠️ THE TRAP:

Running that pin on main and finding it green proves NOTHING about this clause. objectui#9052 edited that very file

That is wrong. Re-measured here:

ref packages/app-shell/src/views/ObjectView.titleFieldConvergence.test.tsx
2f6b2bf1a^ 04fd1e306afc4e6d5d51b5448a1ed0412c96c054
2f6b2bf1a 04fd1e306afc4e6d5d51b5448a1ed0412c96c054
origin/main 04fd1e306afc4e6d5d51b5448a1ed0412c96c054

Byte-identical. Firing control on the same merge: packages/types/src/views.ts moves 544cb074e29824e7eb. objectui#9052's only app-shell change is ObjectView.tsx — the read site, ⛔ not the pin.

⇒ I inferred「#9052 rewrote the pin」from the pin containing phrases like 「the seam count dropped from seven to six」 on main, and ⛔ never diffed it. Those phrases predate the merge. ⚠️ This is errata 38's shape exactly — a quantified ⛔ written from inference instead of measurement — and it is the second time this shift.

The dev did the one thing that makes a wrong fence survivable: it measured the fence and reported the disagreement instead of working around it. The order's drop instruction was written conditional on that measurement (「⚠️ conditional on your half-2 measurement… ⛔ do not drop it silently」); the condition fired and the clause was kept and re-scoped, ⛔ not dropped. That is the right outcome and the right route to it.

⭐ Half 2 measured TRUE — the domain:spec seat's second row does not survive

At 2f6b2bf1a^, pin unedited, each leg restored to git diff HEAD empty:

leg deleted pin
baseline 8 / 8
A the console composition's rung 1 failed / 7
B only plugin-tree's ?? schema.titleField 8 / 8
C all four tree reads 1 failed / 7

⇒ the sentence's own antecedent is 「the read」 after it has just enumerated four read sites. Under that antecedent, deleting it does redden the pin. The review row substituted the narrower one (leg B). ⭐ And 「32/32」 is not a reading of this pin at all — it holds 8 tests. ⚠️ The card warned about exactly this: 「the second row is a claim about a measurement someone else took」. It was.

Verified independently by this seat

check result
files changed 6, all under .changeset/
outside .changeset/ 0
any CHANGELOG.md touched 0
frontmatter of all six IDENTICAL before/after, per file
olive-pears-invent.md blob 8c303f895 unchanged — the leave-alone ruling is byte-true
any file outside .changeset/ naming the seven 0 / 7 (firing control: markdown-test-inputs4)
nine required contexts on 369dd3c0f 9 / 9 success, none missing

⇒ ⛔ no test can red on this diff, and the gate list is answered by required-context name.

⭐ The five "has since" claims, each re-derived here from code on main

changeset the new claim this seat's reading
5293 toSortItems now reads order, only order view-config-utils.ts — body is order: (s.order || 'asc'); the remaining direction hits are the docblock explaining the removal
7165 dependentValues={ctx.pendingRow ?? ctx.row} ✅ present verbatim in ObjectGrid.tsx; its docblock says 「objectui#7188 added pendingRow
7655 the floating spread is fenced, three keys dark renderer.floating-spread-fence-7708.test.tsx exists 「the fix, not the tripwire」; the 7655 suite pins 「three undeclared keys are DARK now the spread is fenced」
7727 ambient data no longer bound on record surfaces ExpressionProvider.tsx — 「Why there is no data root either (objectui#8166, ruled 2026-09-10)」
8934 the fallback mounts this renderer with no schema record-chatter.tsx — 「since objectui#8983 that fallback mounts THIS renderer with no schema」

And site 7's new paragraph is corroborated by code objectui#9052 itself landed: packages/types/src/views.ts says in its own words 「the pinned spec is already strict」 and 「the three labelField \|\| titleField dual-reads (plugin-view, plugin-list, app-shell) stay as ⛔ UNDECLARED tolerant fallbacks」. ⇒ the survivor claim is not the PR's invention.

⭐ The finding that matters most, and it inverts the card

The card graded itself the weak class: 「only the citation's implication is stale … That is the clause objectui#9042 ranked least important, and it is the whole of this card.」

Five of the six surrounding claims were flatly false present-tense statements about shipped behaviour — the objectui#9042 class the card said it probably was not. ⇒ ⭐ the card's central instruction (「do that reading first, per changeset」) is vindicated by being obeyed: a sweep would have rewritten six citations and left five false sentences standing.

On the one left alone, and the one deliberately left alone inside an edited file

olive-pears-invent.mdLEAVE ALONE, on two independent measurements (objectui#7170 closed 「option 1, leave it. Already done.」 with no code change, so the sentence is still true; and empty frontmatter ⇒ no CHANGELOG entry ever). ⭐ Reported as a ruling with reasons, which is what the card asked for and ⛔ not an omission.

7655's displayMode tripwire sentence — also left alone, named in 「Deliberately not done」. ⭐ This seat checked it rather than taking it: objectui#7654 has landed (displayMode?: never), and the tripwire has been replaced by one pinning that authoring it is a tsc error. ⚠️ The sentence nevertheless carries its own expiry in its own words (「until that PR flips it」), and the Zod half still passes through .passthrough(). ⇒ the ruling holds, and ⭐ it is stronger than the PR argued.

⛔ One note for the record, ⛔ not a change request

The PR body carries path:line citations. They are pinned to fac5acfa4 and Line Citation Gate is green, so nothing is owed here — ⚠️ but line numbers drift and a reader six weeks out will not have that sha in hand. ⇒ prefer the stable anchor (symbol or job name) as the locator, with the number as decoration.

ACCEPT. Flipping to ready and arming the queue. The Armed note with the probe goes up before the merge.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 11, 2026 10:04
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 11, 2026
@claude

claude Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Armed — SQUASH, merge queue entered. ⭐ The probe is written HERE, ⛔ before the merge, so it cannot be fitted to the result

added_to_merge_queue confirmed on the timeline. Head 369dd3c0f; nine required contexts 9/9 success; Governed Surface Queue Guard success post-flip.

Every expected value below comes from a read this seat took on 369dd3c0f or on origin/main — ⛔ none from the report, ⛔ none from intent.

⚠️ The hazard this probe is shaped around

These are pending changesets, and objectui#5400 (chore: release packages) is open. If a release merges between now and the probe, all six files are consumed — and then a leg asking 「is the false sentence gone?」 reads 0 for the wrong reason. ⇒ ⭐ every leg is floored on the file EXISTING, per file. A floor that fails means「this probe cannot answer」, ⛔ not「green」.

cd "$(git rev-parse --show-toplevel)" && git fetch origin main -q && git checkout -q origin/main

# ── FLOOR, per file — all seven must print PRESENT, or the probe is VOID ──
for f in 5293-view-sort-order-spelling 7165-grid-dependent-values \
         7655-chatbot-registration-authoring-faces 7727-conditional-formatting-record-scope \
         8253-export-tree-view-config 8934-chatter-feed-affordance-only olive-pears-invent; do
  printf '%-50s ' "$f"
  git cat-file -e "origin/main:.changeset/$f.md" 2>/dev/null && echo PRESENT || echo "VOID — consumed by a release"
done

flat(){ git show "origin/main:.changeset/$1" | tr '\n' ' ' | tr -s ' '; }
n(){ flat "$1" | grep -o -F "$2" | wc -l; }

# ── LEG 1 — what must have CHANGED. Each must be 0 ──
echo "-- leg 1 (expect 0) --"
n 8253-export-tree-view-config.md            'is declared, not deleted'
n 5293-view-sort-order-spelling.md           'still accepts `direction`'
n 7165-grid-dependent-values.md              'does not re-scope the child'
n 7655-chatbot-registration-authoring-faces.md 'are live there'
n 7727-conditional-formatting-record-scope.md  'while resolving against the host'
n 8934-chatter-feed-affordance-only.md       'so it is unchanged and now renders'

# ── LEG 2 — what must have SURVIVED. Each must be exactly 1 ──
echo "-- leg 2 (expect 1) --"
n 8253-export-tree-view-config.md  'reddened that pin'
n 8253-export-tree-view-config.md  "the tree's second view-declared rung"
n 8253-export-tree-view-config.md  'declare it if the console writes it, else remove the read'
n 8253-export-tree-view-config.md  'was declared, not deleted'
n olive-pears-invent.md            'tracked as objectui#7170'
n 7727-conditional-formatting-record-scope.md 'tracked as objectui#8166'

# ── LEG 3 — the HASH fence: the leave-alone ruling, byte for byte ──
echo "-- leg 3 (expect the blob verbatim) --"
git rev-parse origin/main:.changeset/olive-pears-invent.md
# expect: 8c303f895384afd40e04d3e8dc762d9e51826c97

# ── LEG 4 — scope. Both must be 0 ──
echo "-- leg 4 (expect 0, 0) --"
git diff --name-only 369dd3c0f2e84e850ee3578129e99ad9ba5be23d origin/main --diff-filter=M -- . ':(exclude,glob).changeset/**' | wc -l
git log --oneline 369dd3c0f2e84e850ee3578129e99ad9ba5be23d..origin/main --name-only -- '*CHANGELOG.md' | grep -c CHANGELOG || true

Expected, and where each number comes from

leg expectation read from
floor × 7 all PRESENT all seven exist on fac5acfa4 and on 369dd3c0f
1 — six false sentences 0 each each is a deletion in the diff, verified per hunk
2 — six survivors 1 each each is present on 369dd3c0f, counted flattened
3 — olive-pears blob 8c303f895384afd40e04d3e8dc762d9e51826c97 identical at fac5acfa4 and 369dd3c0f — ⭐ a hash is the right fence for「nothing moved」
4 — nothing outside .changeset/, no CHANGELOG.md 0, 0 the PR's own diff is 6 files, all under .changeset/

Leg 2 is leg 1's firing control — same files, same instrument, same run. A leg 1 of all zeros with a leg 2 of all zeros is a broken query, ⛔ not a pass. And leg 2 is the one that carries the review's meaning: it asserts that site 7's historical reasoning survived the correction — the ruling, the objectui#6557 pin citation, and the counterfactual clause that measurement showed was TRUE.

⚠️ Leg 3 pairs the hash with the floor above it: the hash catches an in-place edit, the floor catches a deletion. Neither alone is enough.


Generated by Claude Code

Merged via the queue into main with commit 36fc71f Sep 11, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-9065-changeset-forward-reference-audit branch September 11, 2026 10:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants