Skip to content

docs(audits): recheck the §3 naming-drift list; fix the os doctor lookupFilters hint (#1878) - #3677

Merged
os-zhuang merged 2 commits into
mainfrom
docs/naming-drift-recheck
Jul 27, 2026
Merged

docs(audits): recheck the §3 naming-drift list; fix the os doctor lookupFilters hint (#1878)#3677
os-zhuang merged 2 commits into
mainfrom
docs/naming-drift-recheck

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Third and last recheck of the 2026-06 liveness audit's problem clusters (after §1 security-props #3503 and the §2 report slice #3496). Companion objectui fix: objectstack-ai/objectui#2867.

Finding: six of nine were already resolved — the list was stale, not the code

Re-verified every §3 item against current code in both repos, including the <!-- os:check --> TypeScript blocks inside skills/*/SKILL.md (they compile against the spec and are real consumers — the gap that bit #3605).

Resolved (list stale) Evidence
referenceFilters removed #2377/ADR-0049; successor lookupFilters is read + scopes the picker
maxRating pruned; builder emits max, RatingField reads max
page visibility spec folds → visibleWhen; SchemaRenderer consumes it
dashboard title/label renderer dual-reads; widget keys additionally hard-fail via .strict() + naming error map (#1894)
flow http spec enum canonical; runtime registers HTTP_TYPE='http'
agent knowledge.topics #1891 folds the alias into sources; test asserts 'topics' in parsed === false
webhook object/isActive #3489 materializes with an explicit mapping
action disabled fixed across all six surfaces this month (objectui#2863 + #3643)
skill requiredPermissions never a drift — the key never existed on SkillSchema; the original audit described prose/label drift in the docs

Still real (fixed in the companion objectui PR): the coupled page pair typepageType + labeltitle, which mis-renders every non-record page today (showcase capability_map, active_projects, command_center_jsx), plus two snake-only max_length readers.

The systemic finding

For every item, authoring the wrong key is silently strippedFieldSchema and PageSchema are bare z.object (verified empirically: parsing a page with pageType + title returns neither, no error). The dashboard-widget .strict() + fixable naming error map (#1894) is the only mechanism in the codebase that turns a silent no-op into a teaching error. Extending it to PageSchema/FieldSchema is the structural fix for this whole class; per-item wiring is the tactical one.

Changes

  • Add docs/audits/2026-07-naming-drift-recheck.md — per-item verdicts with file:line evidence, the gate-coverage analysis, and three items left as owner decisions.
  • Annotate README §3 with the recheck summary.
  • Fix os doctor — its snake→camel table advised "Use referenceFilters", a key removed in [11.0][A2] Remove dead author-facing metadata properties (ADR-0049 enforce-or-remove) #2377 that the schema silently strips. Now matches both spellings and names the live lookupFilters.

Left as decisions (recorded, not fixed)

  1. app badge/badgeVariant + nav separator — surface-conditional, port rather than prune. The capability is fully implemented in layout/src/NavigationRenderer.tsx (:906 separator, :983-985 badge), a publicly exported + SDUI-registered (navigation-renderer) component. It is missing from UnifiedSidebar, which is what actually renders app.navigation in the console. So the same authored key works on one surface and silently vanishes on the other. (An earlier revision of this PR claimed NavigationRenderer had been deleted — that was wrong, from a truncated grep; corrected in the second commit.)
  2. skill.permissions has no gate — mis-filed as naming drift; it's an aspirational-config item (§4). The ledger marks it live on a preview renderer's evidence while the identically-unenforced tool.permissions is dead + authorWarn, so authors get silence where they should get a warning. Note the cloud runtime documents the intent in a comment ("Layer permissions via Skill.permissions independent of the agent's permissions") without implementing it.
  3. agent.knowledge is inert — naming fixed by [P2] Naming drift → silent no-ops (spec key ≠ consumed key) #1891, but search_knowledge takes sourceIds from the LLM's tool-call args, never from the authored block, so a declared knowledge scope constrains nothing.

Refs #1878, #3503, #3496.

🤖 Generated with Claude Code

…kupFilters hint (#1878)

Re-verified all nine spec-key-vs-consumed-key drifts against current code in
both repos (including the os:check TypeScript blocks inside skills/*/SKILL.md,
which compile against the spec and are real consumers).

Six of nine were already resolved -- the list was stale, not the code:
referenceFilters (-> lookupFilters), maxRating (-> max), page visibility
(-> visibleWhen), dashboard title/label (dual-read + strict widget schema),
flow http, agent knowledge.topics (alias folded #1891), webhook keys (#3489);
action disabled was fixed this month (objectui#2863). skill
requiredPermissions was never a drift -- the original audit described prose
drift in the docs, not a spec-vs-runtime mismatch.

Still real: the coupled page pair type->pageType + label->title, which
mis-renders every non-record page today (fixed in the companion objectui PR),
and two snake-only max_length readers.

- Add 2026-07-naming-drift-recheck.md with per-item file:line evidence, the
  gate-coverage finding (bare z.object silently strips; the dashboard-widget
  .strict() + naming error map is the only mechanism that teaches), and the
  three items left as owner decisions (app badgeVariant/separator decayed when
  NavigationRenderer was replaced by UnifiedSidebar; skill.permissions has no
  gate; agent.knowledge is inert).
- Annotate README §3 with the recheck summary.
- Fix os doctor: the reference_filters rule pointed at the REMOVED
  referenceFilters key instead of the live lookupFilters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 27, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 27, 2026 2:11pm

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tooling labels Jul 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/cli.

18 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/skills-reference.mdx (via packages/cli)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli)
  • content/docs/automation/hook-bodies.mdx (via packages/cli)
  • content/docs/deployment/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/cli.mdx (via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/cli)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/plugins/packages.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/releases/implementation-status.mdx (via @objectstack/cli)
  • content/docs/releases/v16.mdx (via @objectstack/cli)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

…derer exists

My first pass claimed NavigationRenderer had been deleted; it has not. The
component (layout/src/NavigationRenderer.tsx, 1327 lines) is publicly exported
and SDUI-registered as `navigation-renderer`, and fully implements separator
(:906) + badge/badgeVariant (:983-985, :1024-1025). The error came from a
truncated grep (head -3 showed only CHANGELOG/ROADMAP hits).

Corrected classification: badge/badgeVariant/separator are SURFACE-CONDITIONAL,
not dead — they render through the SDUI component but not through
UnifiedSidebar, which is what actually renders app.navigation in the console.
Disposition flips from enforce-or-prune to port-the-three-branches.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant