Reconcile state after shipping design blockers in 0.2.0:59
ROADMAP: remove the resolved Design (contract conformance) section — the three blockers shipped (admin SPA in :59, landing buy button on keysat.xyz) and the structural + token tiers were dropped during adjudication. Current state: live is now :59, blockers done; the Zaprite auto-charge silent-lapse bug is the top remaining payments item.
This commit is contained in:
@@ -112,25 +112,25 @@ Operator-specific memories at `~/.claude/projects/-Users-macpro-Projects-keysat/
|
|||||||
|
|
||||||
## Current state (2026-06-18)
|
## Current state (2026-06-18)
|
||||||
|
|
||||||
- **Live / canonical: `0.2.0:58`** — universal s9pk at `files.keysat.xyz/keysat.s9pk` + GitHub `v0.2.0-58`;
|
- **Live / canonical: `0.2.0:59`** — universal s9pk at `files.keysat.xyz/keysat.s9pk` + GitHub `v0.2.0-59`;
|
||||||
live box `immense-voyage.local` on `:58`. Migrations through 0025; four SDKs published; two public sites
|
live box `immense-voyage.local` on `:59` (verified serving the new admin SPA). Migrations through 0025; four
|
||||||
(keysat.xyz, docs.keysat.xyz) live. `keysat-registry-landing` local + refs gone; the GitHub + Gitea remote
|
SDKs published; two public sites (keysat.xyz, docs.keysat.xyz) live. `keysat-registry-landing` local + refs
|
||||||
repos still need operator deletion (gh needs `delete_repo` scope).
|
gone; the GitHub + Gitea remote repos still need operator deletion (gh needs `delete_repo` scope).
|
||||||
|
|
||||||
- **This session — adjudicated the parked P2/P3 backlog** (ROADMAP-only, no source touched). Commit `601ccea`
|
- **This session — adjudicated the parked P2/P3 backlog, then shipped the design blockers.** Adjudication
|
||||||
in `keysat-root` is local but **NOT yet pushed** — Gitea host `immense-voyage.local` was unreachable
|
(committed to `keysat-root`): dropped the design structural + token-gap tiers and the Zaprite contact
|
||||||
(off-LAN); retry `git push gitea main` when back on the box's network. Verdicts: dropped the design
|
dedup-cache; reframed the manual Zaprite webhook "sandbox pass" into a small automated routing test (DO,
|
||||||
structural + token-gap tiers; reframed the manual Zaprite webhook "sandbox pass" into a small automated
|
ready plan in ROADMAP). Then fixed + released the 3 design-contract blockers: admin featured-toggle and
|
||||||
routing test (DO, ready plan in ROADMAP); dedup-cache → lean DROP pending one sandbox check; the 3 design
|
sidebar upgrade-CTA gold fills → navy/cream per the pill convention (daemon `:59`), and the landing buy
|
||||||
"blocker" CSS one-liners → lean DO (need an owner glance — public/admin visuals).
|
button pill-radius → 8px (keysat.xyz redeployed). All verified live.
|
||||||
|
|
||||||
- **New top payments item (surfaced by the adjudication):** `try_auto_charge_zaprite` returns `Ok(true)` on
|
- **Top remaining payments item (surfaced by the adjudication, not yet fixed):** `try_auto_charge_zaprite`
|
||||||
any HTTP 2xx, so a Zaprite 200 carrying a FAILED/DECLINED/EXPIRED status silently lapses the subscription.
|
returns `Ok(true)` on any HTTP 2xx, so a Zaprite 200 carrying a FAILED/DECLINED/EXPIRED status silently
|
||||||
Safe fail-safe fix needs no prod data; now the highest-priority payments item in ROADMAP.
|
lapses the subscription. Safe fail-safe fix needs no prod data; highest-priority payments item in ROADMAP.
|
||||||
|
|
||||||
- **Next (priority):** 1) Push `601ccea` to Gitea once reachable. 2) Operator data action (master key): grant
|
- **Next (priority):** 1) Fix the auto-charge silent-lapse bug. 2) Operator data action (master key): grant
|
||||||
`unlimited_merchant_profiles` to Pro/Patron on live master (Open TODOs). 3) Fix the auto-charge silent-lapse
|
`unlimited_merchant_profiles` to Pro/Patron on live master (Open TODOs). 3) The multi-profile webhook
|
||||||
bug. 4) The 3 design blocker one-liners + the webhook routing test. 5) Delete registry-landing remotes.
|
routing test (ROADMAP). 4) Delete registry-landing GitHub + Gitea remotes.
|
||||||
|
|
||||||
- **Tests/build:** ROADMAP-only session, no code touched; last full suite green (through migration 0025),
|
- **Tests/build:** daemon `:59` is a CSS-only admin-SPA change (no Rust/schema/SDK touched); `cargo check` +
|
||||||
`cargo check` + `npm run check` clean. Debt (P2/P3) in ROADMAP.
|
`npm run check` clean, last full suite green (through migration 0025). Debt (P2/P3) in ROADMAP.
|
||||||
|
|||||||
-18
@@ -44,21 +44,3 @@ Longer-term backlog. Near-term state lives in `AGENTS.md` → Current state.
|
|||||||
|
|
||||||
- Re-test `KEYSAT_INTEGRATION.md` against a fresh downstream app to confirm a clean one-shot SDK integration.
|
- Re-test `KEYSAT_INTEGRATION.md` against a fresh downstream app to confirm a clean one-shot SDK integration.
|
||||||
- **Add an automated regression test for multi-profile webhook routing** (adjudicated 2026-06-17 → DO, low blast radius — replaces the parked "manual Zaprite sandbox pass"). The routing is a deterministic provider-id→profile primary-key lookup with an anti-forgery re-fetch backstop, so the manual sandbox ceremony isn't worth it — but the path-keyed route (`/v1/{provider}/webhook/:provider_id` → `handle_for_provider`) currently has zero automated coverage on the money path. Plan: in `tests/api.rs`, reuse the two-provider fixture (~:3958), POST a Settled webhook to `/v1/zaprite/webhook/{provider-A-id}`, assert only profile A settles (B untouched; an unknown path-id 404s). Existing mock seam, no external account, runs in `cargo test`. Effort S.
|
- **Add an automated regression test for multi-profile webhook routing** (adjudicated 2026-06-17 → DO, low blast radius — replaces the parked "manual Zaprite sandbox pass"). The routing is a deterministic provider-id→profile primary-key lookup with an anti-forgery re-fetch backstop, so the manual sandbox ceremony isn't worth it — but the path-keyed route (`/v1/{provider}/webhook/:provider_id` → `handle_for_provider`) currently has zero automated coverage on the money path. Plan: in `tests/api.rs`, reuse the two-provider fixture (~:3958), POST a Settled webhook to `/v1/zaprite/webhook/{provider-A-id}`, assert only profile A settles (B untouched; an unknown path-id 404s). Existing mock seam, no external account, runs in `cargo test`. Effort S.
|
||||||
|
|
||||||
## Design (contract conformance)
|
|
||||||
|
|
||||||
The brand contract lives in `design/DESIGN.md` + `design/tokens.tokens.json` (distilled
|
|
||||||
2026-06-16 from the prior Claude Design system, archived in `design/_imports/`). A
|
|
||||||
`design-checker` audit (2026-06-16) found high fidelity overall. **Adjudicated 2026-06-17:**
|
|
||||||
the structural palette-consolidation and the token-gap nitpicks were **dropped** — the
|
|
||||||
consolidation can't actually remove the duplication it targets (the rust-embedded admin SPA
|
|
||||||
can't `@import` a shared file, so "consolidation" is a verbatim re-copy), and the token-gap
|
|
||||||
list was partly mis-specified by the audit. Only the three contract-"never" blockers survive.
|
|
||||||
|
|
||||||
**Blockers — approved to fix (adjudicated → lean DO; wants an owner glance since they change
|
|
||||||
public landing + admin visuals). Three reversible CSS one-liners:**
|
|
||||||
- Gold used as an actionable *fill* (contract: gold is accent/border only, never a fill).
|
|
||||||
(a) admin SPA `.featured-pill-toggle.on` → `web/index.html:417-419`; (b) admin sidebar
|
|
||||||
upgrade CTA `#tier-banner-cta` → `web/index.html:537`. Fix to navy-fill or gold-border/text.
|
|
||||||
- Primary buy CTA uses pill radius `999px` (contract: buttons are `r-md` 8px; pill is
|
|
||||||
badges-only) — `keysat-xyz-landing/index.html:390`. Set to 8px.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user