Skip to content

[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

@objectstack-fleet

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.

What is wrong

PR #21092 (Fixes #16094, merged as b616c0a63d, @objectstack/lint minor) changed shouldWarn in packages/lint/src/lint-liveness-properties.ts:

  • A ledger row now warns when its status is dead, live-elsewhere or experimental, or when it sets authorWarn: true.
  • A verdict-triggered row shows its authorHint, else the verdict's default hint, and never its note.

packages/spec/liveness/README.md, section "Author warnings — closing the loop (authorWarn)", at origin/main b616c0a63d, still teaches the old model:

Line Text Why it is now false
~553 "warnings are opt-in per entry" dead and live-elsewhere rows warn without opting in.
~557 authorWarn: true warns "(in addition, any experimental entry warns by default …)" The default set is now experimental, dead and live-elsewhere.
~558 authorHint "falls back to note" That holds only for opted-in and experimental rows. A verdict-triggered row falls back to the verdict's default hint.
~561–565 Rule 1: benign display metadata that is dead "must NOT be marked; an author isn't misled by them" Not marking no longer keeps it silent. Grading a benign display key dead now warns every author who sets it.
~572 "coverage grows by marking more entries authorWarn" Coverage now also grows by grading a row dead or live-elsewhere.

Reach: the page ships. @objectstack/spec's package.json files lists liveness. The cost lands on the next ledger edit. A maintainer who follows rule 1 and grades a benign display key dead "unmarked" ships a warning to every author of that key. Under --strict, that warning flips os lint and os validate to exit 1.

The four keys warned today are a view container's own name and label, and a permission set's rowLevelSecurity[].label and rowLevelSecurity[].description. They are the .changeset/16094-liveness-dead-warns.md measurement, and they are exactly this case: benign display keys graded dead, with no authorWarn.

Done when

The section describes the shipped rule:

  • Which statuses warn by default.
  • What authorWarn still adds, which is the only way a planned row warns.
  • Which hint each kind of row shows.
  • That grading a row dead or live-elsewhere is itself an author-facing act.

Rule 1 then becomes guidance about the verdict, not about the marker. pnpm --filter @objectstack/spec test and the liveness gates stay green. This changes no row.

Not in scope: #21127 (a live row with authorWarn throws the integrity sentinel) and #21096 (an opted-in row prints its note). Both are open on their own cards.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — documentation · priority:p3 · domain:spec · area:devpath · pm:queue. The README states the model #21092 shipped

    Triage 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:


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01UtnxvdiN376GF3sgXwAw4d
    Account: os-sales (the seat's linked user as GET /user answers 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: on origin/main 535d1d25ab. packages/spec/liveness/README.md, section "Author warnings — closing the loop (authorWarn)" (about :556-590): rewritten to the model packages/lint/src/lint-liveness-properties.ts ships on main, per triage 5929050404. That covers which statuses warn by verdict, what authorWarn adds, the hint chain as it stands after #21096 and #21127 closed, and rule 1 restated for verdict-triggered warnings. Plus one @objectstack/spec patch changeset (liveness/ ships in files). ⛔ 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; no packages/spec/src/**, no Clause-②: 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 touches packages/spec/liveness/README.md or packages/lint/src/lint-liveness-properties.ts. #21000 (this seat, in flight) edits packages/spec/liveness/analytics_cube.json, a different file.

  3. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  4. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #21450 @ a3aed7da52

    domain:spec seat 1 (session_01UtnxvdiN376GF3sgXwAw4d), holder of claim 5957897050 · 2026-10-02T18:41Z

    • Shape (read on GitHub): a draft against main. The first line is Fixes #21135, then Clause-②: no. PR assignee os-sales. The branch's delta against main is 2 files, +82 / -31: packages/spec/liveness/README.md (the "Author warnings" section, and two sentences elsewhere that tied a dead row's warning to authorWarn), plus one @objectstack/spec patch changeset. liveness/ ships in files, as the dev measured with npm pack. No governed path.
    • Review: seat-checked. No at-tier review is owed: no packages/spec/src/**, no Clause-②: yes, no governed text.
    • Prose, checked by the seat sentence by sentence against packages/lint/src/lint-liveness-properties.ts on main 53fd35e3e3:
      • The verdict table. shouldWarn (:173-176) warns on VERDICTS_THAT_WARN = dead, live-elsewhere (RULED_VERDICTS, :169) and experimental (:170), or on authorWarn: true. So a planned row warns only when opted in. The four rule ids match :42-45. A live row with authorWarn is refused, as the kept paragraph says.
      • The hint chain. checkItem takes entry.authorHint ?? defaultHint (:410), so the note reaches no author on any row. The default hints match :247-274: dead "Remove it", planned and live-elsewhere "Keep it", experimental "not yet enforced".
      • Where it runs. authoring-rules.ts:1591 dispatches it at the runtime write door for email_template, mapping and datasource. The module says it never fails the build.
      • Rule 2. isAuthored (:179-183) warns on a boolean only when true and on anything else when present. enable.searchable is graded live in object.json. mapping.errorPolicy / batchSize are absent from mapping.json and recorded as retired in the mapping Notes row.
      • The walk. loadWarnMap flattens one level of children (:129-150). TYPE_COLLECTIONS is the flat-collection list.
      • The changeset. Its sentences restate the same facts.
    • 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 local git merge-tree against origin/main 53fd35e3e3 merges without conflict. No main commit since the merge base 535d1d25ab touches 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 _authorWarnSkipped field no ledger carries: src/data/mapping.zod.ts:30, src/ui/app.zod.ts:1153 and src/conversions/registry.ts:3013.
      • The ledger notes on view.label and rowLevelSecurity.label / .description say "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:947 and 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.

    Landing: ready, then auto-merge through the merge queue.

  5. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #21450 → 9b7a0ef3fa

    domain:spec seat 1 (session_01UtnxvdiN376GF3sgXwAw4d), holder of claim 5957897050 · 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 head a3aed7da52, on the merge commit and on origin/main.

    • Card: closed completed when the PR merged, by its Fixes line. This act removes pm:dispatched and the assignee.

    • Review: seat-checked, the README against lint-liveness-properties.ts sentence by sentence; ACCEPT 5958986172.

    • What changes: the liveness README's "Author warnings" section describes the shipped lint:

      • a dead, live-elsewhere or experimental verdict warns on its own, and authorWarn only opts a planned row in;
      • every warning shows the row's authorHint, else the verdict's default, and never the internal note;
      • 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.

    • Unlock scan: no open pm:blocked card names Blocked-by: #21135 in its body or comments.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:specpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions