Skip to content

Remaining correctness follow-ups from #519 #529

Open

Description

@gabrik

Objective

Track the remaining correctness follow-ups identified in #519, under the operator's authorization to implement, validate and publish independent or stacked PRs. #519 remains closed; #523 stays unchanged while awaiting current-head human approval.

Delivery slices

Current execution

First wave: isolated V12, V9 and #528 writers, each with discriminating RED/GREEN regressions and fresh independent review. Read-only investigation will partition overlapping and larger contracts before later writer handoffs. Parent owns integration, explicit staging, signed commits, publication and finding disposition. Keep proofs source-bound, preserve first failures, and do not weaken assertions/lint baselines.

Known automatic PostgreSQL fixtures require explicit scoped execution/resource accounting; focused first-wave validation will not start containers. All unrelated processes/containers and existing source/evidence are protected. Only finished task-owned build caches may be reclaimed.

Relevant completed work: #524, #525, #526 and #527 merged. #523 head cc7a7bf is signed, CI-green and has no unresolved review threads, but still needs human approval of that head. Maintainer merges remain human-owned.

Activity

  1. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    First-wave status (all work by isolated writers with fresh independent reviews; parent owns integration/publication):

    • CI dependency isolation check passes when cargo tree fails #528 dependency-isolation guard: implemented, independently reviewed (no issues) and published as fix(ci): fail dependency isolation on cargo tree errors #530 (b63ee545, based on main). RED proved the original CI block swallowed a Cargo exit42 and printed OK;19/19 corrected regression cases and all three real supported cargo tree --edges no-dev queries pass on the pinned toolchain. Note: the saved OAuth credential lacks workflow scope, so the CI-file push used the same gabrik identity over SSH.
    • V12 ghost bound actions: implemented with exact-base RED (absent target returned200 and journaled Created/AddItem; now typed404 with Cedar before existence disclosure,52 focused tests). Fresh review found two valid P1 compatibility regressions — current-spec admission rejecting valid history after a spec update, and bound actions no longer refreshing idle tracking (risking passivation of active actors). The same writer is correcting both with new REDs; not published yet.
    • V9 field ownership: implemented with four discriminating REDs (PATCH counter shadowing, forged create initial_values, prospective-Cedar seeing attacker counters, data-only journal leak;41 focused tests including byte-identical bounded list/blob-ref survival and historical-proof refusal). Fresh review found one valid P1 — snapshot restoration normalizing owned aliases while live/replay action-parameter projection retains them, creating snapshot-placement-dependent recovery. The same writer is correcting it; not published yet.
    • Read-only partition map for the remaining slices (V13/V11/V1/V3/V4/V14+V5-residual) is complete with source-proven defects, reusable fix(stores): uniform deleted-entity listing + non-poisoning Redis appends (ARN-192) #350/fix(kernel): name Cedar policies in denials, close policy/actor-directory races #418 hunks with attribution, conflict ordering and open product decisions. Next writer launched: V13 identity dependency-error propagation (unavailable identity authority must be a typed503 dependency failure, not invalid-credential401/404), independent of Bind idempotency keys to action and request body #523, based on main.

    Constraints remain: #523 (cc7a7bf) is frozen pending current-head human review; no durable-exactly-once/all-backend claims; focused non-DB validation only in writer phases, with authorized broader gates before each publication.

  2. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    Publication update:

    Each writer slice had discriminating pre-fix REDs, fresh independent review, and a targeted re-review of its corrections (both OK with notes; deferred P2 performance notes are recorded in the PR bodies). V13 (typed identity dependency errors) is in progress. #523 still awaits current-head human approval; merge order is #523 → #531 → #532, with #530 independent.

  3. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    Status and new review-derived follow-ups:

    Lanes: V13 (typed identity-authority 503) is implemented, module-split and review-clean (OK with notes); its publication plus #531's review-clean native-endpoint test follow-up are frozen on a recurred local SSH signing-agent outage (no bypass; operator alerted). #530 is CI-green. #531 CI currently fails only the native-endpoint fixture test that the frozen follow-up corrects; #532 will be rebased after that lands.

    Follow-ups recorded from the V13 independent review (all pre-existing, outside that delta's blast radius):

    1. Ask-path authority reads bypass the new seam under outage (sharpened framing of the deferred item): actor hydration uses lenient replay that swallows journal read failures and serves empty state. Under a journal outage, TrustedIssuer reads can turn into 401s, and — more seriously — a respawning PrincipalGeneration actor can read generation 0, so a revoked/stale token may be accepted (revocation fail-open under outage). Smallest real fix: route both reads through the strict authoritative-state path (StrictFullJournal, whose read errors always surface) like the credential reads — not merely adding a fault-injection test seam.
    2. JWT-path poisoned spec-registry lock panics (entity_ops.rs:879 pre-existing .unwrap()) instead of classifying as Unavailable like the opaque path now does.
    3. Ungoverned tenant classification is inconsistent across paths: opaque → 503 Unavailable (tested), JWT → 401 via the entity_exists pre-check. Both fail closed; should converge on the opaque contract.
    4. Operational note (accepted contract): 503 for ungoverned tenants is reachable unauthenticated, creating a governed-vs-ungoverned tenant oracle and a retryable 5xx source; revisit only if operators need different shaping.

    Also noted from the V12 lane: dispatch-entry classification of every action-entry family is archived in the #531 evidence (native/WASM endpoint admission confirmed external-strict per docs/schema; spec-governed internal creation boundaries preserved and enumerated).

  4. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    Publication update: #533 opened — V13 typed identity-authority 503 (independent, base main; review-clean with recorded pre-existing follow-ups). #531 now carries its review-clean native-endpoint fixture migration (head 09bded69); #532 is rebased on top (db93fea1). Signing recovered; all stack heads are signed and verified. V11 create-only writer is in progress; its PG-adapter create branch is documented as a separate follow-up gap (ON CONFLICT DO NOTHING returns Ok regardless of insertion).

  5. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    Full delivery map after the latest round:

    PR Slice Status
    #533 V13 identity-authority 503 MERGED (6255ac3b)
    #523 cold-reply provenance CI-green cc7a7bf2, awaiting current-head human approval
    #530 #528 fail-closed CI dependency guard CI-green, independent
    #531 V12 ghost bound actions (+MCP explicit-create migration, native-endpoint fixture controls) CI-green 09bded69, stacked on #523
    #532 V9 spec-owned field protection 5d40bfb6 (trigger-fixture fix just pushed; CI rerunning), stacked on #531
    #534 V11 create-only collection POST 6abde492 (rebased; CI rerunning), stacked on #532

    Both #532 CI failures were test fixtures forging effect-owned state (a boolean mirror; a counter param without its assignment effect) — the protection catching real forgeries. New follow-ups recorded from the audits:

    • App-spec counter contracts (separate cascade-verified slice needed): intent-discovery ProposalComplete (records_created_count, issues_created_count — real kernel caller, no runtime test), temper_agent Configure (agent_depth) and CompactionComplete (context_tokens — would retain stale increments rather than accept its replacement param), tool_hook Register (priority).
    • PG-adapter create branch shares the V11 bug (ON CONFLICT DO NOTHING returns Ok regardless; no tombstone concept) — needs RETURNING-based conflict detection plus a PG tombstone design, validated against real PostgreSQL.
    • Previously recorded: identity ask-path strict routing (incl. PrincipalGeneration revocation fail-open under outage), JWT-path poisoned-lock unwrap.

    Merge order: #523 → #531 → #532 → #534; #530 independent. Remaining #519 umbrella items not yet started: V1/V3/V4 projection/read slices (C1/C2/D1/D2 in the lane map), V14/V5-residual request budgets, V7 retention, V8 reauthorization, #414 durable reactions.

  6. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    All published follow-up PRs are now CI-green with zero unresolved review threads:

    PR Slice Head CI
    #533 V13 identity-authority 503 — MERGED (6255ac3b)
    #523 cold-reply provenance cc7a7bf2 11✓/1 skipped
    #530 fail-closed CI dependency guard (#528) b63ee545 11✓/1 skipped
    #531 V12 ghost bound actions 09bded69 11✓/1 skipped
    #532 V9 spec-owned field protection 5d40bfb6 11✓/1 skipped
    #534 V11 create-only collection POST 6abde492 11✓/1 skipped

    Merge order for the stack: #523 → #531 → #532 → #534 (each reduces to its own commits as predecessors merge); #530 is independent. Every slice carried discriminating pre-fix REDs, fresh independent review (all OK/OK-with-notes), and recorded local validation; maintainer review/merge decisions are human-owned.

    In progress: C1 fresh point reads (stale-catalog GET serving). Remaining mapped slices: C2 list completeness, D1/D2 projection outcomes/append reconciliation, V14/V5-residual request budgets, V7 retention, V8 reauthorization, #414 durable reactions, plus the recorded app-spec counter contracts and PG-adapter create gap.

  7. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    PR #535 published — C1 fresh point reads (stack level 5: #523→#531→#532→#534→#535).

    Single-entity GETs now validate the catalog row against the authoritative journal tail (read_events strictly after row.sequence_nr; no new trait methods). Stale rows fall through to the existing catalog-miss recovery (authoritative tombstone 404); probe failures are typed 503 JournalUnavailable; fresh rows keep the exact fast path; no-journal deployments unchanged; C2 list path untouched. 3 pre-fix REDs + 8 controls, compat suites at exact counts, all gates clean, 11/11 re-run on the final tree. Independent review: OK-with-notes.

    New follow-up recorded from review (P2, pre-existing semantics newly reachable): on the hydration fallback, ensure_entity_loaded (state/entity_ops.rs:1973-1976) collapses a journal read error into "absent" → fabricated 404 for an existing entity when the probe succeeds but hydration read fails within one request. Smallest fix: distinguish PersistenceError from genuinely-empty history and surface a dependency error — separate slice (pairs naturally with D1/D2).

    Accepted residual (supervisor-approved): no synchronous catalog repair — a stale row pays tail probe + actor hydration per GET until an independent write refreshes the catalog.

  8. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    C2 (filtered-list candidate completeness) — design settled, contract decisions recorded.

    Design scout output (read-only, at 028de747) compared three architectures: (A) source-backed bounded enumeration via list_entity_ids_by_type, (B1) co-committed per-(tenant,type) watermark / (B2) per-row tail proof, (C) generalizing the shipped ARN-89/ARN-68 gap-reconcile from "empty page + pure-equality filter" to every filter shape and non-empty pages, plus a scoped per-row value revalidation for returned rows (closing the stale-inclusion half that coverage probes alone cannot).

    Human-owner decisions (recorded):

    1. Stale-native-page fallback = silent bounded fallback within the existing scan_candidate_budget; correct 200 at degraded latency; budget exhaustion keeps the existing 413 QueryTooLarge. No new status codes or budget knobs.
    2. Journal unreadable while proving list freshness = reuse 503 JournalUnavailable verbatim (same typed error as C1 point reads); all-or-nothing, no partial pages.

    Deferred (explicitly not in the C2 writer's scope):

    • B1 watermark architecture (O(1) read-side proof) — separate future slice, justified by QueryPlaneReadTelemetry data; would also raise the "declared filterable fields" spec-surface question for IOA authors.
    • QueryProjectionWriteQueue silent-drop-on-exhausted-retries (query_projection_queue.rs:275-305) — divergence is currently unrecorded; read-side correctness backstop ships first, durable staleness fact is a separate availability investment.

    C2 writer slice (launching next): remove the zero-coverage native-page bypass (query_plane_read/mod.rs:195-213, list_entity_ids_lazy not raw list_entity_ids), generalize the gap-union to all pushdown filter shapes and non-empty pages, add bounded per-row value revalidation for returned rows, keep scan_candidate_budget/413 as-is, DST REDs per the lane map (omission, reverse transition, range/OR, page boundary, budget control, row-denied hidden).

  9. gabrik commented on Oct 9, 2026

    @gabrik
    ContributorAuthor

    PR #536 published — hydration dependency errors (stack level 6: #523→#531→#532→#534→#535→#536).

    ensure_entity_loaded no longer collapses a journal read error into confirmed absence: new ensure_entity_loaded_or_error discriminates Err (typed 503 JournalUnavailable on the point-read probe) from Ok(false) (confirmed absence keeps 404). All other callers keep byte-identical behavior via the legacy wrapper, pinned by a control test. Review: OK-with-notes (no P1/P2); the three reviewer P3 one-liners are folded into the commit (09e59196), focused suites re-run green on the committed tree.

    Verified negative finding from the same review (recorded): bound-action dispatch under journal read failure was already fail-closed at base via ReplayPolicy::ExistingSnapshot — the original premise that it 404'd does not hold; no change made there.

    #535 note: its first CI Tests run failed on infrastructure (testcontainers could not pull postgres:11-alpine — registry stream error — in temper-actor-runtime, untouched by the PR). Lacking rerun permission, the author close/reopened to retrigger at the same signed head 028de747; re-run nearly complete.

    C2 writer launched on the new stack tip per the settled Option C design + recorded contract decisions: coverage-skip removal, gap-union generalization to all pushdown filter shapes and non-empty pages, bounded per-row value revalidation, existing 413/503 contracts unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions