You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
id: design: refundable grants via pending transfers — Steam premium tokens voidable through the refund window #2065
Source: the TigerBeetle investigation (on #2040) refund/revocation gap: posted transfers are immutable and a clawback fails if the holder already spent the balance. Design grant issuance as PENDING transfers: a Steam-key grant (e.g. 500 premium tokens) is reserved at registration and posts only when the refund window closes; a refund voids it. Cover window length, partial posting, and what the user sees while pending. Feeds #2043 and the real-services investigation (#2042).
Program: Drew's 2026-10-28 directive (full text: hatch-personal memory/topics/id-program-2026-10-28.md). Parent epic: #2056.
Working pattern: parallel investigations, then the named synthesis issue merges them into a full design. Route guidance: Workhorse by default; Specialist/Summit for synthesis and ramification-heavy work. A result that says "done" is not the endpoint — the orchestrator reviews it and may commission another round. Deliverables: a markdown design/investigation doc (mermaid/SVG diagrams welcome) linked from this issue, plus follow-up issues for anything buildable. Build a proof of concept where the design calls for one, but do NOT build the permanent feature on top of an unreviewed PoC.
Acceptance criteria
A markdown design doc is linked from this issue designing grant issuance as PENDING TigerBeetle transfers that post only when the refund window closes and are voided by a refund.
The doc covers: window length, partial posting, and what the user sees while a grant is pending.
Related: parent epic #2056; source investigation #2040 (refund/revocation gap); feeds #2043 and the real-services investigation #2042.
Notes: design deliverable in the ID program batch; the pending-transfer mechanism is the core idea and is well-scoped in the body.
Risks: window length is a product/policy pin (Steam refund window vs user experience of pending tokens) — surface it explicitly in the doc rather than burying a default.
Suggested approach: Workhorse design pass; coordinate the pending-state UX with #2062's account factory so pending grants have a representation from day one.
— Fleet monitor intake pass (protocol §5): issue verified still live this run (filed within the last hour; no merged PR or duplicate resolves it), labels normalized, meta/enriched applied.
Top priority — ID program wave-1. Drew directed this be picked up in the next runs (2026-10-29): enqueued directly as triage task 3367 in repo-health-code-pilot at queue priority 20 (only breakage-class work at priority 10 outranks it). Wave-1 is the ungated investigations and designs; syntheses and PoCs stay gated on their named inputs. Investigation route: Workhorse.
Once a grant posts, tokens are ordinary spendable balance and a late refund is a clawback again. So the design is not "refunds always work"; it is "the vesting window is the refund window" — the same rule Steam applies. The residual (late refund after spend) is bounded and handled explicitly, not hand-waved.
Acceptance criteria, point by point:
✅ Design doc linked (this comment + PR docs(id): design refundable grants as pending transfers (#2065) #2293): grant issuance as flags.pending transfers from issuer.grant_pool to the holder account, vested by post_pending_transfer at window close, voided by void_pending_transfer on refund.
✅ Window length (§3, options table with a 14-day recommendation), partial posting (§4), pending UX (§5).
✅ Follow-ups filed: #2294 grant service, #2295 vesting reconciler + drift alarm, #2296 the window/spendability decision.
Two findings worth reading even if the doc is skimmed:
Void is all-or-nothing in TigerBeetle; only posting is partial. That asymmetry decides refund semantics: partial post is for policy, void-and-reissue is for refunds. Mixing them is how a refunded amount ends up posted.
Activity
dezren39 commentedon Oct 29, 2026
Parent epic: #2056 — ID platform expansion (2026-10-28 directive). Filed as batch 2 from PREPARED-ACTIONS.md.
developing-today commentedon Oct 29, 2026
CODE-986
dezren39 commentedon Oct 29, 2026
Intake review
Related: parent epic #2056; source investigation #2040 (refund/revocation gap); feeds #2043 and the real-services investigation #2042.
Notes: design deliverable in the ID program batch; the pending-transfer mechanism is the core idea and is well-scoped in the body.
Risks: window length is a product/policy pin (Steam refund window vs user experience of pending tokens) — surface it explicitly in the doc rather than burying a default.
Suggested approach: Workhorse design pass; coordinate the pending-state UX with #2062's account factory so pending grants have a representation from day one.
— Fleet monitor intake pass (protocol §5): issue verified still live this run (filed within the last hour; no merged PR or duplicate resolves it), labels normalized, meta/enriched applied.
dezren39 commentedon Oct 29, 2026
Top priority — ID program wave-1. Drew directed this be picked up in the next runs (2026-10-29): enqueued directly as triage task 3367 in repo-health-code-pilot at queue priority 20 (only breakage-class work at priority 10 outranks it). Wave-1 is the ungated investigations and designs; syntheses and PoCs stay gated on their named inputs. Investigation route: Workhorse.
dezren39 commentedon Oct 29, 2026
agent-note:v1 — picked up
3367(repo-health-code-pilot), attempt 1repo-worker-code· originopenchamber-scheduled-lanestage=claimeddocs(id): design refundable grants as pending transfers (#2065)
docs(id): link follow-up issues 2294-2296 from the grant design (#2065)
dezren39 commentedon Oct 29, 2026
agent-note:v1 — investigation/design complete (PR open)
Deliverable:
doc/2026-10-29T12-10-00Z_design_refundable_grants_pending_transfers/— in PR #2293.Verdict: the premise holds, with one correction that changes the product story.
exceeds_creditsis unreachable).Acceptance criteria, point by point:
flags.pendingtransfers fromissuer.grant_poolto the holder account, vested bypost_pending_transferat window close, voided byvoid_pending_transferon refund.Two findings worth reading even if the doc is skimmed:
timeout= window + 72h slack and requires a reconciler — that is why id: build: grant vesting reconciler and control-plane↔ledger drift alarm #2295 exists rather than being folded into id: build: grant service — pending-transfer grants (register/vest/void) with control-plane grant records #2294.No PoC built (the design does not call for one; #2296 gates the window value). No permanent feature built on an unreviewed decision.
Task 3367 · worker
repo-worker-code· originopenchamber-scheduled-lane