Skip to content

The dissolved #5499 investment freeze is still spelled as LIVE in pm-dispatch references and two in-code pin annotations — same staleness class #12672 fixed, wider radius #13089

Closed

Description

@os-litant

Found while implementing #12672 (which fixed ONLY the SKILL.md domain-lane row, per its dispatch scope — PR #13085). The same dissolved freeze (maintainer 2026-08-05; dissolved 2026-08-11 by the two rulings recorded on the #5499 anchor, comments 5249019855 and 5252526378, the second also retiring the standing hold-on-filing triage rule) is still asserted as live in four more places:

  1. .claude/skills/pm-dispatch/references/lanes/engine.md lines 20-24, 常设承诺 — outright false now: 「维护者 2026-08-05 对 driver-memory / driver-mongodb 族的投入冻结继续有效;能穿过冻结的形状是「消除静默失败模式」与清账/对齐既有能力,形如能力投资的卡派发前须取裁决」. This is the lane brief PMs scope dispatches from — the exact defect class that cost the 4+ rounds pm-dispatch SKILL.md's engine-lane row still records the driver-memory/driver-mongodb investment freeze as live — dissolved 2026-08-11, and the stale line seeded a wrong hold and a wrong dispatch brief #12672 recorded. Fixing it needs one judgment call, which is why it was not ridden in-place on PR docs(pm-dispatch): drop the dissolved engine-lane investment-freeze parenthetical #13085: does the "capability-investment cards need a ruling before dispatch" clause survive the lift, given the second 2026-08-11 ruling retired the hold-on-filing rule? The drop-vs-reword choice mirrors the one the PM already made for SKILL.md (drop; the anchor carries its own history).

  2. .claude/skills/pm-dispatch/references/compile-surfaces.md line 17, the 「冻结」 row: 「维护者 2026-08-05 投入冻结:pin-annotate,不翻转。冻结面仍要申报,结论是「不在范围 + 冻结指令」」. The table's own maintenance clause three lines below says the PR that changes freeze status must update this table — the lift PRs did not. Note the row's file pointer is doubly stale: it cites read-scope-sql.ts:176, and that file now lives at packages/services/service-analytics/src/read-scope-sql.ts (annotation now at ~line 180).

  3. packages/objectql/src/having-filter.ts:41 (comment): "driver-memory / driver-mongodb still answer the old way only because [裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499 freezes them; the divergence is against a frozen face, not against the ruling." Present tense — the freeze no longer holds. Whether the two faces have since been aligned (post-lift, both drivers were enrolled in the aggregation conformance table per the head note of packages/spec/src/data/aggregation-conformance.ts) or the HAVING divergence still exists and now needs a real card instead of a freeze excuse — needs checking, and is exactly the kind of question the stale comment currently answers wrongly.

  4. packages/services/service-analytics/src/read-scope-sql.ts:180 (comment): "driver-mongodb stay pin-only under the [裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499 freeze." Same present-tense staleness.

Corroboration for the dissolution, on disk: head note of packages/spec/src/data/aggregation-conformance.ts ("the maintainer lifted the #5499 investment freeze for driver-mongodb on 2026-08-11 and for driver-memory later the same day").

Suggested shape: same DROP discipline as #12672 for sites 1-2 (dates + the anchor carry the history; ⛔ no issue numbers in the protocol files — id-lint), and for sites 3-4 re-verify what is actually true post-lift before rewording (the comments may be hiding a now-actionable divergence). Sites 1-2 are net-negative edits under the reference-file ratchets. #12672 is not addressed wider by this card; it remains scoped to the SKILL.md row and its PR.

Activity

  1. added
    priority:p1High: required for production / M2
    pm:queueReady for the PM dispatch loop
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Aug 29, 2026
  2. added theissue type on Aug 29, 2026
  3. huangyiirene commented on Aug 29, 2026

    @huangyiirene
    Collaborator

    分诊:pm:queue · domain:skills · priority:p1 · type Bug

    车道:按主要落点定,⛔ 未拆卡

    四个站点跨三个车道:站点 1-2 在 .claude/skills/pm-dispatch/references/**(skills);站点 3 在 packages/objectql(engine);站点 4 在 packages/services/service-analytics(services)。

    定 domain:skills,不拆,依据:

    ⛔ 给接手者的拆卡指令:先做站点 1-2(本卡的实质交付),再跑站点 3-4 的测量。若测出 HAVING 分歧在解冻后仍真实存在 ⇒ 停下,把它立成 domain:engine 的独立卡,⛔ 不要在本卡里顺手改那两条注释来掩盖一个可行动的分歧。若测出两面已对齐 ⇒ 注释改成过去时即可,可留在本卡。

    ⚠️ 治理面:PR 不能走队列

    站点 1-2 在 .claude/** 内 ⇒ 人工合并道(PASS + draft + 授权 approver 评审 + 状态评论)。这是本席位登记的第四张同类(#13034 · #13052 · #13071 · 本卡)。

    p1 的依据

    站点 1 是 PM 用来界定派发范围的车道简报,而它把一个 2026-08-11 已解除的冻结写成「继续有效」。⇒ 不是陈旧散文,是会主动误导路由的活文档。

    ⭐ 卡面点出这正是 #12672 记录的、已经付过 4+ 轮代价的同一失败类。第二次踩同一个坑,只是半径更大。

    站点 1 的那个判断题

    「形如能力投资的卡派发前须取裁决」这一条,在第二条 2026-08-11 裁决(退休了 hold-on-filing 分诊规则)之后是否存活 —— 卡面把它标为需要一次判断。

    ⭐ 先例已有:PM 对 SKILL.md 那一行做的选择是 DROP(锚点自带历史)。⇒ 同形同源,沿用即可;⛔ 若接手者认为该条应当保留而非丢弃,那是与既有先例相悖的判断,停下上报。

    ⛔ 另注:协议文件内不得写 issue 号(id-lint)—— 卡面已提醒,此处重申。


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    priority:p1High: required for production / M2
    pm:queueReady for the PM dispatch loop
    on Aug 29, 2026
  5. self-assigned this
    on Aug 29, 2026
  6. os-litant commented on Aug 29, 2026

    @os-litant
    ContributorAuthor

    Claim: skills 席派发认领(定级 MEDIUM-HIGH——同一失效冻结在 PM 定卡用的巷道简报里仍拼作「继续有效」,正是已付 4+ 轮的缺陷类的最大杠杆残留)。
    Session: session_01MnijPVVDakqK2J335JoJtq · Branch: claude/issue-13089-freeze-residue · Worktree: ../objectstack-13089-residue(dev 自建)
    File surface: references/lanes/engine.md L20-24 + references/compile-surfaces.md L17(含双重陈旧文件指针)+ 两处代码注释(objectql/having-filter.ts:41、service-analytics/read-scope-sql.ts:~180)。判断题 PM 先裁:沿 SKILL.md 先例取 DROP——冻结弹整体摘除(锚卡自载历史),「能力投资先取裁决」子句随冻结制度一并落幕(四棱框架本就把大投资路由维护者,无损失);compile-surfaces 冻结行按表自身维护条款改记解除 + 修正文件指针。代码注释改为陈述分歧自立(不再挂靠冻结)——纯注释,闭集免 changeset;跨巷道(engine/services 代码)注释性修正,本认领即跨座位声明,dev 若发现需动注释以外内容立即 STOP。
    Container & model: os-dev 子代理;references/** + 注释 ⇒ opus 执行。
    Clause-② limb: 不触发。
    Serial: 两 references 文件无占用;与 dispatch-runbook/platform-readings 队互不相交。


    Generated by Claude Code

  7. os-litant commented on Aug 29, 2026

    @os-litant
    ContributorAuthor

    os-dev-report

    {
      "issue": 13089,
      "status": "rework",
      "premise_still_valid": true,
      "branch": "claude/issue-13089-freeze-residue",
      "worktree": "/home/user/objectstack-13089-residue (removed at cleanup)",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/13169",
      "pr_url": "https://github.com/objectstack-ai/objectstack/pull/13169",
      "pr_number": 13169,
      "draft": true,
      "commit": "ec4c039ed",
      "merge_base": "56470d86b",
      "summary": "Dissolution verified on disk FIRST (aggregation-conformance.ts:141-143 head note: the maintainer lifted the #5499 investment freeze for driver-mongodb on 2026-08-11 and for driver-memory later the same day) — so the card's premise holds. Delivered sites 1-2 (the two pm-dispatch reference files) as a net -4-line docs commit. STOPPED on sites 3-4 (the two code comments) because the card's own triage made that conditional on a measurement, and the measurement came back positive: the HAVING null-safe-negation divergence is STILL REAL post-lift. status=rework marks the card as knowingly half-delivered, NOT a shortfall — the other half is now tracked as #13166 and needs a PM disposition call (see open_questions).",
      "sites": [
        {
          "site": 1,
          "path": ".claude/skills/pm-dispatch/references/lanes/engine.md",
          "lines_before": "21-24 (常设承诺 freeze bullet)",
          "action": "DROPPED entirely — pure drop per the SKILL.md precedent; the anchor carries its own history",
          "capability_investment_clause": "dropped WITH the freeze regime, as ruled — the retired hold-on-filing ruling covers it and the four-facet frame already routes big investments to the maintainer",
          "grammar_stub_needed": false,
          "net_lines": -4
        },
        {
          "site": 2,
          "path": ".claude/skills/pm-dispatch/references/compile-surfaces.md",
          "line": 17,
          "action": "FLIPPED, not dropped",
          "why_not_dropped": "post-dissolution the row inverted rather than became pointless — it used to say 'out of scope', and the fact a PM now needs is that these are ordinary declarable faces. Dropping would leave two faces unmentioned in a table whose job is exhaustiveness, and the table's own maintenance clause makes freeze-status changes its business.",
          "stale_pointer_fix": "the old 备注 pointed at freeze ANNOTATIONS (read-scope-sql.ts:176 — wrong path AND wrong line). Replaced with what the 落点 column means in every other row: packages/drivers/driver-memory/src/memory-matcher.ts:134 (checkCondition) and packages/drivers/driver-mongodb/src/mongodb-filter.ts:700 (translateFieldOperators), both verified in-tree. This also makes the row independent of the two in-code annotations, which are NOT fixed here.",
          "net_lines": 0,
          "row_bytes": "249 to 341 — under the file's 352 pin (row 16 is the widest), so the byte pin is untouched"
        },
        {
          "site": 3,
          "path": "packages/objectql/src/having-filter.ts:40-42",
          "action": "NOT TOUCHED — stopped per triage",
          "reason": "triage condition measured TRUE"
        },
        {
          "site": 4,
          "path": "packages/services/service-analytics/src/read-scope-sql.ts:179-180",
          "action": "NOT TOUCHED — stopped per triage",
          "reason": "same class as site 3; its factual claim (memory/mongodb have no undefined-comparand refusal) is still TRUE — only the cited CAUSE is stale"
        }
      ],
      "stopped": {
        "what": "sites 3-4, the two in-code pin annotations",
        "authority": "the triage comment on this card: 若测出 HAVING 分歧在解冻后仍真实存在 ⇒ 停下,把它立成 domain:engine 的独立卡,⛔ 不要在本卡里顺手改那两条注释来掩盖一个可行动的分歧",
        "measurement": "BY EXECUTION against memory-matcher.ts match() at 56470d86b, both readings of no-value. Ruling answer is ['2','3']. Measured: $ne OK both ways; $nin OK on null, ['2'] DIVERGENT on missing key; $notContains ['2'] DIVERGENT on BOTH. 3 of 6 cells diverge.",
        "verdict": "divergence STILL REAL post-lift ⇒ STOP condition holds",
        "filed_as": 13166,
        "bonus_finding": "the comment is also wrong in a way neither the card nor the dispatch anticipated: driver-mongodb is NOT divergent on this family and never was ($nin maps straight through; $notContains compiles to a $not/$regex, both matching a missing field). So 'the drivers answer the old way' could not have been past-tensed as written — it needed a fresh factual claim about WHICH face diverges, which is a content judgement belonging on the engine card. This is the strongest evidence the triage's STOP was the right call.",
        "harness": "deleted before the commit; tree carries no trace"
      },
      "ratchet": {
        "lanes/engine.md": "40 to 36 lines (net -4), ceiling 40, headroom 4 after; widest table row 0 bytes (pin 0)",
        "compile-surfaces.md": "26 to 26 lines (net 0), ceiling 26, headroom 0; widest table row 352 bytes (pin 352) UNCHANGED",
        "net_total_lines": -4,
        "rewrap_used_to_fund_anything": false,
        "ceiling_not_lowered": "lanes/engine.md left at ceiling 40 with 4 lines of headroom rather than lowered to 36. Lowering is 'legitimate and encouraged' by the ratchet's own discipline, but it edits scripts/pm/check-skill-line-ratchet.mjs, which would add that gate script's own test surface to a docs-only diff and fails the bounded-in-place-fix condition 'no new verification surface'. Flagged as an available follow-up, deliberately not ridden in."
      },
      "cut_ledger": [
        "lanes/engine.md:21-24, one bullet, 4 lines: (a) the standing claim that the maintainer's 2026-08-05 investment freeze on the driver-memory/driver-mongodb family 继续有效; (b) the enumeration of shapes allowed through it (消除静默失败模式, 清账/对齐既有能力); (c) the 形如能力投资的卡派发前须取裁决 clause; (d) the formula/driver-sql 不受影响 carve-out. Nothing cut is recoverable only from here — the anchor holds the regime's history, the four-facet frame holds the escalation rule.",
        "compile-surfaces.md:17, in-place row replacement, 0 net lines: dropped the pin-annotate-不翻转 instruction, the 不在范围+冻结指令 conclusion, and the doubly-stale annotation pointer."
      ],
      "gates": {
        "union_derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack — exit 0, change set read from git itself (2 paths vs merge base 56470d86b), 181 families discovered across 28 workflow files, 7 matched. --repo assertion held against this checkout's origin.",
        "run_at_commit": "ec4c039ed (final commit; union re-run after commit, exit codes captured by redirect-then-capture, never across a pipe)",
        "results": [
          "check:pm-skill-ratchet EXIT=0 — '✓ check-skill-line-ratchet: .../lanes/engine.md is 36 lines (ceiling 40; headroom 4).' and '.../compile-surfaces.md is 26 lines (ceiling 26; headroom 0).' and '.../compile-surfaces.md: widest table row is 352 bytes (pin 352; headroom 0).'",
          "check:pm-skill-id-lint EXIT=0 — '✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).'",
          "check:agent-test-spelling EXIT=0 — '✓ check-agent-test-spelling: 0 violations — 398 file(s)'",
          "check:doc-authoring EXIT=0 — '✓ doc authoring guard: 392 files clean — no bare metadata literals.'",
          "check:pm-governed-merges EXIT=0 — '✓ check-governed-merges --self-test: 206 assertions' + 'live: the real generator declared 9 output(s) and certified this tree'",
          "check:skill-frame-sync EXIT=0 — '✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files'",
          "@objectstack/lint check:doc-formula-expressions EXIT=0 — '✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 425 files / 1453 TS blocks judged clean'",
          "check:nul-bytes EXIT=0 — 'check-nul-bytes: OK (scanned 7294 text file(s) ... no raw ASCII control bytes).'"
        ],
        "not_measured_note": "check:doc-formula-expressions first exited 1 twice with 'PREREQUISITE NOT MET — the workspace package @objectstack/formula (then @objectstack/lint) is not built'. Reported as NOT MEASURED, not as a red gate: it exits before running a check. Both packages were built under the shared verify lock and the gate then ran green — that is the reading above.",
        "no_ts_package_gates": "the derivation confirms only 2 paths changed, both .claude/**, so no TS package typecheck/test family applies. Had sites 3-4 landed, the objectql and service-analytics families would have been owed."
      },
      "tests": "No product-code change, so no product test is owed. The load-bearing run was the MEASUREMENT for sites 3-4: a temporary vitest harness in driver-memory asserting the ruling answer ['2','3'] so a divergence prints the measured value in the diff. Dependency closure built first (pnpm --filter '@objectstack/driver-memory^...' build, VERDICT command-exit 0, 171s under the lock) — without that the run would have measured stale dist. Result: 'Test Files 1 failed (1) / Tests 3 failed | 3 passed (6)', the three failures being $notContains on a null value, $notContains on a missing key, and $nin on a missing key, each 'expected [ '2' ] to deeply equal [ '2', '3' ]'. Harness deleted before commit; git status clean and git diff HEAD empty afterwards, verified by observing state rather than by reading an exit code. All heavy runs went through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=dev-13089; every VERDICT line was command-exit 0 and waited 0s (lock was free all run).",
      "changeset": "none — correct. Diff is entirely .claude/**, on the closed list. skip-changeset applied at PR open via MCP issue_write update (REST 403 on this seat), read-union-write-readback done: label set was EMPTY before, so union = {skip-changeset}; nothing could be stripped. Readback via the zero-quota page channel confirms the chip is present in js-issue-labels and nothing else was removed.",
      "mcp_calls": "9 — search_issues x1 (dedup), issue_write create x2 (13166, 13168), create_pull_request x1, update_pull_request x1, issue_write update x1 (label), issue_read get_labels x2 (BOTH failed: 'API rate limit already exceeded for user ID 314681334'), add_issue_comment x1 (this report). Channel switch DECLARED: repo-scoped REST returned HTTP 403 and gh is absent on this seat — the documented container-dev-seat form — so reads went to the zero-quota public-page JSON payload (issue body, comments, PR body, PR labels, draft state) and MCP was reserved for writes plus the one targeted dedup search.",
      "out_of_scope_findings": [
        "filed as #13166 (domain:engine): driver-memory's reference matcher still answers $notContains / $nin the pre-ruling way on a no-value row — the freeze that excused it is dissolved, so the divergence is now unexcused and untracked. This IS the sites 3-4 half, split out exactly as the triage directed.",
        "filed as #13168 (finding): the same dissolved freeze is asserted in the PRESENT TENSE at ~13 further in-code sites beyond this card's four. Classified into three kinds so a sweep does not flatten them: (A) ~9 plainly-false present-tense claims in objectql/runtime/spec; (B) THREE that are more than stale prose — filter-comparand-type.ts:29, filter-comparand-shape.ts:42 and filter-comparand-type-conformance.ts:29 use the freeze as the REASON a comparand policy 'cannot be grown per driver', i.e. a live design rationale on a now-void premise; (C) dated/historical records that are correct as they stand, incl. the ADR-0087 migration entries. Also flagged: packages/spec/src/migrations/registry.ts carries five of these strings but is GENERATED from entries/, so hand-editing it would be reverted and would trip check:migration-registry."
      ],
      "open_questions": [
        {
          "question": "The dispatch and the card's triage give OPPOSITE instructions for sites 3-4, and I followed the triage. The dispatch said 'rewrite each so the divergence stands on its own facts'; the triage said 'if the divergence is still real, STOP and file a domain:engine card, and do NOT rewrite those two comments here'. I measured the condition TRUE and stopped. Was that the right resolution?",
          "options": [
            "A — the triage wins (what I did): it is the more specific and more conservative instruction, its condition was explicitly conditional on a measurement I ran, and the measurement also showed the dispatch's premise ('the drivers answer the old way') is wrong about driver-mongodb, so the dispatch's rewrite was not executable as written.",
            "B — the dispatch wins: the PM's claim comment (06:35Z) post-dates the triage (05:27Z) and said 代码注释改为陈述分歧自立, so the PM had already overridden the triage; the two comments should be rewritten in this PR.",
            "C — split the difference: rewrite only site 4 (whose factual claim is still TRUE — memory/mongodb genuinely have no undefined-comparand refusal, only the cited CAUSE is stale) and leave site 3 to #13166."
          ],
          "recommendation": "A, because the dispatch's own wording presumed a fact the measurement falsified. 'The drivers answer the old way' is true of driver-memory's reference matcher and FALSE of driver-mongodb, so any honest rewrite had to make a new factual claim about which face diverges — a content judgement, not a citation removal. C is a defensible cheaper variant if you want site 4 closed out now; site 4 is the low-risk half."
        },
        {
          "question": "Disposition of #13089 itself. The PR is Part of, not a closing relation, so merging leaves it open. What should happen to it?",
          "options": [
            "A — close #13089 once this PR merges, on the grounds that sites 1-2 were its substantive half and sites 3-4 are now fully owned by #13166.",
            "B — keep #13089 open until #13166 lands, then close both.",
            "C — keep #13089 open and re-dispatch just the site-4 comment (the half whose facts did not change)."
          ],
          "recommendation": "A. #13166 carries the mechanism, the measurement and what a repair owes, so nothing is lost by closing 13089; leaving it open duplicates the engine card in the inbox. Note the triage recorded this as the seat's FOURTH governed-merge card, which is a governance-lane datum independent of this choice."
        }
      ],
      "notes": [
        "PR relation is 'Part of #13089', NOT the closing relation the dispatch specified. Deliberate: only 2 of the card's 4 sites landed, and a closing keyword would silently close the card on merge, losing sites 3-4 from the open-issue inbox.",
        "CAUGHT ON READ-BACK: my first PR body contained the literal closing-keyword spelling inside a sentence EXPLAINING why the relation is not that. GitHub's closing-keyword parser ignores the surrounding negation, so that would have closed the card on merge anyway — precisely the failure the dev brief warns about. Body was PATCHed to remove the literal; re-read from the public page confirms it is GONE and 'Part of #13089' is present.",
        "Commit subject deviates from the dispatch's dictated message: it says 'the lane brief and the compile table' and drops 'and two pin comments', because those two comments are not in the diff. A dictated message describing work that was deliberately not done would be false.",
        "FOOTER, platform behaviour worth recording: create() kept my bare footer AND appended a second one — a '---' plus the session-URL form. So the PR briefly carried TWO footers, and the '---' the dispatch forbade came from the platform, not from me. The later PATCH collapsed this to a single bare footer, matching the dispatch's requested shape. No footer was re-posted in a loop.",
        "Both MCP issue_read get_labels calls failed with 'API rate limit already exceeded for user ID 314681334' — a shared-identity quota condition, not an auth failure (writes in the same window succeeded). Label readback was completed through the zero-quota page channel instead. Flagging because a seat that cannot read labels cannot do a true read-union-write on a PR that already HAS labels; here the set was empty so the union was safe.",
        "Empty-branch push probe ran before the first edit and returned exit 0 — write routing confirmed at minute one.",
        "Worktree removed without --force after node_modules deletion; the shared checkout was never edited and git stash was never used."
      ]
    }

    Generated by Claude Code


    Generated by Claude Code

  8. os-litant commented on Aug 29, 2026

    @os-litant
    ContributorAuthor

    判决:ACCEPT(PR #13169,站点 1-2)。复审:engine.md 冻结弹纯摘(净 −4,头寸回 4)、compile-surfaces 行按表自身维护条款翻「已解冻」+ 双陈旧指针换成两处在树验证过的真实读点;id-lint 净、无重排筹行。
    开放题裁定:① 取 A —— 站点 3-4 的 STOP 正确。央审前置条件更具体且实测为真;且实测证明本席派发词的前提本身是错的(mongodb 在此族并不分歧、从来不曾),照令改写将写下新的错误事实——dev 停在了正确的地方,#13166 分立是对的。本席派发词与央审条件相抵未先调和,记自审一笔。② 取 A —— 本 PR 合并后关闭 #13089(completed):站点 3-4 的机制、实测与修复义务已完整住进 #13166(engine 巷道),留开只会重复收件箱。#13168(13 处残留三分类)留待央审/engine 巷道定级,⛔ 本席不越巷道抓取。
    PR 保持 draft、双推 os-zhuang + hotlong。批准钉 head 后翻 ready + 挂 auto-merge。


    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

domain:skillsDomain lane — seat card indexed by label:pm:seat

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions