Repository navigation
qa(checklist): clauses for three round-3 defects outside the ledger, plus two RUNNER rules — a pin scores only the layer it drives, and an off-clause probe budget - #24811
Merged
objectstack-fleet[bot] merged 3 commits intoOct 20, 2026
Conversation
…dger, and two RUNNER rules api-backend.batch-transactional-discovery (empty-string batch id, #24781), records-forms.validation-rule-type-matrix (unevaluable warning rule logs a rejection, #24782; closes round 2's unevaluable-CEL fixture gap) and access-security.no-active-org-session-semantics (walled group leg, #24784; automated.ref names the layer its pin drives). Each clause stays red until its card's fix lands. RUNNER: rule 6 gains "a pin scores only the layer it drives", and rule 8 keeps an off-clause probe budget in every run. Claude-Session: https://claude.ai/code/session_01MRkuLGosywLTY6EMcP6fGK Co-authored-by: Claude <noreply@anthropic.com>
…ion clauses Both clauses stay red at a43405d, as their cards (#24781, #24782) are still open. The unevaluable-rule verify now reads each log entry to its end: the predicate evaluator's entry spans lines and its verdict follows the CEL caret excerpt. Claude-Session: https://claude.ai/code/session_01MRkuLGosywLTY6EMcP6fGK Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 20, 2026
Conflict in access-security.no-active-org-session-semantics only, both sides kept: round 11 of the wave anchor (#24801) rewrote knownGaps[0]-[4] and took revision 6; this branch's acceptance[7] gap follows them as knownGaps[5], and its history row moves to revision 7. Claude-Session: https://claude.ai/code/session_01MRkuLGosywLTY6EMcP6fGK Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对 — ACCEPT (#24802, head
|
objectstack-fleet
Bot
deleted the
claude/issue-24802-ledger-probe-rules
branch
October 20, 2026 08:38
This was referenced Oct 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #24802
Clause-②: no — the internal QA ledger and its runner protocol; nothing published
Summary
Three ledger clauses for the defects round 3 of the 18.0 sweep found outside the ledger, and two RUNNER rules. Each new clause carries a
QA-source:citation, arevisionbump, ahistoryrow, and aknownGapsline naming its card. Each stays red until that card's fix lands.api-backend.batch-transactional-discoveryrev 6 (rest: POST /api/v1/batch answers 500 for an update or delete op whose id is the empty string, where a missing id answers 400 VALIDATION_FAILED #24781). New acceptance[5]: anupdateordeleteop onPOST /api/v1/batchwhose id is the empty string answers 400VALIDATION_FAILED, the same as a missing id, and never a 5xx. Adds steps[6] (the empty-id pair plus their no-id controls) and negative[1]. Source: QA run QA run · surface:api (116/130) · 580fd4ed · 2026-10-20 · 62 PASS / 54 PARTIAL / 0 FAIL / 0 BLOCKED / 14 NOT-RUN #24779, observed beside the clauses.records-forms.validation-rule-type-matrixrev 5 (objectql(validation): an unevaluable severity:'warning' rule logs "write rejected: … fails closed" twice while the write is accepted 201 and persists #24782). New acceptance[5] (log oracle): an unevaluableseverity: 'warning'rule lets the write land, and no log entry naming the rule says the write was rejected or failed closed. fixtures.requires[2] carries round 3's recipe: two scratch objects authored throughPUT /api/v1/meta/object, each with a script ruleint(record.title) > 1, one atwarningand one aterror. That closes round 2's fixture gap (QA run QA run · records-forms (38/44) · ba4afcc2 · 2026-10-19 · 34 PASS / 2 PARTIAL / 2 FAIL / 0 BLOCKED / 6 NOT-RUN #24616: negative[0] blocked(fixture), "an unevaluable CEL validation cannot be authored through any door"). negative[0] now names its scratch object. Adds steps[6] and negative[3].access-security.no-active-org-session-semanticsrev 6 (group posture: a member whose session has no active organization gets 500 ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED on a tenant-scoped create, where isolated answers 403 naming the missing organization #24784). New acceptance[7], the walledgroupleg: a member whose membership set is non-empty and whose session has no active organization never gets a 5xx on a tenant-scoped create, and nothing is stamped with a NULLorganization_id. Whethergrouplands that write or refuses it 4xx is left to group posture: a member whose session has no active organization gets 500 ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED on a tenant-scoped create, where isolated answers 403 naming the missing organization #24784. Adds steps[8] (the set-active-null producer) and knownGaps[3].automated.refnow names the layer its pin drives.no-active-organization-write-refusal.test.tsruns SecurityPlugin's middleware over a stub terminal that stands in for the engine, so itsgroupCONTROL "lands" at the plugin-security layer only. The pin therefore cannot score acceptance[7].partialand names the missing layer. group posture: a member whose session has no active organization gets 500 ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED on a tenant-scoped create, where isolated answers 403 naming the missing organization #24784 is the worked instance. The paragraph sits beside rule 6, not inside the walled-boot entry.QA-source: … · observed beside the clauses. The run-record body contract gains the probe line: how long the probes took, what they covered, and what they found.Not in this PR: the
records-forms.record-discussion-mentionsclause for #24785. Its fix PR #24794 is still an open draft (checked just before this PR was opened). Under RUNNER rule 2 that clause would publish the reproduction before the fix ships, so it waits until #24794 merges.Out of scope, and not touched here: the round-3 re-points and accuracy findings in #24579 comment 6284472874. These include F3, the
groupwording of this item's acceptance[0] and [1] and its knownGaps[0] and [1] producers. They belong to the anchor lane.Verification
The clauses were run on a stock showcase at
a43405d596, this branch's base and currentorigin/main. The build waspnpm build --concurrency=2(76/76). The boot wasobjectstack dev --seed-admin, posturesingle, on a fresh DB. Server stopped by process group afterwards.DATABASE_ERROR"Internal data error"; no-id control 400VALIDATION_FAILED"Operation 'update' on 'showcase_task' requires an id"INTERNAL_ERROR; no-id control 400VALIDATION_FAILED. Log:[REST] Unhandled error: Error: Update requires an ID or options.multi=true(and the Delete twin)qa_unevaluable_warn, and both say "write rejected". The first ends "a rule that cannot be evaluated fails closed, it is never skipped" after a multi-line CEL caret excerpt, so the verify text now says to read each entry to its endVALIDATION_FAILED, fields[0]{field: _record, code: rule_violation}, re-read 0 rows@objectstack/organizations, owner email, membership policy). Its red rests on QA run #24783 and the RUNNER rule 7 re-derivation in #24784. Per the dispatch, written from knownGaps, not hand-testedThe red and green states match the cards: #24781, #24782 and #24784 are open.
Gates
On head
1143504b:node scripts/check-platform-checklist.mjs→ exit 0. Output:check-platform-checklist: OK — 16 areas, 328 items (323 active, 1 planned). It reports 0 line citations surviving and 943/953 symbol anchors resolved, the same counts as on base.node scripts/pm/dispatch-gates.mjs --commandsderived 13 commands, each run and each exit 0:node scripts/check-ci-filter-parity.mjs0node scripts/check-closing-keyword-parity.mjs0node scripts/check-closing-keyword-parity.mjs --self-test0node scripts/check-comment-mask-corpus.mjs0pnpm --filter @objectstack/lint run check:doc-formula-expressions0 (ran: the log ends with the checker's own summary)pnpm check:cross-package-test-inputs0pnpm check:doc-authoring0pnpm check:driver-memory-census0pnpm check:gitlink-declared0pnpm check:nul-bytes0pnpm check:platform-checklist0pnpm check:refd-timer-probe0pnpm check:watch-hint-literal0node scripts/pm/dispatch-gates.mjs --ran→ exit 0:13 derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED.coverage.jsonuntouched: the checker required no change.Acceptance notes
verifytext, as the existing api-backend clauses do ("step-7"). History rows use 0-based array indices ("steps[6]").580fd4edmeasurement and this PR's re-measurement ata43405d596. Each tells the runner to re-run the clause and drop the line once its card's fix merges.Generated by Claude Code