Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note by claude[bot] · Pull Request #13736 · objectstack-ai/objectstack · GitHub
Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note by claude[bot] · Pull Request #13736 · objectstack-ai/objectstack · GitHub
Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note by claude[bot] · Pull Request #13736 · objectstack-ai/objectstack · GitHub
Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note by claude[bot] · Pull Request #13736 · objectstack-ai/objectstack · GitHub
Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note by claude[bot] · Pull Request #13736 · objectstack-ai/objectstack · GitHub
Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note by claude[bot] · Pull Request #13736 · objectstack-ai/objectstack · GitHub
Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note by claude[bot] · Pull Request #13736 · objectstack-ai/objectstack · GitHub
Skip to content

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note - #13736

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count
Aug 31, 2026
Merged

fix(scripts): list the 17th error in @objectstack/formula's TEST_DEBT note#13736
os-project-manager merged 2 commits into
mainfrom
claude/issue-13631-formula-test-debt-count

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13631

The @objectstack/formulaTEST_DEBT entry recorded errors: 17 above a per-code tally
that summed to 16. Which of the two numbers was wrong was established by measurement, not
by picking the easier edit.

Which number was right: the recorded 17

The gate's own --re-measure was run, not replicated. Its refusal path (a ledgered
package whose dependency closure has no built type entry point) was cleared by building
the closure first, exactly as lint.yml does:

pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
pnpm check:type-check-debt
check-type-check-coverage --re-measure: OK — 29 ledger entr(ies) re-measured in 376.3s,
1542 raw tsc error(s) total, none above its recorded number.
surplus: none — every entry sits exactly at its measurement, so any new error is red.

surplus: none is the load-bearing line: every entry, this one included, measures
exactly its recorded number. So @objectstack/formula measures 17, the field was
right, and the tally was one line short.

The per-code breakdown was taken separately, through the gate's own measureTestDebt and
remeasureProject (a verbatim copy of the gate with a reporting block appended, so no
helper was re-implemented), at base cc837dbfec with the closure built:

TS2591 x6, TS2345 x3, TS2352 x3, TS1470 x2, TS2339 x2, TS2739 x1
SUM=17 measureTestDebt=17 RECORDED=17

The unlisted 17th is

packages/formula/src/cel-to-filter.test.ts(173,52): error TS2739: Type
'{ org_user_ids: never[]; }' is missing the following properties from type
'{ id: string; organization_id: string; org_user_ids: string[];
team_member_ids: string[]; department: string; }': id, organization_id,
team_member_ids, department

which reproduces the reporter's reading to the character position.

Why no gate had caught it

COMPOSITION (#10722) is the mechanical half that exists for exactly this shape — an
itemisation contradicting its own field. It reads tier itemisations
(code-tier / config-tier / noise) and, by an explicitly reasoned decision in its
own docblock, never sums per-code tallies, which are "partial by construction". This
entry's note is a pure per-code tally, so tierItemisation() returns null and the
entry is unguarded — measured in both directions, with a positive control proving the
probe was live:

[probe] OLD note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] NEW note -> null (no tier itemisation -> ENTRY UNGUARDED)
[probe] compositionProblems over the WHOLE live TEST_DEBT ledger -> []
[probe] POSITIVE CONTROL — a tier itemisation the same code DOES read
[probe] "code-tier 30, config-tier 25, noise 34." -> sum=89
[probe] contradicting tier note over errors:80 -> 1 problem(s)

That is a documented, deliberate false negative rather than a defect in the gate, and it
is not touched here. It is written into the corrected note so the next reader does not
mistake the entry's silence for a check.

The change

One TEST_DEBT entry's note. errors: 17 is untouched, no baseline moves, and the
entry is reflowed into the multi-line form its longer-noted siblings already use.

Gates

Derived from the real change set with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not from a hand-written list), re-derived after merging
origin/main so the answer comes from a tree at origin/main. All run at
a8a9374b6, exit codes captured before any pipe:

resultgate
0pnpm check:type-check-coverage
0pnpm check:type-check-debt (full --re-measure, 29 entries)
0pnpm check:pm-dispatch-gates
0node scripts/pm/bare-root-worklist.mjs --self-test
0pnpm check:agent-test-spelling
0pnpm check:bash32-floor
0pnpm check:cli-command-ids
0pnpm check:cross-package-test-inputs
0pnpm check:entry-guard
0pnpm check:parse-guard
0pnpm check:pnpm-filter-targets
0pnpm check:watch-hint-literal
0node scripts/check-ci-filter-parity.mjs
0node scripts/check-cross-package-test-inputs.mjs
0node scripts/check-shard-attestation.mjs
0pnpm lint (repo-wide, 108s — not narrowed)
0pnpm check:nul-bytes
NOT MEASUREDnode scripts/check-test-completeness.mjs

The last one exits 3 on its own documented PREREQUISITE NOT MET branch — it grades a
saved turbo run test log and the derived family names it with no argument. Its own text
rules that branch NOT MEASURED rather than red.

The two convention-triggered obligations for editing a gate script
(bare-root-worklist --self-test, check:pm-dispatch-gates) were run, not just the
path-derived families.

Changeset

None, and skip-changeset is applied. This PR releases nothing: the only file is a
repo gate script under the private root package @objectstack/spec-monorepo, and
scripts/ appears in no package's published files.

Generated by Claude Code


Generated by Claude Code

… note
The entry's per-code tally read TS2591 x6 + TS2345 x3 + TS2352 x3 +
TS1470 x2 + TS2339 x2 = 16 above a field recording 17. Re-measured
through the gate's own measureTestDebt at cc837db with the package's
closure built: it measures 17, so the count was right and the tally was
one line short. The unlisted one is TS2739 x1 at
src/cel-to-filter.test.ts(173,52), where the local ok() helper pins its
second argument to the exact shape of the module-level VARS.
COMPOSITION reads tier itemisations and never sums per-code tallies, so
nothing mechanical read the gap. No count moves, no baseline moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 31, 2026 09:06
@os-project-manager
os-project-manager added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 5604c44Aug 31, 2026
34 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-13631-formula-test-debt-count branch August 31, 2026 09:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The @objectstack/formula TEST_DEBT note itemises 16 errors against its own recorded count of 17 — the unlisted one is TS2739

2 participants

@os-project-manager@claude