Repository navigation
v0.10.11
Added
CLI for v0.10.10 scoped service keys (parent tk_e0d7db15ff814c0a, Codex R1+R2 VERIFIED-CLEAN on tk_53e042ecee7e43ff) — closes the human-facing surface gap so issuing, listing, rotating, and revoking keys no longer requires curl.
sfs admin service-keys list|create|revoke|rotate|scopes— org admin + Team+ tier required for mutations. Raw key prints to stdout exactly once on create + rotate with aSave this — you won't see it again.warning on stderr.sfs auth keys list|create|revoke— any logged-in user, personal-key surface.--output-keyflag on create + rotate emits ONLY the raw key forKEY=$(sfs admin service-keys create ... --output-key)CI capture. Mirrors--output-idonticket create.- Local scope validation against
VALID_SCOPES(imported from server schemas, single source of truth). Unknown scopes and*wildcard for service keys fail with exit 2 before any network call. - Structured error codes from the server (insufficient_scope, cross_org_denied, etc.) are surfaced verbatim via
_parse_errorcovering all 4 FastAPI envelope shapes ({"error": {...}}, {"detail": {...}}, {"detail": "string"}, {"detail": [validation_list]}). - All commands inherit
SESSIONFS_API_KEY/SESSIONFS_API_URLenv-var auth via the shared_get_api_confighelper.
docs/api-keys.md (tk_522991717c6446c9, Codex R1+R2 VERIFIED-CLEAN on tk_ee765a03b69045eb) — public reference covering both kinds of keys, the 14-scope vocabulary with current opt-in status (handoffs:write and agent_runs:write live today; remaining 12 scopes reserved for Phase 3 route opt-in), service-key lifecycle, cloud-agent integration recipes (Bedrock, Vertex, GitHub Actions, GitLab MR), rotation policy guidance, and complete structured error code reference. docs/cli-reference.md gains full option tables for sfs auth keys and sfs admin service-keys.
Per-ticket review-state derivation (tk_e025375272b84a95, Codex R1 VERIFIED-CLEAN on first round on tk_d7354a8032e8443b) — compact summary of open findings, closed findings, last verdict, and severity counts for long review threads. No new schema or stored state — computed at read time from existing TicketComment rows.
GET /api/v1/projects/{pid}/tickets/{tid}/review-state— same auth as get_ticket (project membership + agent_tickets feature). Cross-project access denied by_get_project_or_404. Returnsreview_state: nullfor tickets without any codex-reviewer comments.get_ticket_review_stateMCP tool (56 → 57 total tools) — wraps the endpoint. Description steers agents away from scraping comments themselves.sfs ticket review-state <id>CLI command — renders verdict + severity counts header, Rounds table, Open + Closed finding lists.- Parser (
src/sessionfs/server/services/review_state.py) extracts findings from Codex's consistent comment shape (Codex R{N} review on tk_X: VERDICTheader +• SEVERITY — textbullets). Closure rule: findings raised in round N close when any subsequent round has VERIFIED-CLEAN verdict. Reopens not modeled (rare and fragile to text-match). 14 unit tests + 4 integration tests.
Fixed
sfs ticket watch DNS error (tk_aeb8580706d84e2e, Codex R1 VERIFIED-CLEAN on first round on tk_d611718c24944110) — caught by Codex during v0.10.9 review when its sandbox got a raw [Errno 8] nodename nor servname provided, or not known traceback. The shared _api_request helper now catches httpx.RequestError (parent of ConnectError, TimeoutException, NetworkError, SSL errors — but NOT HTTPStatusError) and exits 1 with an actionable Configure cloud auth first: sfs auth login --url ... or set SESSIONFS_API_URL / SESSIONFS_API_KEY message. Every CLI command using _api_request benefits — not just ticket watch/comments.
Shared _api_request helper — two regression fixes from the service-keys CLI work:
- DELETE method now forwards
json_dataviaclient.request("DELETE", ..., json=...). Httpx'sclient.delete()doesn't accept ajsonkwarg, so v0.10.10 revoke endpoints (which require aRevokeKeyRequestbody) were dropping the reason and 422-ing. - 204 No Content responses no longer crash
resp.json()even when content-type isapplication/json— short-circuits to empty string whenresp.contentis empty.
Manifest schema retrieval_audit_id (tk_c19f7694009e4723) — src/sessionfs/spec/schemas/manifest.schema.json now allows the retrieval_audit_id field added in v0.10.4 (migration 039). test_full_capture_pipeline was failing because additionalProperties: false at root rejected valid manifests. Schema fixed inline before this release.
Dashboard footer version (commit e87953d, posted earlier) — Layout.tsx no longer hardcodes a version string. Vite reads from a new dashboard/VERSION file (or SFS_VERSION env / pyproject.toml fallbacks) at build time. /release skill now bumps dashboard/VERSION alongside pyproject and Chart.yaml.
Reviews
Five separate Codex review threads, all VERIFIED-CLEAN:
- Service-keys CLI: tk_53e042ecee7e43ff (R1 1 MEDIUM + 1 LOW → R2 CLEAN)
- docs/api-keys.md: tk_ee765a03b69045eb (R1 1 MEDIUM + 3 LOW → R2 CLEAN)
- DNS error catch: tk_d611718c24944110 (R1 CLEAN first round)
- Review-state: tk_d7354a8032e8443b (R1 CLEAN first round)
- Update-entry-confidence + promote-entry MCP tools (tk_44bc8c8862304051) bundled from earlier in same cycle (R2 CLEAN)
Shield-SR pre-release security review: 0 critical / 0 high / 0 medium new findings — release approved. One LOW noted as Atlas follow-up (tk_33a25a12a5cf4dc3: cap row count on review-state endpoint).
Notes
- Tests: 1871 backend + 186 dashboard passing (+52 net over v0.10.10). 2 xfail-strict pre-existing migration-003 PG-syntax (
tk_7dc9e8764a5a4297). - MCP tools: 54 → 57 (+3:
update_entry_confidence,promote_entry,get_ticket_review_state). - Migrations: 001–042 (no new migrations this release).
- Phase 3 route opt-in for service keys still deferred to v0.10.12+ — TicketComment / KnowledgeEntry / RetrievalAuditEvent write routes remain on plain
get_current_userand reject service keys. Scopes are defined but reserved.