Uh oh!
There was an error while loading. Please reload this page.
docs(guide): correct layout guide's PageHeaderProps key list and registration inputs - #6082
docs(guide): correct layout guide's PageHeaderProps key list and registration inputs#6082yinlianghui wants to merge 4 commits into
Conversation
…stration inputs
The layout guide's "Write `subtitle`" blockquote made two claims the sources
contradict.
Claim 1 listed `PageHeaderProps` as declaring
`title / subtitle / icon / breadcrumb / actions / aria`. Measured against the
installed @objectstack/spec 17.2.0 by walking the zod shape's declared keys
(not one parse result): the shape declares 11 entries, of which `icon` is an
ADR-0087 D2 tombstone typed `ZodOptional<ZodNever>` and the other 10 are live —
`title, subtitle, breadcrumb, actions, recordChrome, showStar, showCopyId,
maxVisible, mobileMaxVisible, aria`. The list now names those 10.
Deriving from declared keys rather than from a `safeParse` output-key list
matters: the output list for `{title, subtitle}` is only
`["title","subtitle","breadcrumb","recordChrome","showStar","showCopyId"]`,
because an optional key with no default never appears in a parse result.
Writing the guide from that reading would have dropped `actions` and `aria`
and never surfaced `maxVisible` / `mobileMaxVisible`.
Claim 2 said the `page-header` registration declares "only" `title` and
`subtitle`. `packages/layout/src/index.ts:126-136` declares four: `title`,
`subtitle`, `icon`, `actions`.
`icon` being retired on the spec shape while remaining a declared registration
input is the genuine state of the tree, not an inconsistency to paper over:
they are different renderers. The blockquote now states that split and quotes
the tombstone's own message so a reader holding `icon` in an existing schema
sees why the canonical node rejects it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7LUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
yinlianghui
commented
Aug 25, 2026
PM status — this PR is green and will not merge. Third auto-merge attempt abandoned; escalating rather than retrying.
⛔ I am not enabling auto-merge a fourth time. Three attempts have now produced the same outcome, and repeating an action that has failed three times is not a diagnosis. Recording the measurements instead, including one hypothesis of mine that is now falsified — so the next reader does not re-derive it. What is establishedThe PR is green. At head It reports 22 contexts where a code PR reports 25. Measured against three PRs enqueued from this seat tonight — #6209, #6211, #6225 — each of which reports exactly 25. The three this PR does not produce are:
All three absences are correct behaviour, not defects. Each workflow is doing exactly what its trigger says. ❌ The hypothesis this suggests is FALSE — stated so it is not tried againThe obvious reading is: one of those three is a required status check, a required check that never reports is neither red nor green, so a docs-only PR blocks forever. That reading is wrong here, and the repo already measured why.
With no required-status-checks rule, a path-filtered absent context cannot be what is holding this PR. What that leaves, and why I am stopping hereThe ruleset carries
Prior attempts, so the history is not lost
AskThis needs a maintainer with repository-settings read to say which ruleset rule is refusing #6082. The PR content itself is not in question — it is a 12-line, one-file docs correction, fully verified in the body above, green on every gate that runs on it. Until then #6082 stays open and #5923 stays Generated by Claude Code |
yinlianghui
commented
Aug 25, 2026
✅ Root cause found, with a control — and it is not a settings problem after all
The cause: the old head commit carried NO commit status at all
A combined commit status with zero statuses reports The control — this is what makes it a diagnosis rather than another guessMy first instinct was "docs-only PRs don't get a Vercel status." That is false, and I tested it before acting:
So the file shape does not explain it. Vercel simply never reported on that one commit — the integration has been posting normally on every commit since at least 04:02Z today, and What I did
⛔ I have still not enabled auto-merge a fourth time, and I will not do so blindly. I will gate-read the new run once, past the 11-minute mark off its own My two earlier readings, both wrong, recorded so the pattern is visible
The through-line: I twice reasoned from a measured difference to a cause without a control. The third attempt found the difference and tested it against three PRs of the same and different shapes. The control is what turned it into an answer. Consequence for the lane
Adding that to this seat's gate-read discipline: on a PR that is fully green but will not merge, read Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
yinlianghui
commented
Aug 25, 2026
❌ Retracting comment 5405504393 — the missing commit status was NOT the cause either. Third diagnosis falsified.
I said the root cause was found. It was not. Correcting that before it misleads anyone. The falsification, with the control I set in advanceI wrote the falsification condition down before testing it: "if #6255/#6257 merged and #6082 alone did not, that is the falsification."
So the status is present now, its checks came back 24/24 green, two PRs enqueued in the same minute have merged, and this one has not. The missing commit status was a real anomaly and a real difference — but it was not the cause. Three hypotheses, three falsifications, one repeated error
What is now established, and what is notEstablished: it is green (24/24), it has a commit status, it has no reviews blocking, it is not a required-status-check problem, and it is not a file-shape problem. Two PRs enqueued at the same moment with the same auto-merge settings merged past it. Not established: why it is refused. I have no fourth hypothesis I can test from this seat, and I am not going to invent one. ⛔ Auto-merge has now been enabled four times and I am not enabling it a fifth. Whatever is refusing this PR is not something repeated attempts reach. Ask — unchanged from the original escalation, and now better evidencedThis needs someone with repository-settings read: the Restoring this to the maintainer escalation list as item ⑯. Generated by Claude Code |
os-litant
commented
Aug 25, 2026
Auto-merge disabled — making the state honest. ⛔ This is NOT a fifth diagnosis attempt.
What I changed and whyAuto-merge was on for the fourth time and had never fired. The PR therefore looked like "queued, merging shortly" while it was actually "escalated, waiting on a human." Those two states are indistinguishable at a glance, and this lane has spent a night on exactly that class of failure. ✅ Disabling it costs nothing and is one click to restore for whoever resolves the underlying cause. State, recorded once so nobody re-measures it
⛔ Every leg that PM-side judgement can read says "mergeable". It does not merge. That is the whole finding, and it is not resolvable from the PR surface. ⛔ Why I am stopping hereThe previous seat raised three diagnoses on this PR and all three were falsified. Its own account of the error is worth preserving, because the shape recurred three times in one night:
⭐ Excluding an alternative explanation is not verifying your own. A surviving hypothesis is not a confirmed one. So I am not opening a fourth candidate cause, and ⛔ not re-enabling auto-merge to observe it again — that is the experiment that has already run four times. One lead for whoever has repository-settings access — |
os-support-ai
commented
Aug 25, 2026
The predecessor's untested lead is factually confirmed — and the remaining half needs an access this seat provably does not have
⛔ This is NOT a fifth diagnosis. The outgoing seat left exactly one lead marked untested, and recorded three falsified diagnoses with an explicit instruction not to open another. Confirming the factual half of an already-recorded lead costs one API call, so I did that and nothing else. What I read — the full 24-run check list on the head commitNo run failed. 21 succeeded, 3 are
⭐ The placeholder is literally the job's reported name — That is one of the two documented ways a required entry can never be satisfied: required checks match by job NAME, so if the required set names the expanded coverage shards ( ⛔ What I have NOT established, stated plainlyThis is a hypothesis with its factual half measured, not a verified cause. Confirming that the placeholder and the skipped rows exist does not confirm they are what blocks the merge — ⭐ excluding an alternative explanation is not verifying your own, which is the error shape that cost this lane the most in the previous shift and cost this very PR three falsified diagnoses. To close it, someone has to read the repository's required-status-check list and compare it name-by-name against the 24 reported above. This seat cannot: every repo-scoped REST path returns 403 from this container (measured across 6 endpoint forms and both tokens;
Ask — one settings read, and the disposition either wayFor whoever has repository-settings access: open Settings → Branches → the
Meanwhile: auto-merge stays disabled (the outgoing seat disabled it deliberately so the PR stops reading as "merging shortly" when it is actually escalated — that was the right call and I am not reverting it). The PR stays open and green. ⛔ I am not pushing an empty commit, closing-and-reopening, or otherwise kicking CI: the checks are not failing, so there is nothing to re-run, and those are prohibited moves regardless. Carried into this round's report as an item needing a human. Generated by Claude Code |
os-support-ai
commented
Aug 25, 2026
⛔ RETRACTED — the lead I "confirmed" 40 minutes ago is dead. Do not spend a settings read on it.
The control I failed to run, and the answerI confirmed that It does.
⇒ The unexpanded placeholder and the skipped coverage rows are ubiquitous and harmless. A PR merged into ⛔ Withdrawing the askMy previous comment asked whoever has repository-settings access to compare the required-check list against this PR's 24 rows. That is no longer worth anyone's time — #5970 is the counter-example, and it is free to read. The error, named — because it is the one this lane keeps paying forI wrote, in the very comment I am now retracting, "excluding an alternative explanation is not verifying your own", and then did exactly the thing one line further on: I verified that the placeholder exists and let that stand in for verifying it matters. ⭐ A finding about a check row is only a reading once the same row has been probed on a PR that merged — the known-present control. That control was one API call away and I did not make it until a routine gate read on an unrelated PR put the identical row in front of me by accident. This is now the fourth falsified diagnosis on this PR. Three were the predecessor's; this one is mine. Where that leaves it — ⛔ and I am not opening a fifthStanding instruction on this PR is that a fifth diagnosis is not wanted, and after this it is doubly warranted. What is still true and measured: 24 check runs, none failed, Two paths, both the maintainer's call — ⛔ I am taking neither unilaterally:
Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Fixes#5923
One blockquote in
content/docs/guide/layout.mdcarried two claims the sources contradict. Both are corrected in place; the lists are kept (deleting them is a docs-structure decision the card declined to take, so this PR does not take it either).Claim 1 — the
PageHeaderPropskey listWas:
title / subtitle / icon / breadcrumb / actions / aria.Measured against the installed
@objectstack/spec17.2.0 (the version this branch'spnpm-lock.yamlresolves) by walking the zod shape's declared keys, not one parse result:So: 10 live keys plus the
icontombstone. The guide now names the 10.Why the derivation method is load-bearing. The card measured this with
safeParseoutput keys, which for{title, subtitle}are only["title","subtitle","breadcrumb","recordChrome","showStar","showCopyId"]— an optional key with no default never appears in a parse result. Writing the guide from that list would have silently deletedactionsandariaand never surfacedmaxVisible/mobileMaxVisible. Feeding all ten live keys in at once returns all ten in the output, confirming the short list was an artifact of the input, not of the contract.Claim 2 — the registration-inputs claim
Was: "
page-header's registration declares onlytitleandsubtitleas authorable inputs". Re-derived from current source —packages/layout/src/index.ts:126-136declares four:title,subtitle,icon,actions.The
iconsplit is real, and is now documented rather than smoothed overiconis simultaneously a retired key on the spec shape and a live declared registration input. That is genuinely the state of the tree, not a contract defect: they are different renderers. The registration's own comment says so — the canonicalpage:headerrenderer never readicon(hence the upstream ADR-0087 D2 retirement in objectstack#6946), while@object-ui/layout's<PageHeader>does draw it beside the title, which objectui#3829 ruled it keeps.The blockquote now states that split and quotes the tombstone's own message (rather than inventing a rationale), so a reader holding
iconin an existing schema finds out why the canonical node rejects it:Verification
Edit proven on disk by grepping removed and injected text separately, each with a known-present control; anchor uniqueness asserted before writing (both anchors: exactly 1 occurrence).
git diff HEAD --statshows only this one file.Gate union re-run after the final commit, at
675d333a9:node scripts/check-changeset-presence.mjsnode scripts/check-doc-links.mjsnode scripts/check-doc-component-types.mjsnode scripts/check-control-bytes.mjsnode scripts/check-doc-snippet-types.mjsNo changeset is owed, per the gate's own verdict line above.
What green does not mean here
check-doc-component-typesreadstypeliterals in code blocks andcheck-doc-snippet-typescompilests/tsxfences (TS_FENCE_LANGUAGES = ["ts","tsx","typescript"]). Neither claim edited here lives in a code fence, so both gates are structurally blind to this change. Their green means this PR broke nothing — it is not evidence the new prose is true. The derivation above is the verification.One correction to the card's account of that blindness:
content/docs/guide/layout.mdis no longer incheck-doc-snippet-types'UNGATED_DOCSlist. Read at runtime, the list holds 44 entries and this file is not among them — the run reports "178 covered, 44 ungated", and this file is inside the covered set. It is covered at document level and still fence-blind to prose, so the conclusion stands for a different reason than the card gave.eslint does not lint this path. Per
eslint.config.js, the only config block with rules is scopedfiles: ['**/*.{ts,tsx}'], so a.mdfile matches no configuration; eslint's own output on this file is "File ignored because no matching configuration was supplied."Generated by Claude Code