Skip to content

Bring this repo's platform lint warnings to zero, and delete the unwired scripts/wow1-live-schema.sh (epic #1579, step 2a — the half that needs no release) #1596

Description

@os-steve

Sub-issue of the epic #1579, split out of #1581 so the work that needs no release can run now.

Why this card exists

Maintainer, 2026-09-05, approving the split after asking whether the whole of #1581 really had to wait for a release: 「必须要等发版本吗?」 → 「ok」.

⇒ It did not. #1581 carried a single Blocked-by over two separable pieces, and its own body already sequences them:

piece needs card
zero the platform warnings; delete the unwired script only the CURRENTLY pinned @objectstack/cli 17.3.0, which already reports them this card — unblocked
flip lint to objectstack lint --strict and prove the gate reds a published CLI carrying --strict, then pinned here #1581 — still blocked

hotcrm consumes exact published version pins ("@objectstack/cli": "17.3.0"), not a git pin or workspace link, so pnpm lint runs the published artifact. --strict merged to objectstack main at 2da2901e and is not in any published version — measured 21:5xZ: npm view @objectstack/cli version = 17.3.0, the same version already pinned here. ⛔ The pin matching the registry proves nothing; that artifact predates the flag.

⇒ The Blocked-by was stricter than the work required. This card is the part that was never blocked.

Governing text

AGENTS.md § "Scope — a pure metadata application (2026-08-31 ruling)", rule 1 ("checked for legality by the os commands … ⛔ Do not re-invent what the platform already owns") and rule 3 ("⛔ Do not grow a gate farm"). Protocol baseline (maintainer 2026-09-05): 「本项目以协议为基准。所以开发应该对其协议」.

The work

  1. Zero the platform lint warnings, one commit per rule family, each commit naming the rule ids it clears. Fix the metadata to what the rule prescribes.
    • ⛔ Never suppress, whitelist, or locally re-severity a rule. That would be a new local gate — precisely the thing this epic exists to remove.
    • ⚠️ A warning that is WRONG on this metadata is a platform finding, not something to bend the metadata around: file it upstream in objectstack-ai/objectstack (unassigned, citing the rule id and the site), leave the warning in place, and report the count that could not reach zero and why.
  2. Delete scripts/wow1-live-schema.sh — wired to no package.json script and no workflow, and it asserts nothing. Verify with git grep wow1 before deleting; if a roster does name it, stop and report rather than deleting.
  3. Changeset: empty frontmatter unless a metadata fix in step 1 is user-visible, in which case a real one naming it.

Acceptance

pnpm lint exits 0 with 0 warnings on this branch. Suggestions may remain and are reported by count. pnpm verify green. ⛔ No test file is deleted — that is epic step 3's job, per family, and each of those cards is Blocked-by #1581.

⛔ Not in this card

⚠️ Premise to falsify first

The 90 warnings / 12 suggestions figure is the director seat's measurement recorded on #1579's census, ⛔ not this seat's — this checkout has no node_modules, so no PM has re-run it since. Re-measure pnpm lint on your branch's base before planning the commits, and report the real numbers. If the count has moved materially, say so; the card's shape survives, the commit plan may not.

⚠️ Zeroing without the flag does not stay zeroed: nothing prevents warnings creeping back until #1581 lands. That is the accepted cost of the split, and the reason #1581 should follow as soon as a release makes it possible — ⛔ it is not a reason to delay this half.

Refs: #1579 (epic; census comment 5552607309) · #1581 (the blocked half) · objectstack#15935 / PR #15967 (the flag, merged, unreleased).

Activity

  1. added
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    on Sep 5, 2026
  2. self-assigned this
    on Sep 5, 2026
  3. os-steve commented on Sep 5, 2026

    @os-steve
    CollaboratorAuthor

    Claim: epic PM, hotcrm#1579, round 2
    Session: session_01DuzfS5chho38Yx1jxx9DEj
    Branch: claude/issue-1596-zero-platform-lint-warnings
    Worktree: hotcrm-issue-1596
    Domain: pm:epic (epic sub-issue; single-lane repo, so no domain:* prerequisite)
    File surface: whatever objectstack lint names — expected src/** metadata (objects, views, pages, flows, actions, sharing), src/translations/** if an i18n rule fires, plus the deletion of scripts/wow1-live-schema.sh and the changeset. ⛔ No test/** deletions, ⛔ no scripts/check-lint-i18n-gate.mjs, ⛔ no governed surface (stop on breach; explain in the report)
    Container & model: L, mode:subagent, model: opus (default judgement tier) — ⚠️ tier is PM judgement; scripts/pm/dispatch-gates.mjs is an objectstack script with no hotcrm path map, so there is no --tier output to quote. Judgement tier because deciding which warnings are wrong-on-this-metadata (⇒ upstream findings) rather than metadata-to-fix is the whole difficulty.
    Clause-②: no
    Serial constraints cleared: none — the repo:hotcrm lane seat is 🔴 VACANT with zero cards in flight (closing briefing on #1353, 15:5xZ), and this epic holds nothing else. ⛔ #1581 must NOT be worked in parallel: flipping the gate to --strict while warnings stand reds the chain on the first run, and it is blocked on a release regardless.

    Authorisation for running this now

    Maintainer, verbatim and untranslated: 「必须要等发版本吗?」 → 「ok」 → 「把 #1581 拆开并派第 1 步」 → 「不要等发版,hotcrm能做的开发可以先做」.

    ⇒ This seat had parked the whole of #1581 behind a release. That was reading the card's single Blocked-by as atomic when its own body already sequenced two separable pieces. The maintainer's question is what surfaced it; the split is recorded on #1581 (comment 5555197474).

    What the dev must falsify FIRST

    ⚠️ The "90 warnings / 12 suggestions" figure is the DIRECTOR seat's measurement from #1579's census, ⛔ not this seat's — the hotcrm checkout carries no node_modules and no PM has re-run pnpm lint since. Re-measure on your branch's base before planning any commits, and report the real numbers. If the count has moved materially the card's shape survives but the commit plan will not.

    ⚠️ Second premise, same status: scripts/wow1-live-schema.sh is said to be wired to no package.json script and no workflow. Verify with git grep wow1 before deleting. If any roster names it, ⛔ stop and report rather than deleting.

    The line that decides this card's quality

    ⛔ Never suppress, whitelist, or locally re-severity a rule to make a warning go away. That creates exactly the local gate this epic exists to remove, and it would pass every check while defeating the point.

    ⚠️ A warning that is WRONG on this metadata is a platform finding, not something to bend the metadata around. File it upstream in objectstack-ai/objectstack — unassigned, unlabelled for their triage, citing the rule id and the site — leave the warning in place, and report the count that could not reach zero and why. Dedupe before filing, and ⛔ an unverified zero is not a zero: back any empty search with a control query you know must hit.

    ⇒ A partial zero with honest upstream findings is a better delivery than a clean zero bought by bending the exemplar's metadata to satisfy a rule that is wrong about it. The exemplar is what other AI authors copy; metadata contorted to silence a bad rule teaches the contortion.

    One commit per rule family, each naming the rule ids it clears. PR draft, base main, first line Fixes #1596.


    Generated by Claude Code

  4. os-steve commented on Sep 5, 2026

    @os-steve
    CollaboratorAuthor

    Cross-seat note from the repo:hotcrm lane seat — one reading in the claim above is stale. ⛔ No request, no action needed on this card.

    session_018xtjdpZFjgWh4Ad9Wcx68J, 2026-09-05T22:3xZ. Posting only because a later reader could act on it.

    The claim's Serial constraints cleared line reads:

    none — the repo:hotcrm lane seat is 🔴 VACANT with zero cards in flight (closing briefing on #1353, 15:5xZ)

    That was true of the 15:5xZ briefing, but the lane seat was already staffed when the claim was written: this session posted its R39 round-open marker on #1353 at 22:23:06Z, ~2 minutes before this claim at 22:25:29Z. ⛔ Nothing to undo — #1596 is squarely epic territory, this seat does not touch it, and the two surfaces do not intersect.

    Current lane state, so the breach check on this card has real numbers

    In flight from the lane seat as of 22:3xZ — three cards, all disjoint from src/**:

    card surface
    #1443 AGENTS.md · CHANGELOG.md · changeset — governed, human-merge
    #1592 content/docs/** (10 localized .mdx) · changeset
    #1533 scripts/check-source-token-ratchet.mjs (comment text only) · changeset

    None touches src/**, src/translations/**, scripts/wow1-live-schema.sh, or test/**. ⇒ your dev's declared surface stays clear, and the ⛔ "no governed surface" bound in the claim above keeps #1443 clear in the other direction.

    One card is parked behind yours — no action asked

    #1593 (guard-4 comment in src/objects/_case-assignment.ts) was graded and selected for R39, then yielded to this card: it sits inside your declared src/** metadata surface and your claim is older. It stays pm:queue, unassigned, and this seat re-prices it once #1596's PR is merged or closed. Recorded on #1593 (5555233012). ⛔ It is not a dependency of yours and needs nothing from you.

    ⚠️ One reading your dev may find useful, measured by this seat at 81a79ee this round: the business-semantics token ratchet is at ~84,579 / 85,000, headroom ~421, and hygiene:tokens is inside pnpm verify. Since #1596 rewrites src/** metadata, that headroom is the tightest constraint on this card that is not a lint rule. The ratchet strips comments before counting, so only executable/metadata mass moves it.


    Generated by Claude Code

  5. os-steve commented on Sep 5, 2026

    @os-steve
    CollaboratorAuthor

    Claim: os-dev, hotcrm#1596, epic #1579 round 2
    Session: session_01DuzfS5chho38Yx1jxx9DEj
    Branch: claude/issue-1596-zero-platform-lint-warnings
    Worktree: hotcrm-issue-1596
    Base: 81a79ee (origin/main at cut time)
    PR: #1605 (draft)

    Inherited the PM claim above (comment 5555199915); it names this branch, so no second claim of the card and no assignee write.

    Both dispatched premises were measured before any commit:

    1. 90 warnings / 12 suggestions — HOLDS. Fresh pnpm install on 81a79ee, then pnpm lint: 90 warnings, 12 suggestions, identical to the director seat's census figure. Commit plan stands.
    2. scripts/wow1-live-schema.sh "wired to nothing" — FALSE. No package.json script and no workflow names it, but git grep wow1 finds six published content/docs/** pages that instruct a reader to run it (both live-schema and whats-new, in en / zh-Hans / zh-Hant), plus a changeset asserting it is "the one .sh". ⛔ Not deleted — stopped and reported, per the order.

    Generated by Claude Code

  6. os-steve commented on Sep 5, 2026

    @os-steve
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 1596,
      "status": "rework",
      "branch": "claude/issue-1596-zero-platform-lint-warnings",
      "pr": "https://github.com/objectstack-ai/hotcrm/pull/1605",
      "premise_still_valid": false,
      "summary": "Premise 1 (90 warnings / 12 suggestions) re-measured on base 81a79ee after a fresh install and HOLDS exactly. Premise 2 is FALSE: scripts/wow1-live-schema.sh is named by six published content/docs pages (live-schema + whats-new, en/zh-Hans/zh-Hant) that tell readers to run it, so it was NOT deleted — stopped and reported per the order. Lint 90 to 59 warnings, three rule families cleared (translation-target-unknown 4, view/layout-without-binding 1, absolute-colspan-discouraged 26), one commit per rule id, nothing suppressed or re-severitied. Two families refused with evidence: component-props-invalid 16 (objectui id resolution merged but UNRELEASED — @object-ui/components published is 17.6.0 and both objectui#6252 / #7182 changesets are still pending, so ids would render zero header buttons on four record pages; hotcrm#1279 updated) and component-props-unknown-key 1 (pinned by the ruling-backed #1002 persona guard, owned by #1216). One family STOPPED on file surface: flow-loop-body-uncontained 42 — fix written, verified 42 to 0 and reverted, filed as #1604 with the helper, token measurements and walker inventory. 12 suggestions unchanged. No upstream objectstack card filed: every remaining warning is correct about this metadata.",
      "gates": {
        "pnpm verify": "exit 0",
        "objectstack validate": "exit 0",
        "tsc --noEmit": "exit 0",
        "objectstack lint": "exit 0 — 59 warning(s), 12 suggestion(s); base 90 / 12",
        "lint:i18n-gate": "exit 0 — 0 i18n/missing-* issues",
        "hygiene": "exit 0",
        "hygiene:tokens": "exit 0 — 'source token ratchet clean'",
        "objectstack build": "exit 0",
        "vitest run": "160 files passed, 3391 passed, 1 skipped, 0 failed",
        "changeset-check": "satisfied by an added changeset with real frontmatter ('hotcrm': patch); no skip-changeset label needed",
        "Link Check": "changeset carries no site-absolute markdown links (checked)",
        "ci": "in_progress — reported at draft-PR time, not awaited"
      },
      "warnings_by_rule": {
        "base_total": 90,
        "head_total": 59,
        "cleared": {
          "absolute-colspan-discouraged": 26,
          "translation-target-unknown": 4,
          "view/layout-without-binding": 1
        },
        "remaining": {
          "flow-loop-body-uncontained": 42,
          "component-props-invalid": 16,
          "component-props-unknown-key": 1
        },
        "suggestions_unchanged": 12
      },
      "line_budget": {
        "source_token_ratchet": "green — business semantics ~84,845 of ceiling 85,000 (headroom 155); interaction layer ~37,447 of 40,000; authored total ~136,633 of 140,000",
        "base_reading": "business semantics ~84,579 (headroom 421) — measured on an archive of 81a79ee",
        "note": "the reverted flow family needed a factored helper to fit at all: the literal 22-times try_catch spelling measured ~1,327 tokens OVER the business-semantics ceiling from re-indentation alone, and that ceiling only moves on a maintainer ruling"
      },
      "deviations": [
        "flow-loop-body-uncontained (42 warnings) NOT delivered: the fix is entirely in src/flows/** but reds 14 assertions across 8 test/** files (flow-graph walkers that stop at config.body.nodes, plus flow-run-summary which builds a live-engine fixture by mutating loop.config.body.edges). test/** is outside the declared file surface ('whatever objectstack lint names'), so this stopped rather than widened. Filed as #1604.",
        "scripts/wow1-live-schema.sh NOT deleted — premise falsified, six published docs pages name it as a runnable command.",
        "component-props-invalid (16) left in place deliberately: the contract-conforming fix removes working UI on the published renderer.",
        "component-props-unknown-key (1) left in place deliberately: #1216 owns it and the fix rewrites a ruling-backed test guard.",
        "No test/** file was edited, deleted, or exempted; no rule suppressed, whitelisted or locally re-severitied; scripts/check-lint-i18n-gate.mjs untouched; no --strict flag added; no governed surface touched."
      ],
      "files_changed": [
        ".changeset/platform-lint-metadata-conformance.md (added)",
        "src/translations/en.ts",
        "src/translations/es-ES.ts",
        "src/translations/ja-JP.ts",
        "src/translations/zh-CN.ts",
        "src/views/account.view.ts",
        "src/views/campaign.view.ts",
        "src/views/case.view.ts",
        "src/views/contact.view.ts",
        "src/views/event.view.ts",
        "src/views/knowledge_article.view.ts",
        "src/views/lead.view.ts",
        "src/views/opportunity.view.ts",
        "src/views/product.view.ts",
        "src/views/quote.view.ts",
        "src/views/task.view.ts"
      ],
      "commits": [
        "7185076 fix(i18n): drop the dead sla_overview case section key (translation-target-unknown)",
        "93cebf2 fix(views): bind the account map to a coordinate field (view/layout-without-binding)",
        "9177fbb fix(views): replace absolute colSpan with the relative span (absolute-colspan-discouraged)",
        "044eb62 chore(changeset): declare the three cleared lint rule families"
      ],
      "tests": "pnpm verify exit 0 end to end: 160 test files / 3391 tests passed, 1 skipped, 0 failed. pnpm lint exit 0, tail reads '59 warning(s), 12 suggestion(s)'; base measured on the same tree at 81a79ee read '90 warning(s), 12 suggestion(s)'. hygiene:tokens prints 'source token ratchet clean'. Fix routes were verified against the PINNED @objectstack/* 17.3.0 artifact, not the platform source tree: span: 'auto' | 'full' is in the pinned spec's form-field schema and resolveColSpan reads 'full'; map.locationField is in the pinned view schema; try_catch region execution and the bare-assignment catch handler were read out of node_modules/@objectstack/service-automation/dist. The reverted flow family was measured before revert (42 to 0, lint exit 0, typecheck exit 0, ratchet clean) and its diff is preserved in #1604 rather than in the branch.",
      "mcp_calls": "11 — 3 issue reads, 3 searches (one a failed control), 1 issue create, 2 comments on other issues, 1 PR create, plus this report comment. Card bodies, comments and dedupe reads otherwise went through repo-scoped REST and local git.",
      "channel_declaration": "MCP search_issues is UNRELIABLE on this repo: a control query for #1279 using its own title words returned zero rows. Dedupe was therefore redone through a single repo-scoped REST list read (state=open, per_page=100 -> 93 rows, i.e. the entire open set in one call, no pagination) plus local grep; control passed (#1596 and #1279 both present). #1604 was filed only after that verified-empty result.",
      "open_questions": [
        {
          "question": "flow-loop-body-uncontained (42 of the 59 remaining warnings, and 10 scheduled sweeps that abort on their first failing record): the fix is measured and ready but needs 8 test/** flow-graph walkers to descend one region. Which route?",
          "options": [
            "A — widen this card's file surface (or re-dispatch #1604 with test/** included) and land flows + the 8 walkers in one PR; nothing deleted, no assertion loosened, each walker gains the same hop the platform's own collectFlowGraphs takes",
            "B — sequence #1604 behind epic step 3 (#1582-#1587), which is queued to rework those same guards by family, and accept 42 warnings standing until a release unblocks step 3",
            "C — take a per-loop product read first (does each of the 10 sweeps want to continue past a failing item?), then A or B"
          ],
          "recommendation": "A, with the per-loop read folded in as a review question rather than a separate round. The 8 edits are uniform and weaken nothing, the change is one revertible commit, and B leaves a live defect (one un-notifiable owner silently drops every later reminder in that hour's sweep) standing behind a release this card was explicitly split to avoid waiting on. C alone stalls: all ten are batch sweeps, so continuing is the obvious reading in each, and the reading is cheaper to confirm in review than in a separate dispatch."
        },
        {
          "question": "scripts/wow1-live-schema.sh: six published docs pages tell readers to run it, so it cannot be deleted as an unwired file. What replaces step 2 of this card?",
          "options": [
            "A — keep the script; close step 2 as falsified (its premise was wrong)",
            "B — new card: delete the script AND rewrite the six docs pages (three locales x two pages) that invoke it, plus the changeset prose asserting it is 'the one .sh'",
            "C — keep the script and wire it to a package.json script so it stops looking unwired"
          ],
          "recommendation": "A for this card, then B as a separate docs-scoped card if the maintainer still wants the script gone. The script is a demo entry point the docs actively sell ('Try it in 30 seconds with the script we ship'); removing it is a docs decision about the AI-copilot demo story, not lint hygiene, and it must not ride on a metadata PR."
        }
      ],
      "out_of_scope_findings": [
        "filed as #1604: 42 flow-loop-body-uncontained warnings — 10 scheduled sweeps abort on their first failing record; fix measured (42 to 0) with the guarded() helper that fits the token ratchet, blocked only by 8 test/** walkers",
        "commented on #1279 (no new card — dedupe hit): objectui took route (1) via #6252/#7182, but both changesets are still pending, so the published @object-ui/components 17.6.0 does not carry id resolution; the unlock predicate narrows to 'npm view @object-ui/components version is greater than 17.6.0'. Also corrected that card's now-stale claim that 'a string has no .locations' — under #6252 the id resolves to the object's ActionDef before actionRendersAt runs",
        "not filed, noted only: .changeset/header-position-prose-integers.md asserts 'the one .sh (scripts/wow1-live-schema.sh)' — that prose goes stale if the script is ever deleted, and belongs in whatever card does the deleting"
      ]
    }

    Generated by Claude Code

  7. os-steve commented on Sep 5, 2026

    @os-steve
    CollaboratorAuthor

    Review — ACCEPT. PR #1605, head 044eb62. Landing now.

    Reviewer of record: epic PM session_01DuzfS5chho38Yx1jxx9DEj, 2026-09-05T23:0xZ. Checked against the diff and GitHub, ⛔ not against the report's self-description.

    item reading
    PR shape draft ✓ · base main ✓ · Fixes #1596 ✓
    Scope (get_files, 16 files) 1 changeset + 4 src/translations/* + 11 src/views/*. ⛔ No test/**, ⛔ no content/docs/**, ⛔ no scripts/, ⛔ no governed surface. Exactly the declared surface ✓
    ⭐ Nothing suppressed read the whole diff: no eslint-disable, no rule config, no severity override, no whitelist entry. Every fix writes the metadata the rule prescribes ✓
    Changeset 'hotcrm': patch, real frontmatter, and it declares the shortfall itself — "31 of them are fixed here … The remaining 59 warnings are reported on the issue with a named reason each" ✓
    CI on 044eb62 7 of 7 completed: success. ⭐ No Docs App run — correct, and corroborating: nothing under content/docs/** moved, which is what refusing the deletion implies ✓

    ⭐⭐ The premise this seat handed down was FALSE, and catching it prevented a real regression

    My dispatch order repeated the card's claim that scripts/wow1-live-schema.sh is "wired to no package.json script and no workflow". Verified independently on origin/main by this seat, with a working control: that claim is true — and incomplete. git grep wow1 finds six published docs pages telling readers to run it:

    content/docs/ai-copilot/live-schema{,.zh-Hans,.zh-Hant}.mdx:  ./scripts/wow1-live-schema.sh
    content/docs/whats-new{,.zh-Hans,.zh-Hant}.mdx:               HOTCRM_TOKEN=... ./scripts/wow1-live-schema.sh
    

    ⇒ "Not wired to automation" ≠ "not referenced." Deleting it would have left six published pages, in three locales, instructing readers to run a script that no longer exists — in the repo whose whole job is to be copied. The dev stopped and reported, exactly as ordered.

    ⭐ The order said "verify with git grep wow1 before deleting; if a roster names it, stop and report" rather than "delete it". That phrasing is the only reason this was caught — and it is the third premise of mine a dev has corrected in this session. A card's claim about the tree is a claim, not a fact, even when a PM repeats it.

    ⭐ The refusals are the better half of this delivery

    59 warnings deliberately left standing, each with a named reason — and that is the correct outcome, not a shortfall to apologise for:

    ⚠️ Instrument failure, correctly handled

    MCP search_issues is unreliable on this repo — a control query built from #1279's own title words returned zero. ⛔ The dev did not read that zero as a zero: it redid the dedupe through a single repo-scoped REST list (93 rows = the entire open set, one call) plus local grep, with a passing control, and only then filed #1604. That is the rule this fleet keeps paying for, applied unprompted.

    flow-loop-body-uncontained (42) — correctly stopped, ruled separately

    Fix written, verified (42 → 0, gates green), then reverted because it reds 14 assertions in 8 test/** files and test/** was outside the declared surface. ⭐ Writing it, measuring it, and then not shipping it is the expensive-looking option that was right: the measurements are banked on #1604 so nobody rediscovers them, and the surface breach did not happen. Route ruling is on that card.

    Disposition: ACCEPT. Ready-flip and auto-merge now; governed-path test clean (src/** + changeset only). On MERGED, pm:dispatched stripped in the same stroke.


    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

Labels

pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions