You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[finding] A negated free-text phrase in search_pull_requests is silently dropped — -"Part of" and "Part of" return the identical result set, so a phrase-based partition reads as measured and is fabricated #12486
Filed unassigned while measuring the orphaned-card rate for #12436. ⛔ Not graded, ⛔ not claimed. Recording it because it produced a plausible, wrong number that would have shipped as a measurement.
The measurement
Three calls, same session, reproduced twice several minutes apart:
The positive and the negated phrase return the same count and the same top hit (PR #8475). 197 + 197 != 216, so the two are not a partition of anything — the leading - on a quoted phrase is dropped and both queries run as the same query.
Why this is worth a card rather than a shrug
The structured qualifiers in the same query string are honoured exactly: is:merged, head:, and -linked:issue all filter correctly, and linked:issue (2903) + -linked:issue (216) = 3119 = the unfiltered population, an exact partition. So a seat gets correct arithmetic from the qualifier half of the query and silent nonsense from the free-text half, in one call, with no error and no warning.
The failure mode is the species this lane keeps pricing: the instrument returns a number for the question it was asked, and the number is about a different question. In the case at hand it would have read as "19 of the 216 unlinked PRs carry no Part of, so ~19 orphans" — a fabricated stratum with a plausible magnitude, defensible-looking, and wrong. It was caught only because the two complementary queries were both run and their sum did not reconcile.
Probable mechanism, and the existing rows it sits next to
search_issues is documented as natural-language semantic matching, and search_pull_requests is documented as "issues search syntax". The reconciliation failure is consistent with the free-text portion never being matched literally at all — the phrase is embedded, not grepped, so its negation has nothing to negate. That is the same root already recorded for the sibling tool:
platform-readings.md carries rows on search_issues reliability (dedup, session-wide zeroing, minute-fresh cards) but no row saying free-text negation is inert, and none scoped to search_pull_requests. This is the missing row, not a duplicate of those.
The cheap discipline this suggests
Any stratification built on a free-text term needs its complement run and the two summed against the unfiltered population. If they do not reconcile, the text half is not filtering. The qualifier half can be trusted on its own arithmetic; the text half cannot be trusted at all.
Not proposed here, and deliberately not: whether the fix is a platform-readings row, a helper that refuses unreconciled partitions, or nothing. That is a grading call.
Skills-lane self-triage (session session_01MnijPVVDakqK2J335JoJtq): finding → promoted pm:queue. Graded disposition: a references/platform-readings.md row — free-text negation is silently dropped by search_pull_requests (the qualifier half of a query filters with exact arithmetic; the free-text half is semantic-only, so a negated phrase runs as the un-negated query); any stratification built on a free-text term requires its complement run and the two summed against the unfiltered population, else the text half is not filtering. The refusing-helper alternative is declined: a new tool for a surface with no measured pull is the startup-focus axis's textbook no. Joins the platform-readings fact-row fold (#12604#12534#12628 + this), opus, serial behind the in-flight chain headed by #12220.
Claim: PM loop round R1 W2 — family dispatch chain head (members: this card + #12534#12604#12628#12640)
Session: session_01MnijPVVDakqK2J335JoJtq
Branch: claude/issue-12486-platform-fact-rows (under mode:subagent the branch is the dev claim's distinguishing identity)
Worktree: objectstack-issue-12486
Domain: domain:skills
File surface: .claude/skills/pm-dispatch/references/platform-readings.md only (stop on breach; explain in the report)
Container & model: M (5 folded fact rows, heavy compression accounting), mode:subagent, model: opus — this dispatch's node scripts/pm/dispatch-gates.mjs --tier (tree d79c6025f): "no path-derived mandate … floor sonnet · default opus · ceiling fable"; references carve-out applies, seat review runs at the contract-review tier.
Clause-②: no — fact-table rows; no contract accept/reject behaviour change, no public surface widened.
Serial constraints cleared: the chain that held this file MERGED 2026-08-27T03:06:30Z; no open PR touches platform-readings.md (walked at dispatch time); lane in-flight this wave (instruction-text fold; patrol-row card) is disjoint. ⚠️ Read-coupling: the merged chain reshaped this file's mergeable_state / update_pull_request / draft-dequeue rows and spent its cut ledger — new rows integrate WITH that landed text (the enqueue-instrument row sits beside, not against, the reshaped rows), ⛔ never undo a landed cut.
Fold gates: ① one family — five measured platform facts each becoming a fact-table row (search free-text negation inert; enqueue instrument = timeline primary / webhook corroboration / auto_merge unstable; session proxy repo-scoped 403 clean-zero; tier-quota third death shape + per-path mandate re-derivation; issue_read get_labels issue-only); ② no Blocked-by: among members; ③ all five graded pm:queue by this seat's recorded self-triage; ④ one branch, one worktree, container M; per-member commits + one Fixes line per member; ⑤ exclusions named: the instruction-text fold (clause edits on other files), the patrol-row and attribution-rendering cards (scripts, not fact rows).
Ratchet reading (live, tree d79c6025f): platform-readings.md 314/314, headroom 0, table-row pin 0 — five new rows are paid entirely by same-file compression with cut-ledger rows naming surviving homes; ⛔ no re-wrap; if honest compression cannot fund all five, land the fundable subset and report the remainder with the blocking reading — ⛔ do not force cuts that orphan rules.
{
"issue": 12486,
"status": "done",
"branch": "claude/issue-12486-platform-fact-rows",
"pr": "https://github.com/objectstack-ai/objectstack/pull/12659",
"premise_still_valid": true,
"summary": "Family dispatch, all five members landed on one branch, one commit each, in this order: 12486 (free-text negation inert in search_pull_requests, 5 new lines), 12534 (enqueue instrument: timeline primary with the why, webhook push-only corroboration, auto_merge false-negative AND unstable; the existing timeline row 4 to 8 lines), 12604 (session proxy repo-scoped only, /search 403 body parses as a clean zero, positive control runs FIRST; 5 new lines, placed so the zeroing row's 'see next row' pointer resolves), 12628 (tier-quota termination as a third death shape, and per-file-surface mandate re-derivation; 2 rows, 8 lines), 12640 (issue_read get_labels is Issue-type only, PR labels via pull_request_read get; 3 lines). File surface stayed platform-readings.md only; nothing else was touched. The ratchet was at 314/314 with zero headroom, so all 25 added lines were paid by 20 content cuts in the same file, each cut naming where its content survives (full ledger in the PR body). No re-wrapping was used as funding: one rerun_failed_jobs re-wrap was tried, recognised as re-wrap rather than compression, reverted, and replaced with a real redundancy cut. The just-merged protocol-hardening reshaping of the mergeable_state / update_pull_request / draft-dequeue rows was left intact; the enqueue row sits beside it and no landed cut was reopened. One honest discrepancy, disclosed in the PR body rather than rewritten: the first commit's message records the gh-clause cut as 7 to 5; the diff says 7 to 6. The per-row figures in the PR ledger are re-derived from git diff -U0 hunk headers, not from editing notes, which is what caught it; the branch is never force-pushed so the correction lives in the PR body and here.",
"tests": "Derived union, not recalled: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack with NO paths. First run warned STALE TREE (6 commits behind, and check-governed-merges.mjs itself stale), so origin/main was fetched and merged in and the derivation re-run clean. Change set it derived: exactly 1 path, platform-readings.md. Eight families named; all runs at branch head 887592d04 (also the merge commit), the same tree the final commit produced. Serialised through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=dev-12486; exit codes captured by redirect-then-capture, never across a pipe (the wrapper itself refused to certify one early pipeline attempt and printed the batch-last-exit warning, which is why the runs below are '&&'-joined). Gate verdict lines, quoted from the gates: 'check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 314 lines (ceiling 314; headroom 0)'; 'widest table row is 0 bytes (pin 0; headroom 0)'; 'check-skill-line-ratchet self-test: 111 cases pass'; 'check-skill-id-lint: 22 file(s) clean (pattern /#[0-9]{3,}/g)'; 'check-agent-test-spelling: 0 violations - 386 file(s)'; 'doc authoring guard: 390 files clean'; 'doc authoring guard: 48 published skill files clean'; 'check-governed-merges --self-test: 193 assertions'; 'check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files'; 'check:doc-formula-expressions: 22 record-scoped formula example(s) across 422 files / 1450 TS blocks judged clean'. TWO results are NOT MEASURED and are reported as such, not as green and not as red: (1) check:doc-formula-expressions first answered PREREQUISITE NOT MET twice in a row (@objectstack/formula not built, then @objectstack/lint not built) - each time the gate exited before running a single check; both packages were built and the gate then produced the real verdict quoted above. (2) scripts/pm/check-governed-queue-guard.mjs cannot run here at all: it reads GITHUB_EVENT_PATH and refuses without a workflow event payload, saying 'could not look must never exit 0 here'. That is a declared CI-only input, so CI owns that family. DECLARED NARROWING: the repo-wide pnpm lint sweep was not run locally - the derived union above is the local scope, and CI runs the whole farm exactly once regardless. No ablation was involved in this card (documentation rows only), so no mutation/restore legs are claimed. Byte hygiene: grep -naP for control bytes over the edited file and over the PR body found none; every line is within the 120-byte budget, verified byte-accurately under LC_ALL=C rather than by character count.",
"mcp_calls": "18 - ten card reads (get + get_comments for each of the five members), create_pull_request, two pull_request_read get (PR body read-back to the tail, then the label read-back), one issue_write update for the label, two search_issues (one control that fired plus one duplicate check), and this report comment plus its read-back. The container REST channel was probed first with a real repo-scoped read and answered 403 'GitHub access is not enabled for this session' - the whole class, exactly the recorded shape - so the additive label POST was unreachable and the label went through the declared MCP fallback: read current labels, union, whole-set write, mandatory read-back. Read-back returned labels ['skip-changeset'], which also re-confirmed row 5's own claim live: pull_request_read get carries the labels array for a PR, and it was absent from the response while the set was empty.",
"open_questions": [],
"out_of_scope_findings": [
"NOT filed, already open as #12514: the nine packages/spec gate families whose declared path populations no longer exist in the tree (dispatch-gates prints them on every run as 'THE LAYOUT MOVED ... a real miss, worth triaging'). Duplicate check ran on the MCP channel with a positive control first - the control fired, then the real query returned #12514 as an exact match, with #12568 (closed) carrying the diagnosed mechanism. No new card opened."
]
}
ACCEPT — family chain head, all five members (this card + #12534#12604#12628#12640) — PR #12659 (reviewer of record: skills seat, session session_01MnijPVVDakqK2J335JoJtq, contract-review tier).
Verified against GitHub and the tree, not the report's narrative — review worktree at head 887592d04: ① ratchet re-run by this seat: platform-readings 314/314, table-row pin 0 held; id-lint 22 files clean; ② all five rows confirmed present by direct read, and the enqueue-instrument row matches the graded (self-corrected) shape exactly — timeline decisive and re-readable, webhook push-only corroboration ⛔ never the decision basis, auto_merge upgraded to UNSTABLE; ③ the 20-cut ledger's figures are re-derived from diff hunk headers, which caught and disclosed the one commit-message discrepancy (7→6, not 7→5) instead of rewriting history — the right treatment; the attempted-then-reverted re-wrap on the gh clause, replaced by a real redundancy cut, is the no-re-wrap rule followed under pressure rather than around it; ④ PR shape: base main, five Fixes lines, exactly one file +117/−117, skip-changeset correct; the just-landed protocol-hardening cuts are intact (none reopened). One state note recorded rather than acted on: the PR reads ready — this seat never flipped it and the dev delivered it draft; per the never-revert-another-actor's-flip rule (which this wave itself landed), the flip stands as presumed maintainer action, and review is requested rather than the bit touched.
Governed surface ⇒ review requested from the maintainer; merge remains the maintainer's.
Activity
os-litant commentedon Aug 27, 2026
Skills-lane self-triage (session
session_01MnijPVVDakqK2J335JoJtq):finding→ promotedpm:queue. Graded disposition: areferences/platform-readings.mdrow — free-text negation is silently dropped bysearch_pull_requests(the qualifier half of a query filters with exact arithmetic; the free-text half is semantic-only, so a negated phrase runs as the un-negated query); any stratification built on a free-text term requires its complement run and the two summed against the unfiltered population, else the text half is not filtering. The refusing-helper alternative is declined: a new tool for a surface with no measured pull is the startup-focus axis's textbook no. Joins the platform-readings fact-row fold (#12604 #12534 #12628 + this), opus, serial behind the in-flight chain headed by #12220.Generated by Claude Code
os-litant commentedon Aug 27, 2026
Claim: PM loop round R1 W2 — family dispatch chain head (members: this card + #12534 #12604 #12628 #12640)⚠️ Read-coupling: the merged chain reshaped this file's mergeable_state / update_pull_request / draft-dequeue rows and spent its cut ledger — new rows integrate WITH that landed text (the enqueue-instrument row sits beside, not against, the reshaped rows), ⛔ never undo a landed cut.
Session:
session_01MnijPVVDakqK2J335JoJtqBranch:
claude/issue-12486-platform-fact-rows(undermode:subagentthe branch is the dev claim's distinguishing identity)Worktree:
objectstack-issue-12486Domain:
domain:skillsFile surface:
.claude/skills/pm-dispatch/references/platform-readings.mdonly (stop on breach; explain in the report)Container & model: M (5 folded fact rows, heavy compression accounting),
mode:subagent,model: opus— this dispatch'snode scripts/pm/dispatch-gates.mjs --tier(treed79c6025f): "no path-derived mandate … floor sonnet · default opus · ceiling fable"; references carve-out applies, seat review runs at the contract-review tier.Clause-②: no — fact-table rows; no contract accept/reject behaviour change, no public surface widened.
Serial constraints cleared: the chain that held this file MERGED 2026-08-27T03:06:30Z; no open PR touches
platform-readings.md(walked at dispatch time); lane in-flight this wave (instruction-text fold; patrol-row card) is disjoint.Fold gates: ① one family — five measured platform facts each becoming a fact-table row (search free-text negation inert; enqueue instrument = timeline primary / webhook corroboration / auto_merge unstable; session proxy repo-scoped 403 clean-zero; tier-quota third death shape + per-path mandate re-derivation;
issue_read get_labelsissue-only); ② noBlocked-by:among members; ③ all five gradedpm:queueby this seat's recorded self-triage; ④ one branch, one worktree, container M; per-member commits + oneFixesline per member; ⑤ exclusions named: the instruction-text fold (clause edits on other files), the patrol-row and attribution-rendering cards (scripts, not fact rows).Ratchet reading (live, tree
d79c6025f): platform-readings.md 314/314, headroom 0, table-row pin 0 — five new rows are paid entirely by same-file compression with cut-ledger rows naming surviving homes; ⛔ no re-wrap; if honest compression cannot fund all five, land the fundable subset and report the remainder with the blocking reading — ⛔ do not force cuts that orphan rules.Generated by Claude Code
os-litant commentedon Aug 27, 2026
os-dev-report
{ "issue": 12486, "status": "done", "branch": "claude/issue-12486-platform-fact-rows", "pr": "https://github.com/objectstack-ai/objectstack/pull/12659", "premise_still_valid": true, "summary": "Family dispatch, all five members landed on one branch, one commit each, in this order: 12486 (free-text negation inert in search_pull_requests, 5 new lines), 12534 (enqueue instrument: timeline primary with the why, webhook push-only corroboration, auto_merge false-negative AND unstable; the existing timeline row 4 to 8 lines), 12604 (session proxy repo-scoped only, /search 403 body parses as a clean zero, positive control runs FIRST; 5 new lines, placed so the zeroing row's 'see next row' pointer resolves), 12628 (tier-quota termination as a third death shape, and per-file-surface mandate re-derivation; 2 rows, 8 lines), 12640 (issue_read get_labels is Issue-type only, PR labels via pull_request_read get; 3 lines). File surface stayed platform-readings.md only; nothing else was touched. The ratchet was at 314/314 with zero headroom, so all 25 added lines were paid by 20 content cuts in the same file, each cut naming where its content survives (full ledger in the PR body). No re-wrapping was used as funding: one rerun_failed_jobs re-wrap was tried, recognised as re-wrap rather than compression, reverted, and replaced with a real redundancy cut. The just-merged protocol-hardening reshaping of the mergeable_state / update_pull_request / draft-dequeue rows was left intact; the enqueue row sits beside it and no landed cut was reopened. One honest discrepancy, disclosed in the PR body rather than rewritten: the first commit's message records the gh-clause cut as 7 to 5; the diff says 7 to 6. The per-row figures in the PR ledger are re-derived from git diff -U0 hunk headers, not from editing notes, which is what caught it; the branch is never force-pushed so the correction lives in the PR body and here.", "tests": "Derived union, not recalled: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack with NO paths. First run warned STALE TREE (6 commits behind, and check-governed-merges.mjs itself stale), so origin/main was fetched and merged in and the derivation re-run clean. Change set it derived: exactly 1 path, platform-readings.md. Eight families named; all runs at branch head 887592d04 (also the merge commit), the same tree the final commit produced. Serialised through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=dev-12486; exit codes captured by redirect-then-capture, never across a pipe (the wrapper itself refused to certify one early pipeline attempt and printed the batch-last-exit warning, which is why the runs below are '&&'-joined). Gate verdict lines, quoted from the gates: 'check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 314 lines (ceiling 314; headroom 0)'; 'widest table row is 0 bytes (pin 0; headroom 0)'; 'check-skill-line-ratchet self-test: 111 cases pass'; 'check-skill-id-lint: 22 file(s) clean (pattern /#[0-9]{3,}/g)'; 'check-agent-test-spelling: 0 violations - 386 file(s)'; 'doc authoring guard: 390 files clean'; 'doc authoring guard: 48 published skill files clean'; 'check-governed-merges --self-test: 193 assertions'; 'check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files'; 'check:doc-formula-expressions: 22 record-scoped formula example(s) across 422 files / 1450 TS blocks judged clean'. TWO results are NOT MEASURED and are reported as such, not as green and not as red: (1) check:doc-formula-expressions first answered PREREQUISITE NOT MET twice in a row (@objectstack/formula not built, then @objectstack/lint not built) - each time the gate exited before running a single check; both packages were built and the gate then produced the real verdict quoted above. (2) scripts/pm/check-governed-queue-guard.mjs cannot run here at all: it reads GITHUB_EVENT_PATH and refuses without a workflow event payload, saying 'could not look must never exit 0 here'. That is a declared CI-only input, so CI owns that family. DECLARED NARROWING: the repo-wide pnpm lint sweep was not run locally - the derived union above is the local scope, and CI runs the whole farm exactly once regardless. No ablation was involved in this card (documentation rows only), so no mutation/restore legs are claimed. Byte hygiene: grep -naP for control bytes over the edited file and over the PR body found none; every line is within the 120-byte budget, verified byte-accurately under LC_ALL=C rather than by character count.", "mcp_calls": "18 - ten card reads (get + get_comments for each of the five members), create_pull_request, two pull_request_read get (PR body read-back to the tail, then the label read-back), one issue_write update for the label, two search_issues (one control that fired plus one duplicate check), and this report comment plus its read-back. The container REST channel was probed first with a real repo-scoped read and answered 403 'GitHub access is not enabled for this session' - the whole class, exactly the recorded shape - so the additive label POST was unreachable and the label went through the declared MCP fallback: read current labels, union, whole-set write, mandatory read-back. Read-back returned labels ['skip-changeset'], which also re-confirmed row 5's own claim live: pull_request_read get carries the labels array for a PR, and it was absent from the response while the set was empty.", "open_questions": [], "out_of_scope_findings": [ "NOT filed, already open as #12514: the nine packages/spec gate families whose declared path populations no longer exist in the tree (dispatch-gates prints them on every run as 'THE LAYOUT MOVED ... a real miss, worth triaging'). Duplicate check ran on the MCP channel with a positive control first - the control fired, then the real query returned #12514 as an exact match, with #12568 (closed) carrying the diagnosed mechanism. No new card opened." ] }Generated by Claude Code
os-litant commentedon Aug 27, 2026
ACCEPT — family chain head, all five members (this card + #12534 #12604 #12628 #12640) — PR #12659 (reviewer of record: skills seat, session
session_01MnijPVVDakqK2J335JoJtq, contract-review tier).Verified against GitHub and the tree, not the report's narrative — review worktree at head
887592d04: ① ratchet re-run by this seat: platform-readings 314/314, table-row pin 0 held; id-lint 22 files clean; ② all five rows confirmed present by direct read, and the enqueue-instrument row matches the graded (self-corrected) shape exactly — timeline decisive and re-readable, webhook push-only corroboration ⛔ never the decision basis,auto_mergeupgraded to UNSTABLE; ③ the 20-cut ledger's figures are re-derived from diff hunk headers, which caught and disclosed the one commit-message discrepancy (7→6, not 7→5) instead of rewriting history — the right treatment; the attempted-then-reverted re-wrap on the gh clause, replaced by a real redundancy cut, is the no-re-wrap rule followed under pressure rather than around it; ④ PR shape: basemain, fiveFixeslines, exactly one file +117/−117,skip-changesetcorrect; the just-landed protocol-hardening cuts are intact (none reopened). One state note recorded rather than acted on: the PR reads ready — this seat never flipped it and the dev delivered it draft; per the never-revert-another-actor's-flip rule (which this wave itself landed), the flip stands as presumed maintainer action, and review is requested rather than the bit touched.Governed surface ⇒ review requested from the maintainer; merge remains the maintainer's.
Generated by Claude Code