Skip to content

id: implement grant lifecycle per #2254 spec — registry, pending holds, attestations, clawback/debt, revocation policy #2723

Open

Description

@dezren39

Implementation follow-on for the grant lifecycle spec delivered for #2254 (spec doc: pkgs/id/doc/2026-10-30T11-55-00Z_design_grant_lifecycle.md — tracked at doc/2026-10-30T11-55-00Z_design_grant_lifecycle.md, pkgs/id/doc is a symlink to the repo doc/). Build nothing until the #2254 spec PR is reviewed/merged and the #2043 synthesis settles the spec's open parameters OP-1…OP-8 where a phase depends on them.

Scope (per spec sections, in landing order)

  1. Fingerprint registry + registration flow (spec §2) — canonicalisation + domain-separated SHA-256 fingerprint, grant_keys table (primary key enforces one grant per key), Presented → Rejected/PendingHold flow, publisher-revocation batch intake. Lands first with §1: together they close id: investigate: tokens for real services — Steam-key grants, returns/refunds, revocation #2042 abuse case 1.
  2. PendingHold lifecycle (§1) — TigerBeetle pending transfer at registration, window config per grant source snapshotted onto the grant record, idempotent post sweep, void flow, timeout re-issuance fail-safe.
  3. Attestation intake (§3) — service-signed external-event records (refund / chargeback / publisher revocation), authenticated source intake, (source, external_ref) idempotency, transition dispatch.
  4. Clawback / Shortfall / debt engine (§4) — amount_outstanding attribution, partial clawback choreography, debt records, FIFO offsets, suspension effects, signed write-off.
  5. Revocation-policy enforcement (§5) — policy ladder + issuance snapshot check at execution, recorded refusals, revocation-notice + grace registry.

Hard rule from the spec

No phase may enable Active-state grants before §4 exists to claw them back. Delisting (§6) is an accept_payment configuration act and is explicitly NOT part of this implementation.

Acceptance


Filed by queue worker (repo-worker-code) Lane C, queue task 3409, as the implementation follow-on #2254's acceptance requires.

Activity

  1. added
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    priority/normalOrdinary priority (the default)
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 30, 2026
  2. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Intake review

    Fleet monitor intake pass (2026-10-30 run). Labels normalised this pass: kind/enhancement, priority/normal, effort/l, status/needs-triage, meta/enriched (app/id was already present). The body's existing ## Acceptance section is retained as the acceptance criteria (no duplicate section appended).

    Still live — and one gate has now cleared: the spec this issue is gated on has landed: PR #2722 ("id: grant lifecycle implementation spec (#2254)") merged 2026-10-30T12:29Z. Per the body's own gating text, what remains before building is the #2043 synthesis settling the spec's open parameters OP-1…OP-8 where a phase depends on them. No implementation code for the five phases exists yet.

    Related: #2254 (spec), #2043 (synthesis), #2042 (abuse case 1, closed by phases 1+2 landing together).

    Notes / risks: the hard rule bears repeating at pickup time: no phase may enable Active-state grants before §4 (clawback/debt) exists. This is a multi-phase epic (effort/l) — a worker should claim one phase per task, in the body's landing order, not the whole issue at once.

    Suggested approach: when the #2043 synthesis settles, enqueue phase 1+§1 (fingerprint registry + PendingHold) as the first implementation task, citing this issue; keep later phases as follow-on tasks so each lands with its spec-traced tests.

  3. added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  4. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: triaged (coverage pass)
    Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 40 (priority/normal). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
    Found via: coverage pass 2026-11-03

  5. added
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  6. 9 remaining items

  7. added
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    and removed
    work/assignedQueue worker lifecycle state
    on Nov 4, 2026
  8. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: done (triaged)
    task: 7975 (triage, repo-health-code-pilot; repo-worker-code; OpenChamber scheduled lane 335a5d1f-bfc1-4831-99ea-850c8939a727)
    state: Queue task completed as triaged; issue #2723 stays OPEN. No code/PR or duplicate follow-up task created. The existing phased scope is valid; phase 1 waits on the grant choices already tracked in #2296, then phases must preserve the §4 clawback-before-free-activation safety rule.
    labels: removed queue/claimed, status/in-progress, work/assigned; set queue/blocked and status/blocked for the unresolved policy gate. Left issue classification and priority labels unchanged.
    resume: after the Drew/operator decisions in #2296 and any relevant config defaults are recorded, re-triage/dispatch the first implementation phase (fingerprint registry + PendingHold lifecycle).
    links: current main ece818d · #2296 #2296

  9. developing-today commented on Nov 8, 2026

    @developing-today
    Contributor

    🤖 Agent note · triaged (task 12075, lane code-q, direct)

    • Agent: queue worker (repo-worker-code), lane code-q
    • Session / ID: task 12075
    • Found via: queue claim (re-triage under Drew's triage doctrine, code#7016 — task 7975 was marked done with no landed evidence)

    Triage verdict — CONFIRMED real and current, and correctly BLOCKED on Drew/operator decisions that are already escalated on their own issues. No implementation exists; no fix packet enqueued.

    Verified fresh 2026-11-08 at main d94e6c74bbcfbd2d81a914dc2d94f2f9d926a958:

    Disposition: issue #2723 stays OPEN with queue/blocked + status/blocked. Enqueueing an implementation packet now would send a worker into a build whose defining parameters are undecided — the packet would park on the same gate, so none is filed. This triage task completes as triaged; per the doctrine, that does not complete the issue.

  10. added
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    and removed
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    on Nov 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-inskind/enhancementmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)queue/blockedQueue or user escalation statesource/creatorFiled by the new-issue-creator jobstatus/blockedQueue or user escalation statetask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions