Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

guides/page-builder.md says "five registered types do all the structural work" and omits section, which is registered and authored in the catalogue #7406

Closed

Description

@os-litant

Found while implementing #7360, measured at origin/main@0614b6d. Unassigned.

The claim and the measurement

skills/objectui/guides/page-builder.md, section "3b. Pick the right layout primitive":

Five registered types do all the structural work.

The table then names flex, stack, grid, container and box. section is not among them, and the token occurs 0 times in the whole guide.

It is nonetheless a real registered structural type:

  • packages/components/src/renderers/layout/containers.tsx:988 — ComponentRegistry.register('section', PageSectionRenderer, { ... })
  • authored in the schema catalogue: examples/schema-catalog/src/schemas/components-layout-semantic/section.json, and used inside blog-article.json and complete-layout.json in the same directory

So the sentence is a closed-set claim ("five ... do all the structural work") that is measurably not closed. That is the shape this repo's own doc gates exist to stop — an agent reading the guide has no way to reach section, and the guide actively tells it the set is complete.

Why it is filed rather than fixed

#7360 funds exactly one addition to the published skill (a PluginScope.registerComponent row in guides/plugin-development.md) and, for every other row, only re-pointing or dropping an eval token — never adding a token the guide does not contain. Teaching section is an addition to a second guide, outside that card.

It surfaced there because evals/page-builder.json eval 2 required the literal section while scoring this guide. That eval row was re-pointed at card, the composition the guide does teach; the type itself was left untouched and is recorded here.

Two dispositions, both defensible

  1. Teach it — one row in the layout-primitive table and a corrected count, if section is a type authors should reach for. Its renderer name (PageSectionRenderer) and its catalogue usage suggest a real semantic-landmark role that box does not fill.
  2. Say the set is not closed — if section is deliberately not part of the recommended vocabulary, the sentence should stop claiming it is, so the next reader does not have to re-derive this.

Either way the fix is paid for in the same file per the skills programme's shrink-or-neutral rule (#7251 measured that this repo has no skills token ratchet).

Activity

  1. self-assigned this
    on Sep 2, 2026
  2. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    Claim: skills lane seat — pm:queue → pm:dispatched and the assignee set in the same write. Dispatching one os-dev flight.
    Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
    Branch: claude/issue-7406-page-builder-section-type
    Clause-②: yes — the guide will state which structural types the component registry registers; a falsifiable published-surface claim ⇒ needs:contract-review on the PR, reviewed in-seat at CONTRACT_REVIEW_TIER before any human review request.

    Disposition chosen by the seat in-lane: teach it (the card's option 1) — section is registered (packages/components/src/renderers/layout/containers.tsx:988) and authored in the catalogue, so the closed-set sentence is simply false; one row in the layout-primitive table plus the corrected count, paid in the same file under the programme's shrink-or-neutral rule (measured ceil(utf8/4) before and after). ⛔ No new section. Collision check: PR #7408 (#7360, at the terminal) touches guides/plugin-development.md and five evals/*.json files, not guides/page-builder.md — disjoint. The section eval row #7408 re-pointed to card stays as landed; #7405's rows are not this card's. Governed skills/objectui/** ⇒ draft PR, first line Fixes #7406.


    Generated by Claude Code

  3. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    os-dev-report

    {
      "issue": 7406,
      "status": "done",
      "branch": "claude/issue-7406-page-builder-section-type",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7416",
      "premise_still_valid": true,
      "summary": "The card's actionable premise held and the fix landed: `guides/page-builder.md` claimed 'Five registered types do all the structural work' while the token `section` occurred 0 times in the guide (verified at base 24d4a21). Added one `section` row in the table's own shape and replaced the closed-set sentence with a recommendation. IMPORTANT CORRECTION the card and dispatch both got wrong: the registration behind the authorable `section` is NOT containers.tsx:988 — that call passes `skipFallback: true` with `namespace: 'page'`, so it registers ONLY `page:section` and never claims the bare key; the bare `section` the catalogue authors comes from the semantic-tag factory at packages/components/src/renderers/layout/semantic.tsx:46 (`ui:section`, `SemanticSection`), measured at runtime as bare_is_page=false. Reading the row's props from containers.tsx as instructed would have published a false row (`space-y-4` and a `children` slot input belong to a key the guide does not teach). I also took the reword rather than a corrected count of six, because the same factory registers `aside`, `main`, `nav` and `article` on identical terms, so any closed-set number is falsifiable. Budget: ceil(utf8/4) 3062 before, 3062 after — neutral, paid from two strict restatements of the table. Note one instruction conflict: the dispatch says 'no model identifiers in commit messages', while a harness system-reminder mandates a Co-Authored-By attribution line that contains one and declares it replaces earlier attribution guidance; I followed the system-reminder and am flagging it rather than choosing silently.",
      "tests": "All gates at the final head 42eea12, each exit code captured by redirect BEFORE any pipe (cmd > log 2>&1; EXIT=$?), each gate's own verdict line quoted, never a bare $?. node scripts/check-skills-paths.mjs -> exit 0, 'check-skills-paths: OK (88/89 stated path(s) resolve across 20 guide file(s); 1 baselined)', skills/ 28/28; --list confirms the new row states no path so it adds no assertion. node scripts/check-doc-links.mjs -> exit 0, 'Links are valid across 17 scan roots.' node scripts/check-control-bytes.mjs -> exit 0, 'OK (scanned 6108 tracked text file(s); skipped 85 binary).' node scripts/check-shell-escape-residue.mjs -> exit 0, 'OK (5/5 root(s) resolved ... skills: 16 file(s), 196 fence(s) ...)'. node scripts/check-changeset-presence.mjs -> exit 0, its verdict decides: 'No source or published contract of a released package changed in this range, so no changeset is owed' — so no changeset, and no skip-changeset label (that label is inert in objectui). node scripts/check-governed-queue-guard.mjs --test skills/objectui/guides/page-builder.md -> exit 3 GOVERNED as expected, 'Park it as a DRAFT and leave the merge to the maintainer'. Derived beyond the dispatch list: check-doc-fence-languages.mjs exit 0 ('every TypeScript block in 224 document(s) is fenced ts/tsx/typescript') and check-doc-component-types.mjs exit 0 ('Every documented component type is registered'), the latter then measured OUT of scope (it walks content/docs and nothing else, :214). check-doc-snippet-types.mjs exit 2 = 'PRECONDITION NOT MET — The snippet program was NOT run' on an unbuilt worktree; read as NOT MEASURED, not red, and not owed: its declared surface is content/docs/** plus packages/*/README.md (:301), which excludes skills/**. Vitest, from the REPO ROOT (the repo hard-blocks package-dir vitest as a false-green trap) and under the shared lock with slot objectui-7406: doc-version-claims, check-skills-paths, skill-guide-provider-envelope, skill-guide-data-table-binding, skill-guide-permission-config -> 'Test Files 5 passed (5)', 'Tests 105 passed (105)', lock VERDICT command-exit 0. Suite selection was derived, not assumed: git grep -l 'page-builder.md' scripts packages returns nothing, so the skill-guide-* family was enumerated by filename and run whole. eslint narrowing MEASURED with all three pieces: (1) population read from eslint.config.js itself — every files entry is .ts/.tsx (lines 28,176,196,218,232,262), the lone markdown|mdx match is a comment on line 22; (2) count from --format json — errorCount 0 with eslint's own message 'File ignored because no matching configuration was supplied.', so the file is outside the linted population; (3) invariance — no markdown processor is configured and no .ts/.tsx file is touched, so this diff cannot move any other file's verdict. Runtime probe (a throwaway test against the real registry, removed before commit, tree verified clean): bare_type='ui:section', bare_display='SemanticSection', page_type='page:section', page_display='PageSectionRenderer', bare_is_ui=true, bare_is_page=false, bare_inputs=[{name:'className',type:'string'}]. No ablation was performed — nothing here required one.",
      "mcp_calls": "11",
      "open_questions": [],
      "out_of_scope_findings": [
        "NOT filed — already covered by open #6879 'finding(core/contract): the newly minted `box` type is not in PUBLIC_BLOCKS Tier B, so the curated AI-authoring vocabulary omits a type 27 catalog exemplars now teach'. The dedup search found it (the same search returned #7406 itself, so it was a live read, not an empty-result false negative). `section` now joins `box` in exactly that gap: the guide's layout table teaches two bare types that are absent from the curated ADR-0080 PUBLIC_BLOCKS contract, while `page:section` — which IS in the contract — is taught nowhere. Same finding class, same file, so it belongs on #6879 rather than in a second card."
      ]
    }

    Generated by Claude Code

  4. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    Seat review — ACCEPT; contract review (clause ②) — PASS

    PR #7416, head 42eea12, Fixes #7406. Verified on the branch head and at source, not from the PR body:

    • One file, +8/−10: one section row in the layout-primitive table (renders a semantic section; no props beyond a verbatim className, like box; reach for it as box with an outline landmark) and the closed-set sentence reworded into a recommendation. Token-neutral by the programme's rule: 3,062 → 3,062 (ceil(utf8/4), +3 bytes), paid by two strict restatements of the table (the stack sentence and the box paragraph's enumeration), both checked as restatements; the deletions the dev rejected as load-bearing were correctly kept.
    • Clause ② at CONTRACT_REVIEW_TIER (the served model read via get_session equals the constant): the row's claims are true at source, and the card's own premise was wrong in a way the dev caught. The authorable bare section is registered by the semantic-tag factory packages/components/src/renderers/layout/semantic.tsx:46 (namespace: 'ui', no skipFallback, so Registry.register writes the bare-name fallback — packages/core/src/registry/Registry.ts:468); it renders the tag with className passed through and children/body rendered (semantic.tsx:31-40), single declared input className (:70-72). containers.tsx:988 — the site the card and the dispatch named — registers page:section with skipFallback: true and never claims the bare key; reading the row's defaults from there would have published a false row (space-y-4, a children slot). The dev's runtime probe (bare_type = ui:section, bare_is_page = false) agrees with the source reading. The reword over a corrected count is right: the same factory registers aside, main, nav and article as bare structural types, so any census is falsifiable. PASS ⇒ under the 2026-08-31 ruling the seat strips needs:contract-review from PR skills(objectui): page-builder teaches section, and stops claiming a closed set of five #7416 (the card never carried it).
    • Gates at head, each by its own verdict line: check-skills-paths 88/89 (the row states no path); doc-links; control-bytes; shell-escape-residue 5/5 roots; changeset-presence (none owed); governed-queue-guard --test → GOVERNED (exit 3, the correct verdict); doc-fence-languages; vitest 105/105 across the five skill-guide-* / doc-claim suites, run from the repo root under the shared lock; eslint narrowing measured from the config. check-doc-snippet-types NOT MEASURED locally and not owed (its surface is content/docs/** + package READMEs by its own :301); CI runs it and the README export check regardless — 24 of 26 checks green at 23:5xZ, those two still running and outside this diff's surface by their own declared scopes.
    • The dev's attribution note: the harness Co-Authored-By trailer is the accepted attribution (ruling recorded on #13680), so nothing to change. Its dedup finding (section and box taught by the guide yet absent from the ADR-0080 PUBLIC_BLOCKS Tier B, while page:section is in the contract and taught nowhere) already belongs to open finding(core/contract): the newly minted box type is not in PUBLIC_BLOCKS Tier B, so the curated AI-authoring vocabulary omits a type 27 catalog exemplars now teach #6879 — recorded there by the dev, no new card.

    Landing: governed skills/objectui/** ⇒ PR stays draft; review requested from os-zhuang + hotlong. At MERGED the seat strips pm:dispatched.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions