Repository navigation
[finding] packages/spec/liveness/README.md "Author warnings" still says warnings are opt-in per authorWarn row; since #21092 a dead or live-elsewhere verdict warns on its own #21135
Description
Activity
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsTriage: first grade —
documentation·priority:p3·domain:spec·area:devpath·pm:queue. The README states the model #21092 shippedTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-01T09:55Z. ⛔ Not a claim, ⛔ not a dispatch.Why p3. The shipped lint is right. A prose page describing it is wrong.
Direction. The "Author warnings" section is rewritten to the shipped model:
experimental,deadandlive-elsewhererows warn by verdict, andauthorWarnopts other rows in;- the hint chain is
authorHint, then the verdict's default for verdict-triggered rows, andnoteonly for opted-in andexperimentalrows; - rule 1's advice on benign
deadmetadata is restated for a world where not marking no longer keeps a row silent. - ⛔ No ledger rows change in this PR. If the restatement shows a row should be re-graded, that is a separate card.
- It also stays consistent with [finding]
os lintprints a liveness row's internal ledgernote, tracker ids included, as the fix text on opted-in rows (object.externalSharingModelcites #2696 on app-showcase) #21096's direction: author-facing text never comes fromnote.
Generated by Claude Code
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Oct 1, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01UtnxvdiN376GF3sgXwAw4d
Account:os-sales(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-21135-liveness-readme-author-warnings
Worktree:objectstack-issue-21135
Domain:domain:spec
Seat:domain:spec#1(seat post #6017)
File surface: onorigin/main535d1d25ab.packages/spec/liveness/README.md, section "Author warnings — closing the loop (authorWarn)" (about:556-590): rewritten to the modelpackages/lint/src/lint-liveness-properties.tsships onmain, per triage5929050404. That covers which statuses warn by verdict, whatauthorWarnadds, the hint chain as it stands after #21096 and #21127 closed, and rule 1 restated for verdict-triggered warnings. Plus one@objectstack/specpatchchangeset (liveness/ships infiles). ⛔ No ledger row changes; a row that should be re-graded is a separate card. ⛔ No lint code change. Stop on breach; explain in the report.
Container & model:S,mode:subagent,model: opus(default build tier; nopackages/spec/src/**, noClause-②: yes, no governed text, so no at-tier review is owed and the seat checks the prose at ACCEPT)
Clause-②: no
Thread-read: 5929050404
Serial constraints cleared: at 2026-10-02T17:38Z, no open PR touchespackages/spec/liveness/README.mdorpackages/lint/src/lint-liveness-properties.ts. #21000 (this seat, in flight) editspackages/spec/liveness/analytics_cube.json, a different file.objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 21135,
"status": "done",
"branch": "claude/issue-21135-liveness-readme-author-warnings",
"pr": "#21450",
"session": "session_01UtnxvdiN376GF3sgXwAw4d",
"premise_still_valid": true,
"summary": "packages/spec/liveness/README.md 'Author warnings' section rewritten to the lint shipped at 535d1d2: dead / live-elsewhere / experimental warn by verdict (shouldWarn :173-176), authorWarn only opts a planned row in, the hint is authorHint ?? the verdict default for every row and the note is never shown (checkItem :410, after 327391c / PR #21169), rule 1 restated as 'grading a row is an author-facing act' (no marker keeps a warning verdict quiet; measure display keys against the designer-previews ruling; authorHint for a wrong default corrective), rule 2 widened to any materialized default (the old 'boolean-only' line and the _authorWarnSkipped pointer were false: no ledger row carries that field), and the coverage paragraph now states the walk's reach (TYPE_COLLECTIONS plus the object/field and translation walks, one level of children; 11 governed types with warning rows are unwalked). Zone 2 #1 measured: the hint chain had moved past triage's (note fallback gone for every row), so the section follows the code; the existing 'never on a live row' paragraph matches describe() and check:liveness and is unchanged. Zone 2 #4: two README sentences outside the section that tied a dead row's warning to authorWarn (:379, :966-969) fixed; content/docs has no live restatement (only release-owned history). One @objectstack/spec patch changeset (npm pack shows liveness/README.md ships; Check Changeset has no path exemption). No ledger row, schema or lint change; the restatement implies no re-grade (view.label / rowLevelSecurity.label/.description were measured under the previews ruling). Every changed sentence is listed before/after in the PR body. Worktree and its node_modules removed after the PR opened.",
"tests": "All at head a3aed7d. spec build (lock): exit 0. pnpm --filter @objectstack/spec run check:generated: exit 0, 'All 15 generated artifacts are up to date' (check:docs included; no generator lifts the section). Spec suite (card done-when), pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 (lock): exit 0, 600 files, 17684 passed, 1 todo. Lint subject file (untouched, evidence the documented model is the pinned one): pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 src/lint-liveness-properties.test.ts (lock): exit 0, 95 passed. Probe via tsx over lint src against the shipped ledgers: view container name/label and rowLevelSecurity label/description -> liveness-dead-property with default 'Remove it' hint and no authorWarn; externalSharingModel (planned+authorWarn) -> planned default hint; outcomeMessages -> its authorHint; agent.lifecycle / tool.outputSchema (experimental) -> default hint not note; manifest.runtime admitted but 0 findings (unwalked); dead row byte-identical with and without authorWarn; live+authorWarn throws. Derived gates: dispatch-gates --commands (no paths, merge base 535d1d2, 2 paths) = 60; each run with exit captured before any pipe: 58 exit 0, 2 exit 3 PREREQUISITE NOT MET (check:dual-build-cjs-loads needs every package dist; check:lean-entry-closure needs objectql closure dist) = NOT MEASURED, declared to CI (they load built dist; a markdown file and a changeset emit into no dist). --ran: '60 derived, 58 run, 2 NOT-MEASURED, 0 UNRUN'. Roster gates whose roster sits under a touched dir (check-changeset-fixed, check:spec-changes, check:authz-resolver, check:error-code-casing, check:filter-alias-parity): all exit 0. Liveness gates in the set (check:liveness, check:empty-state, check:strictness-ledger, check:variant-docs): exit 0. check:nul-bytes exit 0 plus grep -P control-byte self-scan: 0 hits. eslint narrowed: --format json over both paths -> 2 results, both 'File ignored because no matching configuration was supplied' (config globs are code extensions only), 0 errors; config has no parserOptions.project/projectService, so untouched files' verdicts cannot move. Typecheck not run (declared): no TypeScript in the diff. No ablation: docs-only diff, no assertion added.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "3 — each through the fleet-write relay (one POST /repos/objectstack-ai/objectstack/dispatches per write, executed as objectstack-fleet[bot]): (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft; request fw-20261002T181500Z-5f9a91, run 37046158258, read-back 18539 bytes identical); (2) label-write --assign os-sales -> POST /repos//issues/21450/assignees (request fw-20261002T181550Z-a93a1e, run 37046250967, read-back matches); (3) this os-dev-report -> POST /repos//issues/21135/comments. Plus git push (not REST). Reads only otherwise (gh api GET on #21135, its comments, PR #21450).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — stale _authorWarnSkipped mentions: no ledger carries the field, yet spec source comments name it (src/data/mapping.zod.ts:30, src/ui/app.zod.ts:1153, src/conversions/registry.ts:3013) and two dated Current-state Notes cells (mapping, qa); comments and history only, no runtime or author-facing effect",
"carrier: none · noted, not filed — ledger notes on view.label, permission rowLevelSecurity.label and .description end 'Not authorWarn'd' / 'Benign, not authorWarn'd', true of the marker but no longer meaning silence (the verdict warns); ledger JSON is outside this card, and no re-grade follows (rows measured under the designer-previews ruling at objectui db11afd4967)",
"carrier: none · noted, not filed — code comments still reasoning from the old opt-in model: src/kernel/metadata-plugin.zod.ts:947 ('datasource.json carries 0 authorWarn rows'; the conclusion holds because datasource has no warning-verdict row) and the lint docblock lint-liveness-properties.ts:720 'Covers every governed metadata type' (11 governed types with warning rows are unwalked; known and pinned for manifest since #21092); comments only, lint code is out of this card's scope"
],
"gates": "derived 60 (dispatch-gates --commands, no paths, tree a3aed7d, merge base 535d1d2): 58 exit 0, 2 NOT MEASURED exit 3 (check:dual-build-cjs-loads, check:lean-entry-closure; prerequisite dist absent; declared to CI); --ran 60/58/2/0 UNRUN; plus 5 roster gates exit 0, check:generated exit 0, spec suite exit 0",
"line_budget": "n/a — no skills/** or line-ratcheted ledger touched; diff +82/-31 over 2 files",
"deviations": [
"Section heading renamed ('(authorWarn)' to '(verdicts, and authorWarn)'); no inbound anchor or line citation exists (git grep), so nothing links to the old slug",
"Two README sentences outside the named section edited (:379, :966-969) under Zone 2 #4; other authorWarn hits in the README (dated tally :348/:360, :434, Current-state Notes cells) left as history",
"Hint chain written to the code, not to triage 5929050404's chain: after 327391c no row class falls back to note",
"Commit trailer pair is the model-free AGENTS.md form (Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By; PR footer is the AGENTS.md session-URL form, not the harness's alternative footer — AGENTS.md (via CLAUDE.md) takes precedence and the pre-push hook refuses a model identifier",
"Narrowings declared: 2 derived gates NOT MEASURED (prerequisite dist), spec typecheck not run (no TypeScript in the diff)"
],
"files_changed": [
"packages/spec/liveness/README.md",
".changeset/21135-liveness-readme-author-warnings.md"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsACCEPT — PR #21450 @
a3aed7da52domain:specseat 1 (session_01UtnxvdiN376GF3sgXwAw4d), holder of claim5957897050· 2026-10-02T18:41Z- Shape (read on GitHub): a draft against
main. The first line isFixes #21135, thenClause-②: no. PR assigneeos-sales. The branch's delta againstmainis 2 files, +82 / -31:packages/spec/liveness/README.md(the "Author warnings" section, and two sentences elsewhere that tied adeadrow's warning toauthorWarn), plus one@objectstack/specpatchchangeset.liveness/ships infiles, as the dev measured withnpm pack. No governed path. - Review: seat-checked. No at-tier review is owed: no
packages/spec/src/**, noClause-②: yes, no governed text. - Prose, checked by the seat sentence by sentence against
packages/lint/src/lint-liveness-properties.tsonmain53fd35e3e3:- The verdict table.
shouldWarn(:173-176) warns onVERDICTS_THAT_WARN=dead,live-elsewhere(RULED_VERDICTS,:169) andexperimental(:170), or onauthorWarn: true. So aplannedrow warns only when opted in. The four rule ids match:42-45. Aliverow withauthorWarnis refused, as the kept paragraph says. - The hint chain.
checkItemtakesentry.authorHint ?? defaultHint(:410), so thenotereaches no author on any row. The default hints match:247-274:dead"Remove it",plannedandlive-elsewhere"Keep it",experimental"not yet enforced". - Where it runs.
authoring-rules.ts:1591dispatches it at the runtime write door foremail_template,mappinganddatasource. The module says it never fails the build. - Rule 2.
isAuthored(:179-183) warns on a boolean only whentrueand on anything else when present.enable.searchableis gradedliveinobject.json.mapping.errorPolicy/batchSizeare absent frommapping.jsonand recorded as retired in themappingNotes row. - The walk.
loadWarnMapflattens one level ofchildren(:129-150).TYPE_COLLECTIONSis the flat-collection list. - The changeset. Its sentences restate the same facts.
- The verdict table.
- Gates on this head: 35 check-runs: 32
success, 3 skipped, none failed and none pending.check-expected-skips: OK.check-governed-merges --pr 21450: NOT governed, 113 changed lines.mergeable_state: clean. A localgit merge-treeagainstorigin/main53fd35e3e3merges without conflict. Nomaincommit since the merge base535d1d25abtouches the README, and no open PR touches it. - Out-of-scope findings (Acceptance notes, none filed: comments and ledger prose only, with no author-facing reach):
- Three spec source comments still name an
_authorWarnSkippedfield no ledger carries:src/data/mapping.zod.ts:30,src/ui/app.zod.ts:1153andsrc/conversions/registry.ts:3013. - The ledger notes on
view.labelandrowLevelSecurity.label/.descriptionsay "not authorWarn'd". That is true of the marker but no longer means silence. No re-grade follows: they were measured under the designer-previews ruling. kernel/metadata-plugin.zod.ts:947and the lint docblock's "Covers every governed metadata type" (lint-liveness-properties.ts:720) reason from the old model. 11 governed types with warning rows are unwalked, which the README now states.
- Three spec source comments still name an
Landing: ready, then auto-merge through the merge queue.
- Shape (read on GitHub): a draft against
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsLanded: PR #21450 →
9b7a0ef3fadomain:specseat 1 (session_01UtnxvdiN376GF3sgXwAw4d), holder of claim5957897050· 2026-10-02T19:13Z-
Landed: PR docs(spec): the liveness README's author-warning section states the verdict model the lint ships #21450 went through the merge queue as
9b7a0ef3fa, with one parent (b94a2a7277). Both files are blob-equal to the accepted heada3aed7da52, on the merge commit and onorigin/main. -
Card: closed
completedwhen the PR merged, by itsFixesline. This act removespm:dispatchedand the assignee. -
Review: seat-checked, the README against
lint-liveness-properties.tssentence by sentence; ACCEPT5958986172. -
What changes: the liveness README's "Author warnings" section describes the shipped lint:
- a
dead,live-elsewhereorexperimentalverdict warns on its own, andauthorWarnonly opts aplannedrow in; - every warning shows the row's
authorHint, else the verdict's default, and never the internalnote; - grading a row is itself an author-facing act;
- the walk's real reach is stated.
It is documentation only: no ledger row, schema or lint behaviour changes.
- a
-
Unlock scan: no open
pm:blockedcard namesBlocked-by: #21135in its body or comments.
-
- added 3 commits that reference this issue
on Oct 7, 2026
Filing gate: ① a defect with a named landing site. The landing site is a shipped prose page that now states the opposite of what the shipped lint does.
domain:specseat that takes this card. It edits one section ofpackages/spec/liveness/README.md. No code, no ledger rows.packages/spec/liveness/README.md:548把作者告警规则指到packages/cli/src/utils/lint-liveness-properties.ts—— 那条路径不存在,模块早已搬到packages/lint/src/,而账本门禁只校验条目的 evidence 路径、不看 README 散文指针 #19269 (a wrong path in the same section, closed) and spec: re-derive the liveness ledger before itsdead/live-elsewhereverdicts start warning authors —view.jsonlist.tabsre-read plus a sampled audit of the 90deadrows (ledger half of #16094) #16362 (the ledger half of lint:liveness-dead-propertyandliveness-live-elsewhere-propertycannot fire on 17.3.0 — 90dead+ 1live-elsewhereledger rows and not one setsauthorWarn#16094, closed).What is wrong
PR #21092 (
Fixes #16094, merged asb616c0a63d,@objectstack/lintminor) changedshouldWarninpackages/lint/src/lint-liveness-properties.ts:dead,live-elsewhereorexperimental, or when it setsauthorWarn: true.authorHint, else the verdict's default hint, and never itsnote.packages/spec/liveness/README.md, section "Author warnings — closing the loop (authorWarn)", atorigin/mainb616c0a63d, still teaches the old model:deadandlive-elsewhererows warn without opting in.authorWarn: truewarns "(in addition, anyexperimentalentry warns by default …)"experimental,deadandlive-elsewhere.authorHint"falls back tonote"experimentalrows. A verdict-triggered row falls back to the verdict's default hint.dead"must NOT be marked; an author isn't misled by them"deadnow warns every author who sets it.authorWarn"deadorlive-elsewhere.Reach: the page ships.
@objectstack/spec'spackage.jsonfileslistsliveness. The cost lands on the next ledger edit. A maintainer who follows rule 1 and grades a benign display keydead"unmarked" ships a warning to every author of that key. Under--strict, that warning flipsos lintandos validateto exit 1.The four keys warned today are a view container's own
nameandlabel, and a permission set'srowLevelSecurity[].labelandrowLevelSecurity[].description. They are the.changeset/16094-liveness-dead-warns.mdmeasurement, and they are exactly this case: benign display keys gradeddead, with noauthorWarn.Done when
The section describes the shipped rule:
authorWarnstill adds, which is the only way aplannedrow warns.deadorlive-elsewhereis itself an author-facing act.Rule 1 then becomes guidance about the verdict, not about the marker.
pnpm --filter @objectstack/spec testand the liveness gates stay green. This changes no row.Not in scope: #21127 (a
liverow withauthorWarnthrows the integrity sentinel) and #21096 (an opted-in row prints itsnote). Both are open on their own cards.Generated by Claude Code