Skip to content

sweep(spec): 2-item "self-descriptions answerable to reality" sweep II — one claim, one PR, per-item checklist (#7017 #6961) #7056

Description

@os-zhuang

Sweep card per the findings-round bundling discipline (#6243 / PR #6288 precedent; #7024 / PR #7032 is the immediate predecessor of this same criterion family), packaged by the domain:spec seat under the maintainer's cloud-bundling approval (2026-08-09 「同意」, chat) and today's batch-dispatch instruction. This card is the claim object; the member cards keep pm:queue but are NOT dispatch candidates while this sweep is open — selection excludes them via this member list.

Shared criterion (what makes these one sweep)

Both members are self-descriptions that are no longer answerable to reality — prose (a liveness-ledger evidence sentence, a .describe() contract note) asserting something the code does not back, or understating something the code now delivers. Every fix re-anchors the description to a verifiable, already-measured source of truth. No acceptance-face changes anywhere in this sweep — the legal-metadata set must be byte-identical before/after (the sweep's red line; a member that turns out to need an acceptance change is DROPPED and reported, not smuggled).

Members (read each card in full before touching it; premise-first per member)

  1. spec:liveness 台账 widgets.children.chartConfig 的 evidence 措辞不实(「chart-config bag forwarded」),按 #5175 实测改写(无争议先行步) #7017 — packages/spec/liveness ledger entry widgets.children.chartConfig: the evidence wording ("chart-config bag forwarded") is not what was measured. Rewrite evidence/note per the DashboardWidget.chartConfig 在 dashboard 元数据面只有 showLegend 落地 —— 12 个已声明键里 11 个惰性,liveness 台账那一行高估了证据 #5175 measurements (the card marks this the uncontroversial first step — 无争议先行步). Scope is the ledger entry's prose only.
  2. spec: UserFiltersSchema.allowAddTab 的 .describe() 从「仅承诺渲染入口」升回真实语义(#5236 A1 落地后的联动半边) #6961 — UserFiltersSchema.allowAddTab's .describe() still carries the downgraded "仅承诺渲染入口" wording. objectui: allowAddTab 渲染出的「新增 tab」按钮没有 click handler —— 契约刚声明的能力只交付了一半 #5236 A1 has landed and objectui#3926 is MERGED (unblock comment on the card, objectui main cf5be4ec2, two readings), so the describe is upgraded back to the real semantics. Read the objectui: allowAddTab 渲染出的「新增 tab」按钮没有 click handler —— 契约刚声明的能力只交付了一半 #5236 A1 ruling for the exact promised behavior; quote it in the PR. Note: .describe() text flows into generated JSON-schema/docs artifacts — regenerate (gen:schema / gen:docs) and commit content/docs/references deltas (PR feat(spec,service-automation): a flow variable can declare a defaultValue, so "declared" means "bound" (#4697) #6998 lesson).

Sweep rules (binding on the PR)

  • One PR, body carries a per-item checklist: one row per member — 落点 | before | after — reviewed row by row.
  • Fixes #7017 / Fixes #6961 only for members actually completed; a dropped member gets a Part of note and the reason.
  • Zero changes outside the 2 items, self-certified: git diff --stat file list must map 1:1 onto the checklist (generated-artifact deltas from gen:schema/gen:docs count as part of spec: UserFiltersSchema.allowAddTab 的 .describe() 从「仅承诺渲染入口」升回真实语义(#5236 A1 落地后的联动半边) #6961's row).
  • Acceptance-face byte-identity asserted: existing schema acceptance tests all pass unchanged; no test expectations edited.
  • Out-of-scope discoveries are filed as separate unassigned issues (PD chore: version packages #10), never folded in.
  • A member whose premise died (main moves ~18 merges/day) is dropped with evidence — that is a good outcome, not a failure.

Refs: #6243 (sweep pilot), #7024 (criterion-family predecessor, closed today via PR #7032), #5175 (the #7017 measurement source), #5236 / objectui#3926 (the #6961 semantics source).

Activity

  1. self-assigned this
    on Aug 9, 2026
  2. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    ContributorAuthor

    CLAIM — PM seat domain:spec (session session_01PiRUoQkTSBBmpyXBY3cVn2), dispatching as a mode:cloud card.


    Generated by Claude Code

  3. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    ContributorAuthor

    OS-DEV-REPORT

    {
      "card": 7056,
      "branch": "claude/issue-7056-describe-realignment-sweep",
      "pr": 7065,
      "pr_state": "draft",
      "base_merged": "origin/main 3f7f14e61",
      "members": [
        {
          "issue": 7017,
          "status": "done",
          "landing": "packages/spec/liveness/dashboard.json → widgets.children.chartConfig",
          "premise": "held — the evidence sentence 'chart-config bag forwarded to the chart renderer' was never measured; #5175 measured that the cited lines take the bag out and the next line reads only showLegend (1 of 14 declared keys)",
          "verdict_change": "none — status stays `live`. #5175's measurements did not demand one: the maintainer's 2026-08-06 ruling resolved the direction as enforce (方案② 的收敛版, 「协议端 v17 零 schema 改动」), so the fix owed was evidence that supports the verdict, not a different verdict",
          "re_anchor": "objectui @91757a7 → @230ffd875 (current objectui main). The enforce half #7016 merged 2026-08-09T09:56Z as objectui#3934, so per this card's own instruction the wording follows the post-merge reality: chartConfigPresentation (DatasetWidget.tsx:380-429) lowers 9 keys one `if` per key (showLegend/showDataLabels/title/subtitle/description/height/annotations/interaction/colors), called at :1091 and spread at :1118, DOM-pinned in __tests__/DatasetWidget.chartConfig.dom.test.tsx; 5 keys stay unforwarded with the reason (xAxis/yAxis/series derived from the dataset selection, type answered via CHART_TYPE_MAP, aria has no reader)",
          "children_opened": false,
          "extra_fields": ["verifiedAt 2026-08-03 → 2026-08-09", "evidenceScope: cross-repo (added)"],
          "note_guard": "the note states the narrowing half for the 5 unforwarded keys is still an open maintainer decision on #5175, so the row cannot be read as classifying them"
        },
        {
          "issue": 6961,
          "status": "done",
          "landing": "packages/spec/src/ui/view.zod.ts → UserFiltersSchema.allowAddTab .describe() + the ⚠️ Scope-of-the-promotion TSDoc above the schema; regenerated content/docs/references/ui/view.mdx",
          "premise": "held — the describe still carried #5073's deliberately narrowed 「仅承诺渲染入口」 wording",
          "ruling_source": "#5236 comment 5200253516 (2026-08-06) — A1 —— 实现,会话级; quoted verbatim and untranslated in the PR body",
          "delivery_verified": "objectui#3926 MERGED, objectui main cf5be4ec2; re-read in the merged source (packages/plugin-list/src/UserFilters.tsx): handleAddTab snapshots filtersForTab(activeTab) under a drafted label into component-state-only SessionTab[] (no sys_metadata, no API, no storage), and each session tab renders a remove control the authored presets do not get",
          "describe_after": "Let end users add their own tab after the presets (tabs element): the affordance asks for a name and snapshots the filters currently applied as a new tab. SESSION-SCOPED — an added tab lives only for the current mount, is never written back as metadata (ADR-0047), and carries a remove control the authored presets do not. Page lists only — object views use `listViews` for named presets",
          "regen": "pnpm gen:schema && pnpm gen:docs — one line changed in content/docs/references/ui/view.mdx; check:docs was the only stale artifact the gates found"
        }
      ],
      "dropped": [],
      "files_touched": [
        { "path": ".changeset/self-descriptions-answerable-to-reality-ii.md", "added": 55, "deleted": 0, "member": "sweep changeset (one patch bump on @objectstack/spec)" },
        { "path": "content/docs/references/ui/view.mdx", "added": 1, "deleted": 1, "member": 6961 },
        { "path": "packages/spec/liveness/dashboard.json", "added": 4, "deleted": 3, "member": 7017 },
        { "path": "packages/spec/src/ui/view.zod.ts", "added": 14, "deleted": 7, "member": 6961 }
      ],
      "diff_stat": "4 files changed, 74 insertions(+), 11 deletions(-)",
      "acceptance_face": "byte-identical — check:authorable-surface (authorable-surface/, authorable-defaults/, JSON schemas) green WITHOUT regeneration; no schema key/enum member/default/strictness posture/tombstone moved; no test file touched, no expectation edited",
      "gates": {
        "source": "enumerated from .github/workflows/lint.yml (both jobs) + .github/workflows/spec-liveness-check.yml, run after merging origin/main and rebuilding",
        "pass": [
          "check:generated (all 10 artifacts up to date after gen:schema + gen:docs)",
          "check:liveness", "check:empty-state", "check:variant-docs", "check:strictness-ledger",
          "pnpm lint (ESLint)",
          "check:slot-lookup", "check:query-options-erasure", "check:verify-stand-in", "check:nul-bytes",
          "check:stack-collection-maps", "check:doc-authoring", "check:docs-audit-scope", "check:role-word",
          "check:quick-reference-counts", "check:adr-anchors", "check:org-identifier", "check:authz-resolver",
          "check:service-providers", "check:route-envelope", "check:error-code-casing", "check:wildcard-fallthrough",
          "check:meta-type-normalized", "check:init-service-contract", "check:durability-log-level",
          "check:startup-registry-verdict", "check:objectui-changeset", "check:changeset-gate-self-tests",
          "check:release-notes", "check:release-body", "check:node-version", "check:workflow-status-functions",
          "check:shard-attestation", "check:required-contexts", "check:published-files",
          "check:engine-double-contract", "check:kernel-hook-pairs", "check:resume-authority-declared",
          "check:driver-memory-census", "check:merge-driver", "check:spec-parsed-alias", "check:tenant-chokepoint",
          "check:type-check-coverage", "check:driver-conformance", "check:stall-guard", "check:skill-frame-sync",
          "check:skill-compatibility", "check:agent-model-declared", "check:generated --reconcile-only",
          "spec tsc --noEmit", "turbo run typecheck (121/121)",
          "check:i18n", "check:i18n-coverage", "check:app-nav-i18n",
          "pnpm --filter @objectstack/spec test (354 files / 9235 tests)",
          "node scripts/check-adr-0087-registration.mjs --base origin/main (no declared-breaking changeset — prose realignment owes no disposition)"
        ],
        "fail": [],
        "not_runnable": [
          "check:react-declaration-parity — needs objectui's sdui.manifest.json; on-demand at the pin bump by decision (#5960)"
        ]
      },
      "out_of_scope_findings_filed": [],
      "landing": "NOT queued, NOT armed for auto-merge — left as a draft PR for the PM to land serially"
    }

    Both members completed; nothing dropped, nothing folded in. The one judgement worth a reviewer's eye is on #7017: because the enforce half (#7016 → objectui#3934) merged at 09:56Z today, the evidence is anchored to the post-merge reality per this card's own instruction 「evidence 改写完成时若其已合入,以合入后的实况措辞为准」 — 9 keys forwarded, 5 named as not, verdict untouched at live, and no children opened.


    Generated by Claude Code

  4. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    ContributorAuthor

    Sweep complete — closing the claim card. PR #7065 merged to main at b88f5e8d4 (2026-08-09T14:13Z). Both members delivered and verified closed by direct reading: #7017 ✓, #6961 ✓ (each state_reason: completed, closed 14:13:50Z). No members dropped; per-item checklist and 1:1 diff-stat self-certification in the PR body; acceptance face byte-identical (check:authorable-surface green without regeneration). #7017's evidence was anchored to the post-merge reality (objectui#3934) per the card's own instruction, verdict untouched at live.


    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