Mark SDK expiry parity fully shipped: Python 0.3.0 on PyPI, Go v0.2.0
This commit is contained in:
@@ -120,13 +120,12 @@ Operator-specific memories at `~/.claude/projects/-Users-macpro-Projects-keysat/
|
|||||||
(DB narrows, never widens; `clamp_to_signed_ceiling`). (2) An expired/tampered self-license lingered until
|
(DB narrows, never widens; `clamp_to_signed_ceiling`). (2) An expired/tampered self-license lingered until
|
||||||
restart; now re-verified each refresh and demoted like revoked/suspended. Crypto + offline master key
|
restart; now re-verified each refresh and demoted like revoked/suspended. Crypto + offline master key
|
||||||
confirmed sound (no signature-forgery path). Commit messages kept **generic** per operator request.
|
confirmed sound (no signature-forgery path). Commit messages kept **generic** per operator request.
|
||||||
- **SDK offline-expiry parity resolved + Go published.** Python `Verifier.verify_with_time` + Go
|
- **SDK offline-expiry parity resolved + published (all four).** Python `Verifier.verify_with_time` + Go
|
||||||
`ParseAndVerifyAt`/`ErrExpired` now reject expired keys offline, matching Rust/TS (reviewer-approved). **Go
|
`ParseAndVerifyAt`/`ErrExpired` now reject expired keys offline, matching Rust/TS (reviewer-approved). **Go
|
||||||
published** as tag `v0.2.0` (go-proxy). **Python `0.3.0` is ready in-repo but NOT on PyPI** — upload needs the
|
published** (tag `v0.2.0`, go-proxy) and **Python published** (`keysat-licensing-client 0.3.0` on PyPI). Both
|
||||||
operator's token (no twine/creds in-session). Both public sites redeployed (landing + docs, 200).
|
public sites redeployed (landing + docs, 200).
|
||||||
- **Next (priority):** 1) operator uploads Python SDK `0.3.0` to PyPI (`python -m build` + `twine upload`, your
|
- **Next (priority):** 1) email Start9 re: license + 0.4.x build flow (gates registry submission). 2) eval P2
|
||||||
token). 2) email Start9 re: license + 0.4.x build flow (registry submission). 3) eval P2 hardening (XFF
|
hardening (XFF rate-limit, dep bumps, admin/public port split). 3) split `audit:read` scope. (Nice-to-have:
|
||||||
rate-limit, dep bumps, admin/public port split). 4) split `audit:read` scope. (Nice-to-have: document the new
|
document the new SDK verify methods in keysat-docs.)
|
||||||
SDK verify methods in keysat-docs.)
|
|
||||||
- **Tests/build:** daemon `cargo test` green (~125 / 8 suites, incl. 5 new self-license clamp tests); wrapper
|
- **Tests/build:** daemon `cargo test` green (~125 / 8 suites, incl. 5 new self-license clamp tests); wrapper
|
||||||
`tsc` clean; Python SDK pytest 14 green + Go `go test` green (both incl. new expiry tests). No CI.
|
`tsc` clean; Python SDK pytest 14 green + Go `go test` green (both incl. new expiry tests). No CI.
|
||||||
|
|||||||
@@ -91,4 +91,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.
|
||||||
- **Upload the Python SDK `0.3.0` to PyPI** (carries the offline-expiry `verify_with_time`). The Go SDK already shipped 2026-06-19 as tag `v0.2.0` (go-proxy serves it from GitHub); Python is ready in-repo but not on PyPI — `python -m build` + `twine upload` with the operator's PyPI token (no creds in-session). `keysat-licensing-client` is not yet on PyPI, so `0.3.0` is the first upload. Additive, non-breaking. (Online `/v1/validate` already enforces expiry for every SDK, so unupgraded offline integrators are the only exposure.)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user