Skip to content

ci(gates): after #26444 made ten baselines one-sided, two ledgers stay two-sided and two comments still describe the old two-sided ratchet #26586

Closed

Description

@objectstack-fleet

Filing gate ①: findings with named locations, from the #26444 devx-half card thread (PR #26549, os-dev-report 6436508211, out_of_scope_findings). Filed by domain:devx seat 2 (#20163, session session_01Q4MDXRbEJCNdPAP4SiXwp9) before it stands down. ⛔ Not a claim. Part of #26444.

Findings (read on the #26549 branch; re-read on main before acting)

  1. Still two-sided: scripts/engine-double-contract.baseline.json and scripts/startup-registry-verdict.baseline.json. In their readers (check-engine-double-contract.mjs, check-startup-registry-verdict.mjs), a stale entry still reds, so deleting a listed file reds a PR that never touched the gate. They were not on test(floors): floors set at today's measured value and two-sided baselines red on every legitimate deletion — ui package counts in ~8 places, CLI command counts, catalog entries pinned 4×, slot-lookup-class baselines that fail on a decrease #26444's list. Wanted: the same treatment chore(scripts): ten ratchet baselines become one-sided — a decrease passes and is reported #26549 gave the other ten. A decrease passes and is reported, an increase reds, and a baselined entry still on disk that the run did not read is refused, so a dead scan stays red.
  2. Stale comment (governed, Tier H): .github/workflows/lint.yml around L4209 still calls the query-options test count decrease-only. After chore(scripts): ten ratchet baselines become one-sided — a decrease passes and is reported #26549 it is one-sided.
  3. Stale comment: packages/metadata-protocol/src/protocol.metadata-store-outage.test.ts:636–639 says the ledger and the code are pinned in both directions. Only one direction reds now.
  4. Note, no change asked: after chore(scripts): ten ratchet baselines become one-sided — a decrease passes and is reported #26549, a detector that is narrowed so that live counts fall no longer reds a production run; only the readers' self-tests catch it. Say whether that is acceptable or needs a guard.

Size: S–M (item 1 is the work; 2 and 3 are one-line comment edits, and 2 makes its PR Tier H). Clause-②: no. Metadata-protocol: none.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: audit line · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T09:53Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 · 2026-10-27T12:20Z
    Session: session_01JQwxbaFpnMwgpCgneKe2qS
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-ervpst (platform exception: this seat's container pushes only its own claude/project-thread-* branch; its previous PR #26650 merged)
    Worktree: objectstack-issue-26586
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: items 1 and 3 only. scripts/engine-double-contract.baseline.json, scripts/startup-registry-verdict.baseline.json, their readers scripts/check-engine-double-contract.mjs and scripts/check-startup-registry-verdict.mjs with their self-tests, and the comment at packages/metadata-protocol/src/protocol.metadata-store-outage.test.ts L636–639. The PR carries Refs #26586 (items 1, 3), not Fixes. Item 2 is in the governed .github/workflows/lint.yml (Tier H) and item 4 asks the maintainer for a ruling, so both stay on this card for the release note at landing; ⛔ no .github/** edit in this PR (stop on breach)
    Container & model: S–M, mode:subagent (in-seat and serial instead of a card thread: the account's 7-day usage reads allowed_warning, so the seat opens no new card thread, coordinator.md §六), model: default (dispatch-gates --tier: "no path-derived mandate … default opus"; the ceiling tier is out of quota for this account, quota exemption), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the two ratchet gates in scripts/ (this repo's devpath tooling) | no platform path: the readers are this repo's own | every PR author who deletes a listed file reds today without touching the gate; reached through PR #26549's out-of-scope findings
    Thread-read: 6438766369
    Premise: holds (no commit to either baseline, either reader, the outage test or lint.yml on origin/main since 09:00 UTC today, git log read at 4b7dbc4; PR #26549 is merged)
    Serial constraints cleared: none (no open PR touches either baseline, either reader or the outage test, read over all 16 open PRs' full file lists; #26337 touches scripts/engine-double-contract.pinned.json only, a different ledger of the same gate, so the dev leaves that file alone; no other devx seat is seated)


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26586,
      "status": "done",
      "branch": "claude/project-thread-ervpst",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26701",
      "session": "session_01JQwxbaFpnMwgpCgneKe2qS",
      "premise_still_valid": true,
      "summary": "Items 1 and 3 only, per the claim's file surface. Item 1: scripts/engine-double-contract.baseline.json and scripts/startup-registry-verdict.baseline.json are now one-sided in their readers, the same treatment PR #26549 gave the other ten — a decrease (a fallen count, a file with nothing unguarded left, an entry whose finding or double is gone) passes and is printed, an increase or a new unledgered finding still reds, and a baselined entry whose file is still on disk that the run never read is refused, so a dead scan stays red. Each comparison moved into a pure function (reconcileDebtLedger; reconcileLedger + unreadBaselined) that the self-tests drive in both directions, with new floored batteries (11 and 8 cases; roster floors 33->34 and 18->19). Header invariants and both baselines' $comment blocks that called the ratchet two-sided were rewritten. Item 3: the comment at packages/metadata-protocol/src/protocol.metadata-store-outage.test.ts L636-639 no longer says the durability ledger and code are pinned in both directions (comment-only). Items 2 (governed lint.yml) and 4 (maintainer ruling) stay on the card, stated in the PR body.",
      "tests": "node scripts/check-engine-double-contract.mjs --self-test :: exit 0 (new 11-case ONE-SIDED battery; verdict line reached). node scripts/check-engine-double-contract.mjs :: exit 0 — 'check-engine-double-contract: OK — 1091 pinned, 120 in the DEBT ledger, 3 exempt.' node scripts/check-startup-registry-verdict.mjs --self-test :: exit 0 — '18 analysis case(s) + the dead-root hard error (red when the scan root is renamed, green when restored) + the one-sided ledger (8 case(s)) all passed'. node scripts/check-startup-registry-verdict.mjs :: exit 0 — '46 startup/open-registry seam(s) across 3585 file(s), 39 read-only (legal)'. pnpm --filter @objectstack/metadata-protocol exec vitest run --maxWorkers=2 src/protocol.metadata-store-outage.test.ts, under os-verify-lock.sh (VERDICT command-exit 0) :: Test Files 1 passed (1), Tests 32 passed (32). PREMISE on base fe53769a: deleting the ledgered packages/cli/src/commands/serve-email-appname-precedence.test.ts redded check-engine-double-contract (exit 1, two RECONCILED errors), and an injected stale key redded check-startup-registry-verdict (exit 1, '1 stale baseline entr(ies)'). ACCEPTANCE on head 36c37411: the same deletion -> exit 0 with 'DEBT ledger: 2 (file, verb) entr(ies) fell (passing, reported)'; the file copied to a new path -> exit 1 (two PINNED); a stale row for a gone file and for a file the walk reads -> exit 0, reported with a down arrow; a new init() cache probe that warns, written into packages/core/src -> exit 1. DEAD SCAN, mutated for one run through node scripts/ablation-replace.mjs (anchor hit verified, restore proved blob == HEAD with an empty git diff HEAD): the discovery walk made to skip any 'commands' directory -> exit 1 with four UNREAD findings; collectSourceFiles made to skip 'core' with a row injected under packages/core/src -> exit 1 with the unread-on-disk refusal. No ablation of tested behaviour was needed beyond these: the diff changes no package's runtime behaviour. No package test exercises either script — the eight *.test.ts files naming one of them mention it in comments only, and none asserts behaviour this PR changes.",
      "gates": "Local derived subset: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 69 families over the 5 changed paths; each ran with its exit captured before any pipe (redirect first, then EXIT=$?). 66 exited 0 — among them pnpm check:engine-double-contract, pnpm check:startup-registry-verdict, pnpm check:durability-log-level, pnpm check:objectql-double-limit, pnpm check:ratchet-remedy-authority, pnpm check:entry-guard, pnpm check:doc-authoring, pnpm check:scripts-symbol-anchors, node scripts/check-self-test-wired.mjs (+ --self-test). 3 exited 3 = PREREQUISITE NOT MET, read as NOT MEASURED, not red: node scripts/check-plugin-teardown-shape.mjs --self-test (its positive-control fixture is pinned to a commit this shallow checkout cannot reach; git rev-parse --is-shallow-repository is true), pnpm check:dual-build-cjs-loads (reads built output; 72 packages have no dist/ here), pnpm check:lean-entry-closure (own self-test passed, 22 cases; the gate then refused on a missing packages/objectql/dist/core.mjs). node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE, each line recorded as the command plus its exit code, printed: '69 derived famil(ies) accounted for — 66 run, 3 NOT-MEASURED (3 DERIVED from a recorded exit 3)', 0 UNRUN. The union ran on the final commit 36c37411. Local-only families not owed: the diff touches neither packages/spec's build nor a four-axis frame file. Repo-wide scans (pnpm lint first) and the whole farm are CI's run. PR check-runs: NOT MEASURED at report time — the report is delivered when local verification finished; 'Lint & Repo Gates' is the reading of record for both gates on PR #26701.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay, one stroke: pr_create draft + assignees + labels, read back 13151/13151 bytes identical), POST /repos/objectstack-ai/objectstack/dispatches (the same relay for this report comment). Card reads were single-card GET /repos/.../issues/26586 and /comments.",
      "open_questions": [
        {
          "question": "Item 4 (no change made): after the one-sided move, a detector narrowed so that live counts fall no longer reds a production run. For these two gates, is the 'unread baselined entry on disk is refused' arm enough, or does the narrowing axis need its own guard?",
          "options": [
            "A — accept as is: UNREAD covers a lost CORPUS, and for engine-double the DISCOVERED zero-check plus the population floors (discoveredFiles >= 700 of 1119 read today, pinnedRows >= 600 of 1000) cover a recognizer narrowing beyond ~37%/40%; smaller narrowings rest on the self-test batteries.",
            "B — add a measured floor to check-startup-registry-verdict, which has none (46 seams today, 39 read-only) and an empty ledger, so its whole narrowing axis rests on its 18 self-test rows."
          ],
          "recommendation": "A for engine-double, which already carries both guards. For startup-registry-verdict a floor would be invented rather than measured at this population size, so if the maintainer wants that axis covered it is its own card with a measurement, not a number chosen here."
        }
      ],
      "out_of_scope_findings": [
        "carrier: #26586 · noted, not filed — item 2, the stale 'decrease-only' comment at .github/workflows/lint.yml around L4209, is untouched: governed Tier H, excluded from this PR's file surface by the dispatch. It stays on the card.",
        "carrier: none · noted, not filed — scripts/check-engine-double-contract.mjs L2869: the ratchet-remedy authority docblock says 'RECONCILED tells the author to DELETE or lower an entry, which is the ratchet tightening and squarely the author's job'. Still true (the instruction is unchanged), but the message is now a passing report rather than an error; left as is because pnpm check:ratchet-remedy-authority passes and rewording it is prose outside the two-sided claims the card names. class: observation, not one of the three filing classes."
      ]
    }
  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26701 comment 6443521901


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #26701 (items 1, 3), merged as 8366f3ea64 · 2026-10-27T14:44Z
    Release: session_01JQwxbaFpnMwgpCgneKe2qS (domain:devx#1) · partial landing, so the card goes back to pm:queue with no assignee · landed: items 1 and 3 · remaining: item 2 (the stale "decrease-only" comment in the governed .github/workflows/lint.yml ~L4209, Tier H, so its PR lands only with a GOVERNED_APPROVERS approval) and item 4 (the maintainer's ruling on whether a narrowed detector whose live counts fall may pass a production run; the measured reading for both gates is in PR #26701's Acceptance notes and os-dev report 6443005642)

    Both ledgers are one-sided on origin/main now. A decrease passes and is reported, growth reds, and an entry whose file is on disk but unread reds as UNREAD. ACCEPT → PR #26701 comment 6443521901.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 · item 2 · 2026-10-28T05:31Z
    Session: session_01QSeKYmTYfaPbLQD4BJfomW (dispatching seat; the cloud session is named in the dispatch note under this claim)
    Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-26586-lint-ratchet-comment
    Worktree: the cloud session's own container
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: item 2 only. The stale "decrease-only" wording in the comment above the Engine query-options erasure ratchet step in .github/workflows/lint.yml (L4191 at origin/main 69df290ea5) is reworded to the one-sided ratchet #26549 made it: an increase reds, a decrease passes and is reported. Comment text only: ⛔ no step, if:, command or other comment changes. Items 1 and 3 landed via #26701; item 4 is a note that asks for no change and stays on the card. PR Fixes #26586. Tier H (.github/workflows/**): lands with a GOVERNED_APPROVERS approval or the maintainer's hand (stop on breach; explain in the report)
    Container & model: S, mode:cloud, model: TIER_DEFAULT (dispatch-gates --tier: "no path-derived mandate"), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — stale comment, no behaviour
    Thread-read: 6445021850
    Premise: holds at origin/main 69df290ea5. lint.yml L4191 still reads "plus one aggregate decrease-only number for test code".
    Serial constraints cleared: open PRs #27067 (L5584–5640) and #27085 (L27–50) touch lint.yml in other hunks; whichever lands second merges main.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch note · devx seat 2 · 2026-10-28T05:35Z

    Claim 6461491597 dispatched to cloud session session_01QSeKYpxei8vxY22nkCLVj1, outcome branch claude/issue-26586-lint-ratchet-comment.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26586,
      "status": "done",
      "branch": "claude/issue-26586-lint-ratchet-comment",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27115",
      "session": "session_01QSeKYpxei8vxY22nkCLVj1",
      "premise_still_valid": true,
      "summary": "Item 2 only. The comment above the `Engine query-options erasure ratchet` step in .github/workflows/lint.yml (L4191-4195 now) no longer calls the aggregate test-code number decrease-only; it says what scripts/check-query-options-erasure-ratchet.mjs does since #26549: growth past the ceiling reds, a fall passes and is reported, a fall to zero is refused as a dead scan. Comment text only (5 lines replace 3); no step, if:, command or other comment touched; item 4 untouched. Draft PR #27115, Fixes #26586, Tier H: lands only with a GOVERNED_APPROVERS approval or the maintainer's hand.",
      "tests": "No tests: comment-only workflow edit. Reader proof on origin/main 76e90df6, scripts/check-query-options-erasure-ratchet.mjs: L280 diffRatchet errors when testSites > testCeiling ('test surface grew'); L320 ratchetDownReport adds a passing line when testSites < testCeiling, printed at L1197 under 'decrease(s) (passing, reported)'; L228 testSurfaceCollapse refuses ceiling>0 with 0 sites, main path exit 2 (L1184-1186). PR #26549's diff (REST /pulls/26549/files) removes the old 'else if (testSites < testCeiling)' error branch ('ratchet DOWN') and the self-test row expecting 1 error for a test-surface shrink. YAML: yaml.safe_load on new file vs HEAD before commit -> parsed ok, semantically identical: True; git diff -U0 non-comment changed lines: none.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack :: exit 0, 42 commands (1 path, 8 changed lines). All 42 run twice, each exit captured before any pipe: on 9be4825d (pre-merge) 42/42 exit 0; on final head 5a94fec3 (after merging origin/main, no rebase/force) 42/42 exit 0, incl. pnpm check:pm-dispatch-gates :: exit 0 ('1935 cases pass', 381.0s). --ran with ':: exit N' records :: exit 0, 'Run reconciliation — 42 derived, 42 run, 0 NOT-MEASURED, 0 UNRUN ... a DERIVED zero'. 6 workflow-valued families (required-contexts --verify-required-set, shard-attestation emit/verify) NOT MEASURED locally: take values only a CI run has; left to PR check-runs. CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called (only the pull_request_read schema was loaded via ToolSearch; never invoked). Reads went via unauthenticated REST GET.",
      "api_writes": "2 — (1) POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/fleet-write/dispatch.mjs, relay run 40643616203 success: pr_create #27115 (draft) + assignee os-justin + label skip-changeset, body read back 5833/5833 bytes identical; (2) this os-dev-report comment via scripts/pm/post-stamped.mjs on #26586. git push (2 pushes to claude/issue-26586-lint-ratchet-comment) not counted as REST.",
      "open_questions": [
        {
          "question": "Wording choice: should the comment also name the zero-collapse dead-scan refusal, or only the increase/decrease asymmetry the card named?",
          "options": [
            "A keep it: the refusal is part of the one-sided behaviour of that number and a reader of 'a fall passes' would otherwise expect a fall to 0 to pass",
            "B trim to 'growth reds, a fall passes and is reported'"
          ],
          "recommendation": "A, because it describes what the code does (L228/L1184) and costs one clause; trimming makes the comment wrong for the zero case"
        },
        {
          "question": "Deviation: the guard-main-checkout hook blocked editing the primary checkout although it sat on the designated branch. I created worktree ../objectstack-issue-26586 on local branch wt/issue-26586 off origin/main 76e90df6 and pushed HEAD:claude/issue-26586-lint-ratchet-comment. Also: commit uses AGENTS.md's model-free trailer pair rather than the harness's model-named Co-Authored-By line.",
          "options": [
            "A accept as recorded",
            "B rename locally (cosmetic only)"
          ],
          "recommendation": "A, because the remote branch is exactly the designated one and the trailers follow AGENTS.md, which outranks the harness reminder"
        }
      ],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: item 2 via PR #27115, merged as a98daf75f4 by os-zhuang (GOVERNED_APPROVERS, APPROVED on 5a94fec320) · 2026-10-28T06:57Z

    The merged diff matches the reviewed head 5a94fec320: the sorted +/− lines are hash-identical (1 file, +5/−3, comment only). ACCEPT → PR #27115 comment 6462444455. Contract review PASS → 6462431405.

    With items 1 and 3 (#26701) and item 2 (this PR), every change the card asked for has landed. Item 4 asked a question; the seat record answers it from the reader's testSurfaceCollapse guard. Fixes closed the card, and pm:dispatched is removed in this act.


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions