Skip to content

docs: correct the paths-ignore claim in three agent-facing texts, and the metadataTypeRegistry verdict (#3857, #3859) - #4371

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-3857-3859-docs-truth
Aug 11, 2026
Merged

docs: correct the paths-ignore claim in three agent-facing texts, and the metadataTypeRegistry verdict (#3857, #3859)#4371
yinlianghui merged 1 commit into
mainfrom
claude/issue-3857-3859-docs-truth

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#3857
Fixes#3859

Two docs-truth corrections in one PR, per triage's own batching note on #3857 — "same class as #3859 (agent-facing prose stating something git/CI disproves) — sweep-batchable into one docs-truth PR, one claim, N Fixes". Prose and comments only: zero workflow behaviour change, zero code change. Verified mechanically, not by eye:

$ git diff origin/main -- .github/workflows/changeset-guard.yml \
| grep -E '^[+-]' | grep -vE '^(\+\+\+|---)' | grep -vE '^[+-]\s*#' | grep -vE '^[+-]\s*$'
(no output)
$ git diff origin/main -- scripts/check-changeset-presence.mjs \
| grep -E '^[+-]' | grep -vE '^(\+\+\+|---)' | grep -vE '^[+-]\s*\*'
(no output)

Every changed line in the workflow is a # comment; every changed line in the script is inside its docblock. The workflow's parsed triggers are byte-identical (pull_request and push, both paths: ['.changeset/**']), re-parsed after the edit.


#3857 — three texts still described a paths-ignore that #3523 removed

Each asserted that ci.yml and lint.yml list '**/*.md' and .changeset/** under paths-ignore on pull_request, so a changeset-only or md-only PR "starts no workflow at all". objectui#3523 step 2 deleted that filter from both workflows' pull_request trigger; it survives only on push (ci.yml:6, lint.yml:32), and each file already says so in its own header (ci.yml:12, lint.yml:37) — the repository was contradicting itself.

Live counter-proof, re-measured at this branch point

PRChangeChecks started
#3856one .md file (+33/-7)16 — the sample the finding was written from
#4339one line added to AGENTS.md, merged 17:40Z today17

#4339 was read from the API rather than taken from the card: 17 check runs on its head commit, including Lint, Type Check, Test (shard 1..4/4), Internal Docs Link Check, Skill Guide Path Check, Control Byte Scan and Changeset Declaration. (An 18th, Close issues referenced in other repositories, is the post-merge run twelve minutes later, so the honest figure for the PR event is 17.)

The three sites

SiteBefore (gist)After (gist)
AGENTS.md:206ci.yml/lint.yml 都把 **/*.md.changeset/** 列进 paths-ignore,只加 changeset 的 PR 不会启动任何 workflow」quotes the old sentence, marks it 已不成立 and tells the reader not to decide by it; states that paths-ignore is now only on push, that the PR path decision is the in-job Decide whether this change needs a full run step, gives the 16/17-check measurements, and restates why changeset-guard.yml is still independent and reverse-triggered
scripts/check-changeset-presence.mjs:33-40"ci.yml and lint.yml both list .changeset/** under paths-ignore, so a PR that adds ONLY a changeset starts no other workflow at all" — the premise of its "why this is a second workflow" argumentnames the retired premise, cites #3523 step 2 and the measurements, then gives today's reason; the forward-triggered half of the argument is unchanged because it never depended on the premise
.github/workflows/changeset-guard.yml:3-8same claim, as the header's "why this is its own workflow instead of a job in ci.yml"leads with the reason that holds today, then records the retired one so the next reader does not re-excavate #3523

The rationale each gate now gives, and why the gates themselves are untouched

The card is explicit that the reverse-trigger gate is not broken, only its justification — so the replacement rationale was read out of the workflows rather than guessed:

What #3523 moved rather than deleted is the path decision. It is now the Decide whether this change needs a full run step in ci.yml, with a twin in lint.yml, and its exclusion list is that push filter unchanged — markdown and .changeset/** included. That identity is not a claim, it is pinned: scripts/__tests__/merge-queue-reporting.test.ts fails if the in-job list drifts from the trigger's. So on a changeset-only PR both workflows start, report, and skip every expensive step: no gate inside either of them ever reads the changeset.

The conclusion therefore outlives its premise by a different route. changeset-guard.yml runs outside that in-job switch, install-free and build-free, which is why it is still its own workflow with the inverse trigger — it is the only thing that judges a changeset-only PR at all. changeset-presence.yml faces the other way for the reason it already gave correctly, and is not touched here.


#3859 — the "Retired names" row said "Never existed"

Both SHAs verified at this branch point rather than copied from the card:

$ git log --oneline --all --diff-filter=AD -- '*metadataTypeRegistry*'
ff9a0d9e9 chore: remove studio app and migrate to metadata-admin engine
9bf2fa44e test: prune redundant tests, keep core protocol/engine coverage
d601ef693 feat: unified metadata management with registry, generic manager page, and dynamic routing
$ git show --stat d601ef693 | grep metadataTypeRegistry
apps/console/src/config/metadataTypeRegistry.ts | 195 +++++++++++++++
$ git show --stat ff9a0d9e9 | grep metadataTypeRegistry
apps/console/src/config/metadataTypeRegistry.ts | 317 ------
$ git show ff9a0d9e9^:apps/console/src/config/metadataTypeRegistry.ts | wc -l
317
$ git log --follow --oneline -- apps/console/src/config/metadataTypeRegistry.ts | tail -1
d601ef693 feat: unified metadata management with registry, generic manager page, and dynamic routing

So the file landed at exactly that path on 2026-04-07 at 195 lines, grew to 317, and went with the studio app on 2026-05-27. The row now reads Deleted, following the same convention as the five rows around it, and points at the git show that still retrieves the content — which is the difference the card is about: "deleted" sends a reader to git, "never existed" tells them a ROADMAP.md line naming it was fiction when it was merely stale.

One gate detail worth recording

scripts/check-skills-paths.mjs (objectui#3735, landed since the card was written) requires every backtick-wrapped in-repo path in a guide to exist on disk, and apps/console/src/config/ does not exist any more. The row therefore never spells the dead path as a bare token: the surviving directory apps/console/src/ is stated on its own, and the full path appears only inside the git show ... span, which the script excludes by rule ("a span containing a space is prose, or a command line — not a path"). The correction thus lands with no scripts/skills-path-baseline.json entry needed, and the gate's reading is unchanged at 84/85 resolved plus 1 baselined. That is a concrete answer to the input #3859 offered #3735 — a Retired-names table does not automatically need an exemption if it names the surviving parent directory instead of the dead leaf.


Adjacency with PR #4365 (#3731 / #3736)

Briefed as a risk, and it became real mid-run: #4365 merged at 22:19Z from the same base commit this branch started at (ca269fecd), and it rewrote the same guide — retargeting the "Extending object management" chapter at PermissionMatrixEditPage and adding two rows to the same "Retired names" table.

Resolved by rebasing onto the post-#4365main (now 2fea4d2fa, which also includes #4367). The two edits are disjoint rows of one table, exactly as the dispatch predicted: #4365 appends the factory and widget rows at the bottom and rewrites the paragraph above the table, this PR rewrites the Verdict cell of the config/metadataTypeRegistry.ts row in the middle. Git merged them without a conflict, and the union was verified by reading the resulting table — all nine rows present, both sets intact. Every gate below was then re-run against the rebased tree, not the original one. Nothing here touches skills/objectui/evals/console-development.json.

Worth noting for the record: #4365's own body cites #3859's lesson as its reason for citing issue numbers rather than unknowable squash hashes in its new rows. The two PRs agree on the standard.

Verification

Local scope is the gates that touch this surface, not a whole-repo sweep — all re-run after the rebase.

StepResult
node scripts/check-control-bytes.mjsOK (scanned 4084 tracked text files; skipped 85 binary)
node scripts/check-skills-paths.mjsOK (84/85 stated paths resolve across 18 guide files; 1 baselined)
node scripts/check-doc-links.mjsLinks are valid across 13 scan roots
node scripts/check-changeset-presence.mjs --base origin/main --head HEAD"4 file(s) changed, 0 of them under the src/ of a package the release covers … No source of a released package changed in this range, so no changeset is owed."
node scripts/check-changeset-no-major.mjsNo changeset declares a major bump
npx vitest run --project unit --maxWorkers=2 over the 10 suites that assert on these filesTest Files 10 passed (10), Tests 269 passed (269)
node --check scripts/check-changeset-presence.mjsOK
npx eslint scripts/check-changeset-presence.mjsexit 0
YAML re-parse of changeset-guard.ymltriggers unchanged: pull_request and push, both paths: ['.changeset/**']

The ten suites: check-changeset-presence, check-changeset-no-major, merge-queue-reporting, ci-cd-pipeline-doc, check-skills-paths, check-doc-links, doc-version-claims, docs-links-workflow, check-control-bytes, lint-workflow. No suite pinned any of the old false sentences, so no pin updates were needed — that absence was measured rather than assumed. The three that scan these workflows all strip whole-line comments first (withoutComments()), deliberately, because these headers discuss paths and paths-ignore in prose and a scan counting the prose would report filters the files do not have; the one that reads changeset-guard.yml raw only matches its paths: block, which is untouched.

Beyond the gate, a self-scan for control bytes over the four edited files (grep -naP across the C0 range plus 0x7f) — no match. The .mjs edit deliberately avoids writing the markdown glob literally inside the block comment, since a star followed by a slash closes it early — the trap that file's own header records.

No changeset, on the gate's own verdict quoted above, matching #4339's precedent for a docs-and-comments PR: nothing under the src/ of a package the release covers changed, so nothing is released and there is nothing to declare.

Reverse verification

Not applicable in its usual red-first form, and saying so plainly rather than manufacturing a number: nothing here changes behaviour, so there is no pin that could go red on reverting it. The acceptance evidence is the before/after quotation per site above, plus the live counter-proof measured today (#4339, 17 checks) and the structural proof that the workflow's parsed triggers are unchanged.

Out of scope, filed not fixed

#4369 — four more copies of the same falsified premise, in files #3857 does not name: .github/workflows/changeset-presence.yml:11-15, scripts/check-changeset-no-major.mjs:22, and two comment blocks in scripts/__tests__/check-changeset-no-major.test.ts (:19-22, :120-123). Their assertions are sound and stay green; only the explanations are stale. Left untouched here because #3857 enumerates exactly three sites and this PR's scope is those three — but flagged prominently, because once this lands the repository states both shapes, and the stale copy is the one physically closest to the gate it explains. Filed unassigned with finding, no pm:queue, for the triage round to grade.


Generated by Claude Code

… the metadataTypeRegistry verdict (#3857, #3859)
Prose and comments only; no workflow behaviour changes.
#3857 — AGENTS.md, scripts/check-changeset-presence.mjs and
.github/workflows/changeset-guard.yml each asserted that ci.yml and lint.yml
list '**/*.md' and .changeset/** under paths-ignore, so a changeset-only or
md-only PR starts no workflow at all. objectui#3523 step 2 removed
paths-ignore from their pull_request trigger; it survives only on push. Each
site now states that, points at the in-job `Decide whether this change needs a
full run` step where the path decision actually lives, and restates the two
changeset gates' rationale as the reason that holds today: the in-job exclusion
list still covers markdown and .changeset/**, so those workflows start, report
and skip every expensive step on exactly the PR these gates exist to judge.
#3859 — the "Retired names" table called config/metadataTypeRegistry.ts
"Never existed under apps/console/src/". Git shows it added at d601ef6 (195
lines) and deleted at ff9a0d9 (317 lines) at exactly that path. Reworded to
the table's own Deleted convention.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 11, 2026 10:30pm

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation configuration ci/cd labels Aug 11, 2026
@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

ACCEPT — PM 复核 (session session_017Qqyix2QcnpUC9XeYVDzx3), closes out #3857 + #3859.

Flipping ready + arming auto-merge.


Generated by Claude Code

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