Repository navigation
docs(app-shell): record the objectui#7612 ruling where AUTHOR_SHAPE_ONLY_TYPES states its ingress condition (objectui#10150) - #10316
Conversation
…NLY_TYPES states its ingress condition The header above AUTHOR_SHAPE_ONLY_TYPES ended on a plan: switch the sharing_rule edit gate on once the _diagnostics ingress is closed. That condition was met (objectui#7603, hoisted by objectui#8181 into extractDraftBody, which strips through the spec's stripReadDecorations), the switch was put to the maintainer on objectui#7612, and the ruling was option A: the edit door stays with the server. The ending now records that, verbatim, where the reader meets the condition. The measurement above it is kept unchanged; the one sentence that quoted the pre-strip assembly is marked as the path objectui#6982 measured, with the live answer pointed at its test. No code line moves.
…Y_TYPES header A source scan of the one docblock directly above the set. It requires that docblock to name the ruling's card (objectui#7612) and the function that closed the ingress (extractDraftBody), so the header cannot again read as a plan whose condition is met without the answer beside it. Named subjects only: the ruling's wording is quoted in the header, not pinned as text. The control reads the same docblock for the measurement it must keep (ADR-0010, _diagnostics, objectstack#5316) and proves the read is bounded on both sides, so an empty or misplaced read cannot pass as a scan of nothing.
…s releasing nothing The docblock sits on a non-exported const, so it does not reach the emitted clientValidation.d.ts; the comment-stripped emit is identical to the base.
The ruling's own card reads 404 from this container today (issue GET, the single-comment GET and the web page; the comment list and the timeline still answer), so the header also names the card that restates it. The quotation stays in the header either way, which is what makes the site self-sufficient.
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Fixes #10150
Clause-②: no
What
The docblock above
AUTHOR_SHAPE_ONLY_TYPESin the metadata-adminclientValidationended on a plan: switch thesharing_ruleedit gate on once the_diagnosticsingress is closed, and not before. That condition was met. The switch was then put to the maintainer on objectui#7612, with the condition already measured, and the ruling was option A: the edit door stays with the server. So a reader who checked the stated condition would find it met, and the header gave them no reason to stop short of switching the gate on.The ending now records the ruling where that reader meets the condition:
extractDraftBody, which removes the spec's own list through the spec'sstripReadDecorations;sharing_ruleout of the set, and that only a new ruling re-opens the question.Kept as it was: the measurement above it (the ADR-0010 envelope family, the
_diagnosticsread decoration, the objectstack#5316 inversion, the measured read-path table). One sentence in it quotes the pre-stripgetDraft().itemassembly, and it stays verbatim. The new ending marks it as the path objectui#6982 measured, and points atResourceEditPage.readDecorationStrip.test.tsxfor the live answer instead of restating that answer (AGENTS.md #9).AUTHOR_SHAPE_ONLY_TYPESstill listssharing_rule, and no code line in the file moved.The header also names objectui#10150 as a second place where the ruling is recorded. The reason: from this container, the objectui#7612 issue page answers 404 today (see Acceptance notes).
Premise, re-derived on
origin/main(8b1f0661) before editing_diagnosticsingress being closed first … Until then a gate here would refuse legitimate author input", and the set was['sharing_rule'].client.getDraftresults inResourceEditPagego throughextractDraftBody(draftResp)before the{ ...baseline, ...draftReal }merge.extractDraftBodyin@object-ui/data-objectstackreturnsstripReadDecorations(body), imported from@objectstack/spec/kernel.main.The pin
clientValidation.authorShapeRuling-10150.test.tssits beside the otherclientValidationtests and runs in the unit project. It is a source scan of the ONE docblock directly aboveconst AUTHOR_SHAPE_ONLY_TYPES. The test locates that docblock and does not mask anything.objectui#7612andextractDraftBody. These are named subjects. The ruling's wording is not pinned, because nothing parses it.ADR-0010,_diagnostics,objectstack#5316). Its read is also bounded on both sides: the code above and the comment below are in the file but not in the block. So an empty or misplaced read cannot pass as a scan of nothing.The pin cannot judge prose intent. A header that cites the ruling and also re-states the plan would pass. The pin's own docblock says so.
Ablation (a one-time proof, run from the committed fix at
a87fe06e)The ablation ran through objectstack's
scripts/ablation-replace.mjsin WRAP mode, inside a script with its owntraprestore on EXIT, INT and TERM. The mutation swapped the new ending back for the old one.4181dbb6becamed7ba23ed, which is exactly the file's base blob on8b1f0661. On-disk counts while mutated: the old plan phrase 1,objectui#76120,extractDraftBody0.Tests 1 failed | 1 passed (2). The failing case wascites the ruling and the closed ingress by name, in the header itself, and the CONTROL stayed green. That is the predicted direction: red.4181dbb6,git diff HEADis empty, andgit statusis clean.The same ablation first ran at
0a03e7ea, before the second-locus edit, with the same reading: 1 failed, 1 passed.Verification at HEAD
a87fe06epnpm turbo run build --filter=@object-ui/app-shell... --concurrency=2, 29 of 29 tasks successful.pnpm --filter @object-ui/app-shell type-check(tsc --noEmit && tsc -p tsconfig.test.json) exits 0 through the lock. The test program includes the pin (--listFilesOnly: 1 hit).clientValidationneighbour, the citedResourceEditPage.readDecorationStrip.test.tsxanddraft-envelope.test.ts, repo-root form:Test Files 12 passed (12),Tests 166 passed (166).pnpm check:control-bytespasses.pnpm check:new-line-citationsreports 0 new citations over the 3 files compared, with its synthetic controls PASS.node scripts/check-changeset-presence.mjspasses, with an empty frontmatter.check-test-path-roots,check-hand-rolled-comment-mask(no carrier outside DEBT),check-changeset-no-major,check-pending-changeset-literals,check-type-check-coverage,check-lint-coverage,check:unreferenced-sources,check:metadata-write-doors,check-vi-mock-specifiers, andcheck-governed-queue-guard --test(NOT GOVERNED, 3 paths).check-changeset-claims(report-only) names two pending changesets that mentionclientValidation.ts. One is aboutLOADERS.flowand the other about the retiredthemeentry. This change touches neither.Lint: narrowed, with the narrowing proven
.tsfiles are linted (2 JSON entries, no ignore notice). The changeset is outside the population:File ignored because no matching configuration was supplied.--format jsonwith--no-inline-config(the CI form): 2 files, 0 errors, 0 warnings.eslint.config.jsenables no type-aware linting (0 hits forprojectServiceorparserOptions; control: 13 hits forrules). No local rule undereslint-rules/reads the filesystem (0 of 10 files; control: 9 of them carrycreate). So this diff cannot move a verdict on any untouched file.Changeset: empty frontmatter, measured
The presence gate requires a changeset, because published
srcchanged. It is declared as releasing nothing, based on a measurement of the emit:clientValidation.d.tshas 0 hits forAUTHOR_SHAPE_ONLY_TYPESand 0 forobjectui#7612. Control: the exportedhasClientValidatorand its docblock, 1 hit each. Re-measured ata87fe06ewith a declaration-only emit, with the same reading..jscarries the comment. With comments stripped, the TypeScript emit of the file is byte-identical between base and HEAD.Acceptance notes
clientValidation.optOuts.test.tscarries the same pre-strip account in two docblocks. The case headed "THE LOAD-BEARING PIN" saysResourceEditPageassembles its draft fromclient.getDraft().item"and strips nothing". The block above it calls the decoration pin the one that says "WHY the door must stay shut". Since objectui#7612, the door stays shut because of the ruling, not because the decoration arrives. The assertions are still true; only their stated reasons are out of date. Carrier: whoever next edits that file. None is named.LOADERScomment besidesharing_rule("CREATE ONLY — seeAUTHOR_SHAPE_ONLY_TYPESabove for why this shape may not judge a stored body") is left as it is. The claim fences everything but the header, and that comment points at the header, which now gives the answer.GET /repos/objectstack-ai/objectui/issues/7612and the issue's web page answer 404, and so does a single-comment GET on its thread. The comment list and the timeline answer 200 (statenot_plannedat 2026-09-20T14:46Z, no transfer event). Controls: objectui#7603, Three other draft-envelope consumers takegetDraft().itemverbatim, with no read-decoration strip #8181 and feat(app-shell): switch the sharing_rule client validator on at the edit door #10054 answer 200 on the same endpoint. The cause was not measured. That 404 is why the header also names objectui#10150. The quotation in the header does not depend on either card.Session:
https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC(thedomain:uiseat #1 dispatch).Generated by Claude Code