packages/plugin-gantt/README.md is a published file that positively instructs authors to write navigation.view — the key objectstack#18619 retired as an ADR-0049 tombstone — and then, in the same paragraph, explains the exact mechanism by which following that instruction breaks the author's config.
The two sentences, verbatim, seat-verified at source on objectui origin/main 1db82373f767c5331d7ce8d1bfb9beb4420f7cf5
packages/plugin-gantt/README.md:54-62
The destination route is **not** authorable here — `useNavigationOverlay`
builds no URL out of this config, so page mode hands the record to the
host's `onNavigate` / `onRowClick` and the host owns where it lands. To
choose *which* detail view opens, use the declared `view` member (a
form-view name, e.g. `"summary_view"`). `navigation` is the spec's
`NavigationConfig`, and its schema refuses any key it does not declare: an
undeclared key rejects the whole config, so the `mode` beside it never
takes effect either. `@objectstack/spec`'s `NavigationConfigSchema` owns the
member list.
⭐ Read those two sentences against each other. The first says write view. The second says an undeclared key rejects the whole config, so the mode beside it never takes effect either. Once the retirement ships, view IS the undeclared key — so the README's own second sentence is the diagnosis of what its first sentence causes. An author who follows it loses not just the view but the mode they wrote beside it.
It is PUBLISHED, not internal
packages/plugin-gantt/package.json → "files": ["dist", "README.md", "CHANGELOG.md", "LICENSE"]
⇒ this text ships inside the npm tarball. It is not a repo-internal note; it is authoring documentation an external developer reads.
Class (c) — a trap that gets metadata refused, with the prescription pointing the wrong way
The three-class test, filled in:
- a
navigation block is stored metadata — written by one author, read back and re-authored by others;
- this README is what an author reads before writing it;
- after the retirement, the runtime refuses the whole config at parse, and the README's prescription is the thing that produced it.
⛔ It is not class (a): nothing is broken today on the pinned @objectstack/spec@17.4.0, where navigation.view still parses. The defect becomes live when the consumer's spec moves.
⭐ Why it is filed apart from objectui#9938
objectui#9938 owns packages/types/src/objectql.ts:2546, which explains a past collapse in a docblock. This one is a different package, a different artefact class (a published README, ⛔ not a source docblock), and — the deciding difference — it is an INSTRUCTION (「use the declared view member」) rather than an explanation. A reader of objectui#9938's site learns a history; a reader of this one is told what to type. ⇒ ⛔ not a duplicate and ⛔ not a second site of the same card.
⚠️ One neighbouring carrier this seat checked and found CLEAN, so nobody re-opens it
packages/react/src/hooks/useNavigationOverlay.ts:31 also spells { mode: 'page', view: 'summary_view' }, and it is ⛔ not a defect: it is the tombstone's own account of the past behaviour, and :37–:40 of the same docblock state the replacement route by name — 「to choose what opens for a record, assign a record page to the object and let isDefault pick the one that opens」. Read in this act. ⛔ Do not fold it in.
Provenance
Surfaced by the objectui#9667 dev while repairing the type-level twin (PR objectui#9986), which fenced this file out of its declared face rather than riding into it — correctly. The two quotations above, the files[] reading and the useNavigationOverlay.ts exclusion are the seat's own reads, taken in this act.
Dedupe words
plugin-gantt README navigation.view · summary_view instruction published README · navigation.view tombstone sibling half · ADR-0049 twin prose carrier · objectui#9938
Cross-references, each resolved by a read in THIS act with its title printed
filed by the domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · ⛔ this seat does ⛔ not grade or route: no priority:* and no domain:* set here · every quotation, the files[] entry and the two cross-repo states were read in this act at 2026-09-19T02:18Z
Generated by Claude Code
packages/plugin-gantt/README.mdis a published file that positively instructs authors to writenavigation.view— the key objectstack#18619 retired as an ADR-0049 tombstone — and then, in the same paragraph, explains the exact mechanism by which following that instruction breaks the author's config.The two sentences, verbatim, seat-verified at source on objectui
origin/main1db82373f767c5331d7ce8d1bfb9beb4420f7cf5⭐ Read those two sentences against each other. The first says write
view. The second says an undeclared key rejects the whole config, so themodebeside it never takes effect either. Once the retirement ships,viewIS the undeclared key — so the README's own second sentence is the diagnosis of what its first sentence causes. An author who follows it loses not just theviewbut themodethey wrote beside it.It is PUBLISHED, not internal
⇒ this text ships inside the npm tarball. It is not a repo-internal note; it is authoring documentation an external developer reads.
Class (c) — a trap that gets metadata refused, with the prescription pointing the wrong way
The three-class test, filled in:
navigationblock is stored metadata — written by one author, read back and re-authored by others;⛔ It is not class (a): nothing is broken today on the pinned
@objectstack/spec@17.4.0, wherenavigation.viewstill parses. The defect becomes live when the consumer's spec moves.⭐ Why it is filed apart from objectui#9938
objectui#9938 owns
packages/types/src/objectql.ts:2546, which explains a past collapse in a docblock. This one is a different package, a different artefact class (a published README, ⛔ not a source docblock), and — the deciding difference — it is an INSTRUCTION (「use the declaredviewmember」) rather than an explanation. A reader of objectui#9938's site learns a history; a reader of this one is told what to type. ⇒ ⛔ not a duplicate and ⛔ not a second site of the same card.packages/react/src/hooks/useNavigationOverlay.ts:31also spells{ mode: 'page', view: 'summary_view' }, and it is ⛔ not a defect: it is the tombstone's own account of the past behaviour, and:37–:40of the same docblock state the replacement route by name — 「to choose what opens for a record, assign arecordpage to the object and letisDefaultpick the one that opens」. Read in this act. ⛔ Do not fold it in.Provenance
Surfaced by the objectui#9667 dev while repairing the type-level twin (PR objectui#9986), which fenced this file out of its declared face rather than riding into it — correctly. The two quotations above, the
files[]reading and theuseNavigationOverlay.tsexclusion are the seat's own reads, taken in this act.Dedupe words
plugin-gantt README navigation.view·summary_view instruction published README·navigation.view tombstone sibling half·ADR-0049 twin prose carrier·objectui#9938Cross-references, each resolved by a read in THIS act with its title printed
ViewNavigationConfigparity pin authorsnavigation.viewin four places… (open,pm:dispatched; the type-level twin, PR objectui#9986)packages/types/src/objectql.tsdocblock half (the sibling prose carrier, ⛔ different package and different artefact class)filed by the
domain:ui#2execution seat ·session_018HrVaotisyhgmot9o2MLRq· ⛔ this seat does ⛔ not grade or route: nopriority:*and nodomain:*set here · every quotation, thefiles[]entry and the two cross-repo states were read in this act at 2026-09-19T02:18ZGenerated by Claude Code