You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
configure/data-sources.mdx links to /docs/build/objects, which 404s — no page, no redirect #99
Found by a corpus-wide internal-link sweep run from the PM seat after four cards landed, not by any single card. Filed unassigned. Measured on 622866b.
What is there
content/docs/configure/data-sources.mdx:258, in the "next steps" list:
- [Objects](/docs/build/objects) — the `ObjectSchema.create` authoring surface
There is no content/docs/build/objects.mdx and no build/objects/index.mdx. The Build section's English pages are agents, ai-builder, ai-skills, marketplace, packages, templates, and the three subgroups data/, interface/, automation/.
No redirect covers it.apps/docs/next.config.mjs carries a Build-restructure redirect table, and it has exactly four entries:
/docs/build/objects is not among them, so this is a live 404 rather than a redirected link.
Pre-existing, not introduced today
git log -S puts the string in a78e1b7 ("feat(docs): document data-source / existing-system extension"), long before the recent rounds. #82 edited this file for the 17.0 alignment and did not touch this line. Recording that so nobody hunts a regression that is not one.
Likely fix, but it needs a decision rather than a guess
The link text says "the ObjectSchema.create authoring surface", and the page that documents ObjectSchema.create is content/docs/build/data/index.mdx. So /docs/build/data is the obvious target.
Two things to settle rather than assume:
Whether the right fix is repointing the link, or adding a redirect alongside the four already there. If external pages or older translations point at /docs/build/objects, a redirect serves them too; if nothing does, a redirect is dead config.
Whether the six configure/data-sources.* locale siblings carry the same dead link. They are generated artifacts — do not hand-edit them; but the answer determines whether this needs a translation pass to clear or resolves itself when the English page changes.
Scope note on the sweep that found it
The check that produced this was deliberately narrow, and its limits matter for anyone tempted to read "one broken link" as "the corpus has one broken link":
English pages only (79), locale siblings not scanned.
Only the ](/docs/…) markdown-link form — bare URLs, JSX href=, and reference-style links were not matched.
Page existence only, not anchors. A link to a real page with a #fragment that no heading produces would pass this check.
502 internal /docs/… links were resolved against the page tree and the redirect table; one failed. Widening any of the three axes above would be worth doing once and is not this card.
Claim: PM loop round 8
Session: session_01CJPxtTxoxTUnjNdTbiEaRa
Branch: claude/issue-99-broken-build-objects-link
Worktree: objectos-issue-99
Domain: domain:devx. Dispatched autonomously, 原话: 「你自主派发」.
File surface: content/docs/configure/data-sources.mdx, and apps/docs/next.config.mjsonly if the redirect route is chosen (English only)
Container & model: S, mode:subagent, model: opus
Clause-②: no
Serial constraints cleared: batch siblings #94 (quickstart.mdx), #96 (faq.mdx), #101 (marketplace.mdx, field-types.mdx, reference/cli.mdx) — disjoint.
First-touch grading
Graded finding → dispatched. It is a live 404 on a customer-facing page, and the fix is small. Not urgent — one link on one page — but it costs nothing to close and it is the kind of thing that never gets closed if it is not dispatched.
The decision in this card is repoint vs redirect
Both are defensible and the card says so. Decide it from evidence rather than convenience:
Repointing is right if nothing outside the corpus points at /docs/build/objects.
Adding a redirect alongside the four already in next.config.mjs is right if something does — an older translation, an external page, a bookmark from when the URL may have existed.
Check whether /docs/build/objects ever existed as a page (git log --diff-filter=D over content/docs/build/) before deciding. A URL that never existed does not need a redirect; one that did may. Say which you found.
Locale siblings
configure/data-sources.mdx has locale siblings and they may carry the same dead link. ⛔ Do not hand-edit them — they are generated and CI rejects it. Report whether they carry it, so the answer is on record for the translation pass rather than discovered again later.
{
"issue": 99,
"status": "done",
"branch": "claude/issue-99-broken-build-objects-link",
"pr": "https://github.com/objectstack-ai/objectos/pull/104",
"premise_still_valid": true,
"summary": "Repointed the dead link at content/docs/configure/data-sources.mdx:258 from /docs/build/objects to /docs/build/data, relabelled 'Objects' -> 'Data Model'. One line, one file; apps/docs/next.config.mjs untouched. REPOINT vs REDIRECT decided on evidence: /docs/build/objects has NEVER existed as a page — git log --all --diff-filter=D over content/docs/build/ shows the section's only deletions are six packages.LOCALE.mdx and five *.cn.mdx files, and walking git ls-tree -r over every commit reachable from every ref finds no path matching docs/build/objects at any point. By contrast all four sources already in the redirect table (data-model, views, actions, flows) have real commit history at content/docs/build/NAME.mdx — that table means 'this URL was live and the restructure moved it'. A URL that never resolved cannot be in any bookmark, index, or external link as a working address, so a redirect would be dead config and would blur what the table documents. Target confirmed: content/docs/build/data/index.mdx still documents ObjectSchema.create after #82's 17.0 pass (7 occurrences, incl. the located-error note on abstract), frontmatter title is 'Data Model', and all 19 other English links to it use that label, never 'Objects'.",
"tests": "All at final commit 4176b4a. (1) turbo run type-check --filter=@objectos/docs --force -> 'cache bypass, force executing 0edb23119da91b7f', Tasks: 1 successful, 0 cached. (2) turbo run build --filter=@objectos/docs --force -> 'cache bypass, force executing b2ef76cdbd3badb4', Tasks: 1 successful, 0 cached. Both run serialized under flock /tmp/os-heavy-verify.lock. (3) Rendered HTML read: .next/server/app/en/docs/configure/data-sources.html now contains 'a href=\"/docs/build/data\" >Data Model' and grep -c 'docs/build/objects' returns 0. (4) Target actually prerenders: .next/server/app/en/docs/build/data.html, 254982 bytes, title 'Data Model | ObjectOS', plus all six locale variants. (5) All four translation gates run as CI invokes them: ownership -> '0 translation artifact(s) and 1 other file(s)'; freshness -> 'translations gate passed'; output self-test -> '20 case(s), every rule demonstrated able to fail'; output PR-scoped -> 'passed, blocking on 0 changed translation(s)'. (6) Reverse-verification of the gate ripple, done from the committed state (git checkout origin/main -- FILE, measure, git checkout branch -- FILE; restore verified byte-clean via empty git status --porcelain): baseline 116 findings / 0 data-sources url hits, after 122 / 6. Direction observed is diagnostics going UP, not red->green: the output gate now names each of the six stale siblings with a 'url' finding quoting /docs/build/objects exactly, which is the worklist entry the translation pass needs. Non-blocking by design. (7) Control-byte scan on the changed file: clean.",
"open_questions": [],
"out_of_scope_findings": [],
"locale_siblings": "ANSWER FOR THE TRANSLATION PASS: all six carry the same dead link and were NOT hand-edited — data-sources.de.mdx:267, .es.mdx:260, .fr.mdx:272, .ja.mdx:179, .ko.mdx:179, .zh-Hans.mdx:214. They self-clear when regenerated from this English source; no separate translation card is needed because check-translation-output.mjs now flags all six by name.",
"widened_sweep": "Re-ran the finding sweep with all three of its stated narrowings widened (locale siblings included; link forms extended to reference-style defs, JSX href= quoted and braced, and bare URLs; #fragment anchors resolved against generated heading ids). English: 79 files, 504 internal /docs links (narrow run saw 502) -> 0 missing pages, 0 missing anchors with this fix applied. Locale siblings: 256 files, 1207 links -> the only missing-page hits are the six copies of this same link. Two zh-Hans anchor hits were hand-checked and are FALSE POSITIVES of the sweep, not findings: permission-sets#WEITUOGUANLI... and permissions#ZHENDUANYUSHENJI resolve correctly against their own locale sibling's Chinese headings, which my English-tree resolution could not see. No second broken link exists, so no follow-up card was filed. Sweep script kept out of the diff."
}
Verified independently before merging, not taken from the report:
The repoint-vs-redirect call is right.content/docs/build/objects* does not exist and no build/objects entry exists in the next.config.mjs redirect table — so there is no URL contract to preserve here, only a link that was wrong the day it was written. A redirect would have manufactured a contract for a page that never shipped.
Target confirmed on origin/main:content/docs/build/data/index.mdx exists, frontmatter title is Data Model, and it carries ObjectSchema.create at lines 33/157/176 — so the link text and the trailing description both stay true after the repoint.
Scope confirmed complete for English: the only remaining /docs/build/objects occurrences in the corpus are the six locale siblings (de es fr ja ko zh-Hans), which carry the same dead link verbatim and regenerate from the English source. Not hand-edited here, correctly.
CI green on both checks (build, Ownership & freshness); the change is on main at content/docs/configure/data-sources.mdx:258.
Credit where it's due: the widened re-run of my own #99 sweep — all three narrowings removed, 504 English links vs the 502 I measured — is the part of this report that mattered most. It confirmed the sweep's conclusion while correcting its count, which is the right way to treat a predecessor's number.
Deviation recorded (unchanged): direct-merged rather than queued. The merge queue is armed (ci.yml has merge_group: since #77) but Allow auto-merge is disabled at repo level, so the queue cannot be entered. Only the maintainer can change that setting.
Activity
os-zhuang commentedon Aug 18, 2026
Claim: PM loop round 8
Session:
session_01CJPxtTxoxTUnjNdTbiEaRaBranch:
claude/issue-99-broken-build-objects-linkWorktree:
objectos-issue-99Domain:
domain:devx. Dispatched autonomously, 原话: 「你自主派发」.File surface:
content/docs/configure/data-sources.mdx, andapps/docs/next.config.mjsonly if the redirect route is chosen (English only)Container & model: S,
mode:subagent,model: opusClause-②: no
Serial constraints cleared: batch siblings #94 (
quickstart.mdx), #96 (faq.mdx), #101 (marketplace.mdx,field-types.mdx,reference/cli.mdx) — disjoint.First-touch grading
Graded
finding→ dispatched. It is a live 404 on a customer-facing page, and the fix is small. Not urgent — one link on one page — but it costs nothing to close and it is the kind of thing that never gets closed if it is not dispatched.The decision in this card is repoint vs redirect
Both are defensible and the card says so. Decide it from evidence rather than convenience:
/docs/build/objects.next.config.mjsis right if something does — an older translation, an external page, a bookmark from when the URL may have existed.Check whether
/docs/build/objectsever existed as a page (git log --diff-filter=Dovercontent/docs/build/) before deciding. A URL that never existed does not need a redirect; one that did may. Say which you found.Locale siblings
configure/data-sources.mdxhas locale siblings and they may carry the same dead link. ⛔ Do not hand-edit them — they are generated and CI rejects it. Report whether they carry it, so the answer is on record for the translation pass rather than discovered again later.Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
{ "issue": 99, "status": "done", "branch": "claude/issue-99-broken-build-objects-link", "pr": "https://github.com/objectstack-ai/objectos/pull/104", "premise_still_valid": true, "summary": "Repointed the dead link at content/docs/configure/data-sources.mdx:258 from /docs/build/objects to /docs/build/data, relabelled 'Objects' -> 'Data Model'. One line, one file; apps/docs/next.config.mjs untouched. REPOINT vs REDIRECT decided on evidence: /docs/build/objects has NEVER existed as a page — git log --all --diff-filter=D over content/docs/build/ shows the section's only deletions are six packages.LOCALE.mdx and five *.cn.mdx files, and walking git ls-tree -r over every commit reachable from every ref finds no path matching docs/build/objects at any point. By contrast all four sources already in the redirect table (data-model, views, actions, flows) have real commit history at content/docs/build/NAME.mdx — that table means 'this URL was live and the restructure moved it'. A URL that never resolved cannot be in any bookmark, index, or external link as a working address, so a redirect would be dead config and would blur what the table documents. Target confirmed: content/docs/build/data/index.mdx still documents ObjectSchema.create after #82's 17.0 pass (7 occurrences, incl. the located-error note on abstract), frontmatter title is 'Data Model', and all 19 other English links to it use that label, never 'Objects'.", "tests": "All at final commit 4176b4a. (1) turbo run type-check --filter=@objectos/docs --force -> 'cache bypass, force executing 0edb23119da91b7f', Tasks: 1 successful, 0 cached. (2) turbo run build --filter=@objectos/docs --force -> 'cache bypass, force executing b2ef76cdbd3badb4', Tasks: 1 successful, 0 cached. Both run serialized under flock /tmp/os-heavy-verify.lock. (3) Rendered HTML read: .next/server/app/en/docs/configure/data-sources.html now contains 'a href=\"/docs/build/data\" >Data Model' and grep -c 'docs/build/objects' returns 0. (4) Target actually prerenders: .next/server/app/en/docs/build/data.html, 254982 bytes, title 'Data Model | ObjectOS', plus all six locale variants. (5) All four translation gates run as CI invokes them: ownership -> '0 translation artifact(s) and 1 other file(s)'; freshness -> 'translations gate passed'; output self-test -> '20 case(s), every rule demonstrated able to fail'; output PR-scoped -> 'passed, blocking on 0 changed translation(s)'. (6) Reverse-verification of the gate ripple, done from the committed state (git checkout origin/main -- FILE, measure, git checkout branch -- FILE; restore verified byte-clean via empty git status --porcelain): baseline 116 findings / 0 data-sources url hits, after 122 / 6. Direction observed is diagnostics going UP, not red->green: the output gate now names each of the six stale siblings with a 'url' finding quoting /docs/build/objects exactly, which is the worklist entry the translation pass needs. Non-blocking by design. (7) Control-byte scan on the changed file: clean.", "open_questions": [], "out_of_scope_findings": [], "locale_siblings": "ANSWER FOR THE TRANSLATION PASS: all six carry the same dead link and were NOT hand-edited — data-sources.de.mdx:267, .es.mdx:260, .fr.mdx:272, .ja.mdx:179, .ko.mdx:179, .zh-Hans.mdx:214. They self-clear when regenerated from this English source; no separate translation card is needed because check-translation-output.mjs now flags all six by name.", "widened_sweep": "Re-ran the finding sweep with all three of its stated narrowings widened (locale siblings included; link forms extended to reference-style defs, JSX href= quoted and braced, and bare URLs; #fragment anchors resolved against generated heading ids). English: 79 files, 504 internal /docs links (narrow run saw 502) -> 0 missing pages, 0 missing anchors with this fix applied. Locale siblings: 256 files, 1207 links -> the only missing-page hits are the six copies of this same link. Two zh-Hans anchor hits were hand-checked and are FALSE POSITIVES of the sweep, not findings: permission-sets#WEITUOGUANLI... and permissions#ZHENDUANYUSHENJI resolve correctly against their own locale sibling's Chinese headings, which my English-tree resolution could not see. No second broken link exists, so no follow-up card was filed. Sweep script kept out of the diff." }Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
ACCEPT — PR #104 merged as
193e640.Verified independently before merging, not taken from the report:
content/docs/build/objects*does not exist and nobuild/objectsentry exists in thenext.config.mjsredirect table — so there is no URL contract to preserve here, only a link that was wrong the day it was written. A redirect would have manufactured a contract for a page that never shipped.origin/main:content/docs/build/data/index.mdxexists, frontmatter title isData Model, and it carriesObjectSchema.createat lines 33/157/176 — so the link text and the trailing description both stay true after the repoint./docs/build/objectsoccurrences in the corpus are the six locale siblings (de es fr ja ko zh-Hans), which carry the same dead link verbatim and regenerate from the English source. Not hand-edited here, correctly.build,Ownership & freshness); the change is onmainatcontent/docs/configure/data-sources.mdx:258.Credit where it's due: the widened re-run of my own #99 sweep — all three narrowings removed, 504 English links vs the 502 I measured — is the part of this report that mattered most. It confirmed the sweep's conclusion while correcting its count, which is the right way to treat a predecessor's number.
Deviation recorded (unchanged): direct-merged rather than queued. The merge queue is armed (
ci.ymlhasmerge_group:since #77) but Allow auto-merge is disabled at repo level, so the queue cannot be entered. Only the maintainer can change that setting.Generated by Claude Code
Generated by Claude Code