curo1305
0d1ab05e45
chore(07.3-02): wire JWT env vars in docker-compose, README key-gen, .env.example, bump to 0.1.2
...
- docker-compose.yml: add JWT_PRIVATE_KEY + JWT_PUBLIC_KEY to backend and celery-worker service env blocks
- README.md: add JWT_PRIVATE_KEY/JWT_PUBLIC_KEY to required env vars table; add JWT Key Generation section with Python one-liner and warning about session revocation
- .env.example: add JWT_PRIVATE_KEY= and JWT_PUBLIC_KEY= adjacent to SECRET_KEY
- backend/main.py: version bump 0.1.1 -> 0.1.2
- frontend/package.json: version bump 0.1.1 -> 0.1.2
2026-06-06 17:03:59 +02:00
curo1305
8d261b0509
security(07.3-02): add _rotate_tokens_on_algorithm_change lifespan hook + promote tests
...
- backend/main.py: add import logging, select; add _rotate_tokens_on_algorithm_change helper above lifespan; call from lifespan with try/except wrap
- backend/tests/test_auth_es256.py: promote ES256-04 and ES256-05 startup rotation tests from xfail to passing; suite reports 6 PASSED + 3 XFAILED
2026-06-06 17:02:45 +02:00
curo1305
fd3f611546
security(07.3-02): ES256 signing — swap 4 JWT sites + config keys + promote tests
...
- backend/config.py: add refresh_token_expire_hours=16, jwt_private_key, jwt_public_key
- backend/services/auth.py: add import base64; all 4 JWT sites use ES256 with inline PEM decode; zero HS256/secret_key references
- backend/tests/test_auth_es256.py: promote ES256-01..03 + CFG-01 tests from xfail to passing
2026-06-06 16:59:38 +02:00
curo1305 and Claude Sonnet 4.6
1eb1d59c8d
docs(phase-07.3): update tracking after wave 0
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-06 16:54:48 +02:00
curo1305
b9e1f2a464
chore: merge executor worktree (worktree-agent-a6bcbfd85b592800f)
2026-06-06 16:53:02 +02:00
curo1305
b1e3d0bc73
docs(07.3-01): add plan execution SUMMARY.md
...
- Documents 9 xfail stubs created + test_settings_has_jwt_config extension
- Records test counts: 372 passed / 1 failed / 9 xfailed
- Includes promotion plan mapping each stub to its Plan 02/03 task
- Confirms no production code was modified in this Wave 0 plan
2026-06-06 16:51:40 +02:00
curo1305
fac0e781f9
test(07.3-01): extend test_settings_has_jwt_config — red until Plan 02
...
- Assert settings.refresh_token_expire_hours == 16 (CFG-01 / D-09)
- Assert hasattr(settings, "jwt_private_key") (CFG-01 / D-01)
- Assert hasattr(settings, "jwt_public_key") (CFG-01 / D-01)
- Existing refresh_token_expire_days == 30 assertion preserved (Pitfall 5)
- Test intentionally fails until Plan 02 adds the three new config fields
2026-06-06 16:50:32 +02:00
curo1305
5c1a1f9504
test(07.3-01): add Wave 0 xfail scaffold — 9 ES256/RM/CFG stubs
...
- Create backend/tests/test_auth_es256.py with 9 xfail(strict=True) stubs
- Cover ES256-01..05 (access token, HS256 rejection, reset token, startup rotation)
- Cover RM-01..03 (16h default TTL, 30d remember_me TTL, cookie max_age)
- Cover CFG-01 satellite (jwt_private_key/jwt_public_key presence)
- Add es256_keys autouse fixture generating fresh P-256 keypair per test
- All 9 stubs collect and run as XFAIL; zero XPASS, zero ERROR
2026-06-06 16:49:58 +02:00
curo1305 and Claude Sonnet 4.6
4d0ada6d06
docs(phase-07.2): mark VERIFICATION.md passed — CR-02 gap resolved
...
Gap (password_reset_confirm missing user_nbf write) was fixed during UAT
phase: request: Request param added + Redis write at auth.py:744-750.
VALIDATION.md: 84/84 tests, nyquist_compliant=true. VERIFICATION.md
updated from gaps_found → passed (9/9). STATE.md advanced to phase 07.3.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-06 12:37:59 +02:00
curo1305 and Claude Sonnet 4.6
2265aaaba4
docs(phase-07.2): mark VALIDATION.md complete — nyquist_compliant: true
...
Audited post-execution state: all 11 tasks (9 original + CR-02 gap fix +
activate anti-pattern guard) have green automated tests. 84/84 passing.
Zero xfail stubs remaining. Sign-off approved.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-06 11:54:57 +02:00
curo1305 and Claude Sonnet 4.6
b8e0e3adec
test(07.2): complete automated UAT — 7/7 pass
...
All Phase 7.2 behaviors verified end-to-end against the running app:
- JTI UUID claim present in every issued access token
- Token rejected (Session invalidated) after password change
- Refresh cookie survives password change (skip_token_hash)
- Token rejected after enable-TOTP and disable-TOTP
- Token rejected after admin deactivation
- Reactivation does NOT write user_nbf (no spurious revocation)
Findings recorded in UAT.md:
- Workers must be restarted after Phase 7.2 deploy (--workers 2 does not hot-reload)
- D-02 same-second edge case confirmed benign in real usage
- Deactivation fires is_active check before user_nbf in same-second scenarios (belt-and-suspenders)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-06 11:47:59 +02:00
curo1305 and Claude Sonnet 4.6
95c6db5c42
security(07.2): add SECURITY.md audit — JTI claim + Redis NBF revocation
...
9/9 threats CLOSED; 11/11 Phase 7.2 tests PASSED; bandit 0 HIGH; full
391-test suite green. Documents gap closure for CR-02 (password_reset_confirm
user_nbf write). HS256→ES256 deferred to Phase 7.3.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-06 00:33:31 +02:00
curo1305
646736d4d3
docs(phase-07.2): complete phase execution
2026-06-06 00:12:09 +02:00
curo1305
8e4e199062
docs(07.2): add phase verification report
2026-06-06 00:11:44 +02:00
curo1305
d3deef4f95
fix(07.2): add user_nbf write to password_reset_confirm — CR-02 gap closure
2026-06-06 00:11:41 +02:00
curo1305
7e23a3ed0e
docs(07.2): add code review report
2026-06-06 00:07:51 +02:00
curo1305
a20d27123d
docs(07.2): update tracking after Wave 2 — plan 07.2-03 complete
2026-06-06 00:04:58 +02:00
curo1305
d3588ba055
docs(07.2-03): complete Wave 2 plan — user_nbf write sites in all 4 security-event handlers SUMMARY
2026-06-06 00:04:45 +02:00
curo1305
ae11a6e913
security(07.2-03): add import time + user_nbf write to admin deactivation handler; promote stubs to PASSED
2026-06-06 00:02:27 +02:00
curo1305
efeb75b279
feat(07.2-03): add import time + user_nbf writes to api/auth.py (change_password, enable_totp, disable_totp)
2026-06-06 00:01:19 +02:00
curo1305
2665a5085d
docs(07.2): update tracking after Wave 1 — plan 07.2-02 complete
2026-06-05 19:21:48 +02:00
curo1305
9f90d46649
chore: merge executor worktree (worktree-agent-a9a1eb8685f2efc98) — Wave 1 plan 07.2-02
2026-06-05 19:21:09 +02:00
curo1305
61199752b5
docs(07.2-02): complete Wave 1 plan — jti claim + user_nbf NBF check SUMMARY
...
- jti UUID claim in create_access_token (D-01)
- user_nbf Redis NBF check in get_current_user with fail-open + re-raise guard (D-02, D-03, D-04, T-7.2-02)
- 4 Wave 0 xfail stubs promoted to PASS; 29 tests passing in target suites
2026-06-05 19:20:42 +02:00
curo1305
30ad9fd015
security(07.2-02): add user_nbf Redis NBF check to get_current_user
...
- Added import logging + _logger = logging.getLogger(__name__) to deps/auth.py
- Inserted user_nbf Redis check block after decode_access_token in get_current_user
- Check reads user_nbf:{payload['sub']} from Redis; rejects if payload['iat'] < stored timestamp
- Uses strict < comparison (token issued exactly at event second is allowed — D-02)
- Handles both bytes and str returns from Redis for FakeRedis/aioredis compatibility
- except HTTPException: raise guard precedes broad except Exception (T-7.2-02 Pitfall 1)
- Broad except logs warning and fails open (D-04 — Redis outage must not block requests)
- Promoted all 3 Wave 0 NBF xfail stubs to passing assertions in test_auth_deps.py
2026-06-05 19:19:06 +02:00
curo1305
c00c1fbaa7
feat(07.2-02): add jti UUID claim to create_access_token
...
- Added "jti": str(uuid.uuid4()) to the access token payload in services/auth.py
- Promoted Wave 0 xfail stub test_create_access_token_includes_jti_claim to PASS
- Added test_create_access_token_jti_is_unique_per_call uniqueness guard
- uuid module was already imported at module top — no new imports needed
2026-06-05 19:15:01 +02:00
curo1305
a80b632ac8
docs(07.2): update tracking after Wave 0 — plan 07.2-01 complete
2026-06-05 19:12:41 +02:00
curo1305
8d44018f40
chore: merge executor worktree (worktree-agent-a2f182fa26b9780c8) — Wave 0 plan 07.2-01
2026-06-05 19:11:20 +02:00
curo1305
f0ba9e6d8e
docs(07.2-01): complete Wave 0 test scaffolding plan — SUMMARY
...
- FakeRedis mounted on test_auth_deps and admin_client fixtures
- 9 xfail(strict=False) stubs covering all Phase 7.2 behaviors
- 73 baseline tests pass, zero regressions
2026-06-05 19:10:03 +02:00
curo1305
eb1647293f
test(07.2-01): add FakeRedis to admin_client + NBF-write xfail stubs for deactivation
...
- Import FakeRedis from tests.test_auth_api (no redefinition)
- Mount app.state.redis = FakeRedis() in admin_client fixture before yield
- Reset app.state.redis = None in teardown (mirrors authed_client convention)
- Add test_deactivate_user_writes_user_nbf_to_redis (xfail strict=False)
- Add test_activate_user_does_not_write_user_nbf (negative-guard, xfail strict=False)
- All 22 existing admin tests unaffected (zero regressions)
2026-06-05 19:08:27 +02:00
curo1305
097cdcadf8
test(07.2-01): add NBF-write xfail stubs for change_password/enable_totp/disable_totp
...
- Add test_change_password_writes_user_nbf_to_redis (xfail strict=False)
- Add test_enable_totp_writes_user_nbf_to_redis (xfail strict=False)
- Add test_disable_totp_writes_user_nbf_to_redis (xfail strict=False)
- Each test exercises the full auth flow then asserts user_nbf Redis key
- Wave 2 (Plan 03) promotes stubs by replacing pytest.xfail() with real assertion
- All 27 existing auth API tests unaffected
2026-06-05 19:07:30 +02:00
curo1305 and Claude Sonnet 4.6
b7994efd06
docs(07.3): create phase plan — ES256 algorithm upgrade
...
3 plans (3 waves): Wave 0 xfail stubs, Wave 1 ES256 core + startup
rotation, Wave 2 remember-me TTL split + LoginView checkbox.
Verification passed (0 blockers, 1 minor doc warning fixed).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 19:07:25 +02:00
curo1305
c686d90e1f
test(07.2-01): add JTI claim xfail stub to test_task2_auth_service.py
...
- Add test_create_access_token_includes_jti_claim with xfail(strict=False)
- Asserts 'jti' key present in decoded payload, parseable as UUID
- Wave 1 (Plan 02) will add jti to create_access_token to promote this stub
- All 17 existing tests unaffected
2026-06-05 19:06:22 +02:00
curo1305
49c63337db
test(07.2-01): mount FakeRedis on test_auth_deps app + add NBF-check xfail stubs
...
- Import FakeRedis from tests.test_auth_api (no redefinition)
- Set test_app.state.redis = FakeRedis() in make_test_app() (Pitfall 4 guard)
- Add xfail(strict=False) stubs: reject iat<nbf, allow iat>nbf, fail-open on Redis error
- All 7 existing auth-dep tests unaffected (zero regressions)
2026-06-05 19:05:55 +02:00
curo1305 and Claude Sonnet 4.6
7ee87c001b
docs(07.2): create phase plan — JTI claim + Redis NBF access-token revocation
...
3 plans (Wave 0 test scaffolding, Wave 1 jti+NBF check, Wave 2 user_nbf
writes), VALIDATION.md, RESEARCH.md with resolved open questions.
Checker: 0 blockers, 1 warning resolved (RESEARCH.md open questions marked).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 18:56:49 +02:00
curo1305 and Claude Sonnet 4.6
e9b2d88ba0
docs(07.3): research phase — ES256 algorithm upgrade, startup rotation, remember-me TTL
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 15:00:08 +02:00
curo1305 and Claude Sonnet 4.6
35ff0d52fa
docs(07.2): research phase — JTI claim + Redis access-token revocation
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 14:57:11 +02:00
curo1305 and Claude Sonnet 4.6
eda91f7512
test(load): add Locust load test result CSVs
...
Results from Phase 6 production hardening load run:
stats, stats_history, failures, and exceptions captured for baseline
performance reference.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 14:44:59 +02:00
curo1305 and Claude Sonnet 4.6
6ec2748b84
docs(readme): add project README for v0.1 alpha
...
Covers features, architecture diagram, token flow, stack, environment
variables, quick-start, running tests, cloud backend setup, AI provider
configuration, and alpha status disclaimer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 14:44:54 +02:00
curo1305 and Claude Sonnet 4.6
14c1bf437b
docs(milestone): add v0.1 milestone audit report
...
Audits all 54 requirements and 9 phases against implementation.
Scores: 53/54 requirements met, 53/54 integration checks passed,
5/6 user flows complete. AUTH-07 partial gap (CR-01..03) documented
and resolved by Phase 7.1. Tech-debt items catalogued for next milestone.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 14:44:50 +02:00
curo1305 and Claude Sonnet 4.6
18de84d1a9
docs(phase-06): add pattern map and code review fix report
...
06-PATTERNS.md: maps 12 new/modified files to closest codebase analogs
for Phase 6 (Performance & Production Hardening).
06-REVIEW-FIX.md: records all 16 review findings (7 critical + 9 warning)
fixed in iteration 1 on 2026-06-04.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 14:44:38 +02:00
curo1305 and Claude Sonnet 4.6
1fd7395893
docs(state): clean up HANDOFF.json and mark all v1.0 phases complete
...
All 7 phases + sub-phases 6.1, 6.2, 7.1 complete as of 2026-06-05.
HANDOFF.json removed — no active handoff; STATE.md updated to reflect
v1.0 milestone done and next-action as "ready for next milestone."
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 14:44:31 +02:00
curo1305
77135df803
docs(07.3): capture phase context
2026-06-05 14:42:05 +02:00
curo1305
50b9ffc1f1
docs(state): record phase 7.2 context session
2026-06-05 14:37:55 +02:00
curo1305
8c29af7f90
docs(07.2): capture phase context
2026-06-05 14:37:50 +02:00
curo1305 and Claude Sonnet 4.6
c9fe69db3a
docs(phase-07.1): add Nyquist VALIDATION.md — nyquist_compliant: true
...
All 6 tasks covered: 3 backend integration tests (pytest, green) + 3 frontend
unit tests (vitest, green). 0 manual-only. Gap audit resolved 3/3 missing gaps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 12:54:19 +02:00
curo1305 and Claude Sonnet 4.6
8f8bfa5539
test(phase-07.1): add Nyquist validation tests for sessions_revoked frontend behavior
...
3 positive + 2 negative Vitest tests covering CR-01/02/03 toast UX:
- SettingsAccountTab: toast appears/hidden after changePassword (CR-01)
- SettingsAccountTab: toast appears after disableTotp (CR-03)
- TotpEnrollment: inline alert appears/hidden after enable_totp (CR-02)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 12:54:14 +02:00
curo1305 and Claude Sonnet 4.6
89375e6d93
docs(phase-07): mark VALIDATION.md complete — 10/11 tests green, nyquist_compliant
...
All 11 test functions confirmed present and implemented. 10 pass in unit
mode; test_load_provider_config is correctly gated behind INTEGRATION=1
(requires PostgreSQL) — not a gap, test is fully implemented.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 12:50:07 +02:00
curo1305 and Claude Sonnet 4.6
c38c6b1c01
feat(07.1): session revocation on privilege change — CR-01/CR-02/CR-03
...
- revoke_all_refresh_tokens: add skip_token_hash optional param (exclude
current session while revoking others)
- change_password, enable_totp, disable_totp: call revoke with skip hash
derived from refresh cookie; return sessions_revoked in response and
write to audit log metadata_
- 3 new tests: test_{change_password,enable_totp,disable_totp}_revokes_other_sessions
— all PASSED; 373 total passing, 0 regressions
- Frontend toasts: SettingsAccountTab + TotpEnrollment show
"Other sessions have been terminated." when sessions_revoked > 0
- Companion fixes: rate_limiting get_client_ip refactor, deps/auth.py
request.state.current_user, locustfile refresh-token task removal
- Version bump: 0.1.0 → 0.1.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 12:47:16 +02:00
curo1305 and Claude Sonnet 4.6
8d060a5da4
docs(state): mark Phase 7.1 planned — ready to execute
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 12:32:12 +02:00
curo1305 and Claude Sonnet 4.6
a3a97430a2
docs(07.1): create phase plan — 2 waves, CR-01..03 session revocation
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-05 12:27:24 +02:00