Skip to content

Approvals joins the console: admin surface, sixth module panel, metrics - #200

Open
omercelikdev wants to merge 1 commit into
mainfrom
approvals-console
Open

Approvals joins the console: admin surface, sixth module panel, metrics#200
omercelikdev wants to merge 1 commit into
mainfrom
approvals-console

Conversation

@omercelikdev

Copy link
Copy Markdown
Owner

What

T21 console federation for the approvals engine — the same vertical every other module walks (admin surface → console panel → triage → metrics → docs).

Admin surface (/goldpath/admin/approvals, contract §7.1 / R3)

  • GoldpathApprovalsAdminService over the store seam, so both shipped stores serve it: recent list with repeatable OR-filters (status, ladder — AND across), AdminPaging clamp, detail with trail + signatures, quorum numbers scoped honestly to the PENDING rung.
  • GoldpathApprovalsAdminEndpoints under AdminSurfaceGuard (exposeUnsecured is a visible opt-out). Decisions run the engine under the caller's principal — every rule (four-eyes, distinct-eyes, reason-required) holds on the admin path too. Frozen verb envelope: Ok carries Applied, a refusal carries the rule's name (ReasonRequired, NotFound, …) — never a silent 200.
  • GetRecentAsync added to the store seam; EF orders server-side with Take (the table grows unboundedly). SQLite consumers apply the family DateTimeOffsetToBinaryConverter convention, same as Bulk/Archival — the endpoint host test caught the raw-column ORDER BY refusal live.

Console (sixth module)

  • ApprovalsPanel: worklist (subject, ladder, amount, pending role, quorum n/m, requester, state), status facet defaulting to Pending, detail sheet with numbered trail + signatures + decide form printing the envelope message verbatim.
  • Triage rows ("subject waits at role") and the Awaiting decision Today card.
  • Suite 225/225, coverage 98.35% lines.

Metrics + ops

  • Goldpath.Approvals meter: six counters (requested/granted/rejected/escalated/expired/withdrawn) tagged by ladder, on the engine's state changes.
  • Grafana dashboard JSON under ops/, runbook + README sections.

Docs / ledger

  • Admin contract: approvals route table (engine unchanged under the caller's principal; store is not tenant-scoped, so no ?tenant=).
  • T21 addendum: after this PR the only open item on the thread is the adopter proof.

Gates

  • Approvals tests 84/84 (endpoint host tests over TestServer, admin-service quorum/orphan facts, EF recency fact)
  • Mutation score 74.35% (break 70)
  • dotnet format clean, docs-freshness green

🤖 Generated with Claude Code

T21 console federation for the approvals engine, the same vertical every
other module walks:

- GoldpathApprovalsAdminService over the STORE seam (both stores serve it):
  recent list with R3 repeatable OR-filters, AdminPaging clamp, detail with
  trail + signatures and honest quorum numbers (pending-rung scoped).
- GoldpathApprovalsAdminEndpoints under AdminSurfaceGuard: GET list/detail,
  approve/reject through the ENGINE under the caller's principal, answering
  the frozen verb envelope (Ok carries Applied, a refusal carries the rule's
  name — never a silent 200).
- GetRecentAsync on the store seam; the EF implementation orders server-side
  (SQLite consumers apply the family DateTimeOffsetToBinaryConverter
  convention, same as Bulk/Archival).
- GoldpathApprovalsMetrics: six counters on the engine's state changes, with
  the Grafana dashboard JSON under ops/.
- Console: approvals is the sixth module — worklist with quorum column,
  detail sheet with numbered trail + decide form, triage rows and the
  Awaiting-decision Today card. Suite 225/225, coverage 98.35% lines.
- Tests: endpoint host tests over TestServer (routes, R3, envelope,
  refusal messages), admin-service quorum/orphan facts, EF recency fact.
  84/84; mutation score 74.35% (gate 70).
- Docs: admin contract §approvals route table, runbook + README sections,
  T21 ledger addendum (only the adopter proof remains open).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant