Skip to content

[Task]: Carry a recorded decision rejection in the shared production-scale coordination fixture (GH-C102) #4540

Description

@superwesleyhys-ux

Task ID or area

GH-C102

Technical direction

Core control-plane hardening

Intent

I want to claim an existing task

Summary

The shared production-scale coordination fixture only ever generates standing
authority: every broad, goal-bound user gate in
tests/fixtures/control_plane/coordination_production_scale_v0.json carries
decision_outcome: "approve", and the two neighbouring bands are a scoped gate
without an outcome and an exact-action approval with unblocks_todo_id. No
generated record exercises an explicitly refused decision, so every provider
conformance arm proves that approvals survive and nothing proves that a
rejection stays recorded but inactive.

The decision-scope RFC makes active a property of the recorded outcome
(decision_outcome === "approve") and keeps reject / cancel as standing
receipts that never grant authority. That invariant is covered by focused unit
tests in tests/control_plane_ts/standing_decision.test.ts, but it is absent
from the shared fixture that every provider arm reduces.

Proposed scope

In scope:

  • add a bounded rejection band to the checked-in envelope
    (rejected_standing_decision_count) and to the shared generator in
    tests/control_plane_ts/production_scale_coordination_fixture.ts: broad,
    goal-bound, global_gate user gates whose decision_outcome is "reject"
    under a second decision kind, so the refusal keeps its own decision identity
    and cannot merge into the approved scope;
  • expose the derived expectations (expected_inactive_standing_decision_count,
    and the retained-standing count used by the archive assertion) instead of
    hardcoding them;
  • assert the dimension on every provider conformance arm in
    tests/control_plane_ts/authority_store_conformance.ts: inactive_count and
    per-entry active === (outcome === "approve");
  • add one independent mutation/negative case file that proves the rejection,
    not a missing record, is what keeps the scope inactive, and that dropping the
    typed decision_scope removes the receipt entirely.

Out of scope:

  • changing the standing-decision predicate or projection semantics;
  • weakening the archive retention dimension (retained standing receipts grow by
    the rejection count, so the moved-row budget is recomputed rather than
    relaxed);
  • NoKV, PostgreSQL, or live provider configuration changes;
  • any production code change.

Intended base branch

main

Relevant files or commands

  • tests/fixtures/control_plane/coordination_production_scale_v0.json
  • tests/control_plane_ts/production_scale_coordination_fixture.ts
  • tests/control_plane_ts/authority_store_conformance.ts
  • tests/control_plane_ts/production_scale_rejected_decision.test.ts
  • loopx/control_plane/todos/standing_decision.ts

Validation plan

  • npm run test:control-plane (file, SQLite, NoKV JSON-lines, NoKV
    single-envelope arms; PostgreSQL arm only with LOOPX_TEST_POSTGRES_URL)
  • node --test tests/control_plane_ts/production_scale_rejected_decision.test.ts
  • npm run typecheck:control-plane
  • loopx check --scan-path tests/fixtures/control_plane --scan-path tests/control_plane_ts --scan-path docs/development/testing-and-quality.md

Public/private boundary

  • This issue does not include private benchmark traces, verifier output, credentials, internal document links, raw agent sessions, or local runtime state.
  • I will not run or duplicate maintainer-owned benchmark cases unless a maintainer explicitly splits out a public task.

Activity

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions