All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Planning milestones vs Hex releases
This changelog uses Semantic Versioning headings like [0.3.0] for installable Hex releases. Separately, maintainers track planning milestones labeled v1.x in .planning/ and archived milestone docs — those labels describe shipped tranches of work, not a second installable version axis on Hex. When in doubt, treat this changelog's SemVer headings and live Hex package metadata as the installable version truth; treat planning milestones as project-management traceability.
Unreleased
Nothing yet.
1.4.0 (2026-07-28)
Added
- Admin-enabled installs now generate a host-owned persisted platform-admin grant, explicit
mix sigra.admin.grant|revoke|list|checklifecycle tasks, and an allow/deny policy test. Grants require an existing confirmed active account and mutation audit rows share the database transaction. - Generated-host Playwright coverage now proves auth action hierarchy, Light/Dark/System behavior, reduced motion, 320px/200% text reflow, audit URL presets/applied state, and revoke-to-deny behavior.
Changed
- Clean generated auth templates use the bounded semantic
sigra-auth-*vocabulary and explicit action hierarchy across entry, recovery, settings, MFA, passkeys, sessions, and invitation states. Scoped utility/Daisy-shaped selectors remain as an older-template compatibility bridge. - Both admin audit explorers use URL presets instead of duplicate checkbox/form keys and show a labeled active-filter region immediately after the form.
- Generated sensitive account operations propagate the current scope and return a typed denial during impersonation.
Upgrade notes
- Existing generated files remain host-owned and are never overwritten automatically. See Upgrading generated hosts for v1.46 adopter experience for the additive grant migration, one-line customized-policy delegation, UI comparison workflow, and rollback path.
Features
- 221-01: pass scope to Auth.rename_passkey in installer template (0e34dcf)
- 221-03: pin upgrade_smoke start version to 1.3.0 (f507992)
Bug Fixes
- 221-01: complete SHIP-01 — add scope-aware rename_passkey/4 to generated context (f94277c)
- 221-01: dedupe delete-passkey confirmation body copy (bae6b90)
- 221-01: gate impersonation helpers on passkeys? + fix stale foundation assertion (a88cd66)
- 221-02: reset last_was_prop on complete single-line declarations (0cbb62b)
- 221-02: widen up.sh --help window to 2,26p for --print-env headroom (c039f89)
- auth-ui: disambiguate duplicate "Email" label on generated login page (#113) (743864c)
1.3.0 (2026-07-10)
Features
- 216-01: install parse5 ^8.0.1 + cheerio ^1.2.0 as playwright devDependencies (25553f4)
- 216-02: add award-ledger and render-sha JSON skeleton for two pilot surfaces (a02435f)
- 216-02: add settled-findings.tsv and admin-eval-schema.md with finding_id contract (72bb8a5)
- 216-03: implement bundle.ts — per-surface×cell evidence bundle writer (e38c4e3)
- 216-03: implement canonicalize.ts — parse5 allowlist walker → render_sha256 (5d8d20e)
- 216-04: evidence-anchor-check.mjs guard + node self-test (D-09, cite-and-flip) (8b6d4d0)
- 216-04: quality-findings-monotonic.sh guard + hermetic self-test (D-21) (84b31a8)
- 216-04: settled-findings-lint.sh guard + regen helper + hermetic self-test (D-22) (9623514)
- 216-05: add award-guard.mjs — verify-then-climb D-20 guard (e48b2a6)
- 216-05: add eval-probe-ids.mjs — single source of nine canonical probe ids (fdf93fd)
- 216-06: admin-eval.spec.ts + three playwright config projects (render matrix + bundles) (2d1c246)
- 216-06: probes.ts — nine in-browser visual probes (live --sg-* reads) (43b2a80)
- 216-06: stale-render-guard.sh + hermetic self-test (git plumbing, absence=FAIL) (52be409)
- 216-07: admin-eval-harness.sh — thin orchestrator (render→probe→guards) (c195905)
- 216-07: pilot verify-then-climb — users-index-live=A2, user-show-live=A1 (19e9473)
- 216-07: wire admin eval guards into fast_checks + add render job (8124599)
- 216-08: board-root scope all nine probe element-scan loops (Gap 1 fix) (0db07c4)
- 216-08: board-scope spec runAllProbes call + in-scope seeded-defect tests + D-22 enrichment (111cf5f)
- 217-01: author panel-schema.mjs findingId helper with 216 byte-identity test (ad2970c)
- 217-01: extract isStructuralAnchor + GEOMETRY_ONLY_CLASSES into lib/anchor.mjs (ef5cd4c)
- 217-01: install @anthropic-ai/sdk + zod as Playwright devDeps (38a42c2)
- 217-02: chain fix-queue-build.mjs into harness (Pitfall 3 ordering) (1bef8e0)
- 217-02: GREEN — fix-queue-build.mjs sole open_findings writer + fix-queue.json (0378f4e)
- 217-02: GREEN — fix-queue-lint.sh recomputes derived fields + open_findings check (168a58a)
- 217-03: implement panel-forced-floor-check.mjs — 12-cell grid + NONE + anchor validation (403ba2e)
- 217-03: panel-ci-isolation.test.sh — negative-assertion JUDGE-CI-01 proof (SC-5) (ec5174f)
- 217-04: author admin-graphic-design-lens.md (3 perceptual questions, pillar-grounded) (8198398)
- 217-05: add admin-panel-verdicts.json cache + panel-verdicts-lint.sh anti-rot triad (2880137)
- 217-05: implement excerpt.mjs — anchor-preserving DOM canonicalization (70076cc)
- 217-05: implement judge.mjs — k=3 quorum panel judge with content-hash skip (34c6085)
- 217-05: implement lenses.mjs — 4 lens definitions + prompt assembly (3685b35)
- 217-06: admin-autofix-loop.sh — apply/commit/re-render/revert with 4 rails (5af0952)
- 217-06: board-autofix-seed fixture + admin-autofix-loop.test.sh (SC-4) (413a58b)
- 217-06: fix-apply.mjs + copy-rules.json — deterministic copy + token swaps (0e7e48f)
- 217-07: admin-panel.sh — Hammer no-op degrade + pilot-surface default (8a95d7f)
- 217-08: align panel + render matrix on board-mg-5/9 surfaces (Option 2) (5746e69)
- 217-08: harden judge.mjs CLI ordering + add deterministic bundle-wiring self-test (1b547a0)
- 217-08: seed appliable in-band SPACE finding + update runbook + fix lint cross-surface check (f5d1524)
- 218-01: extend eval matrix to L1 boards + promote full matrix into both ledgers (D-02) (d688539)
- 218-02: verify-hold L1/L2 fractal; add 24 board award cells at A0 floor (3720ea5)
- 218-03: verify-hold 8 L3 award cells against proxy boards (bdeb46d)
- 218-04: fold UI-01 nits — flag warnings, --status re-probe, 120s host timeout, stale-stack reap (59c934d)
- 218-05: migrate mfa_settings_live.ex enrollment sub-flows to vt-* (507e2a8)
- 218-05: vt-modal + restyle org-members dialogs; remove dead mfa_challenge pair (acc524b)
- 218-08: wire probeIdsDriftCheck() into admin-eval suite (1a29cd8)
- 219-02: add branch-scoped recapture dispatch (D-04) (837e65d)
- 219-02: close 3 recapture gaps + fix stale comments (D-03) (176550d)
- 219-02: enforce canary-never-allowlistable in snapshot-canary-guard.sh (D-06) (f3b5e45)
Bug Fixes
- 216-01: ci.yml id:base emits merge-base SHA instead of tip (D-10) (6c4983a)
- 216-08: W1 — align evidence-anchor-check to real emitter shape + D-22 class strings (625b3a2)
- 216-09: wire audit-only suppression attrs and fix probeEmberReservedFor (5ed2b8a)
- 217: CR-01 canonicalize anchor in fix-queue-build to share finding_id keyspace (9be2f52)
- 217: CR-01 refuse token swap when family unresolvable, never emit invalid var() (f41b978)
- 217: CR-02 align PANEL_SCHEMA schema_version enum to 217-05 (c05f675)
- 217: CR-02 pass output_config.format=PANEL_SCHEMA to constrain LLM output (298ba4e)
- 217: IN-01 judge CLI reads bundle DOM/facts and refuses paid calls on empty DOM (0a6ee1d)
- 217: IN-02/IN-03 correct class-retention comments and guarantee vsn cleanup drops trailing separators (b067d1a)
- 217: IN-04 pass finding_id/poison-set to inline node programs via argv, not interpolation (4c94a68)
- 217: IN-05 use in-band fixture so loop proves real apply-revert chain, require Revert commit (c8f5cbb)
- 217: WR-01 wire fix-queue + panel-verdicts lints into merge-blocking fast_checks (26d4fd8)
- 217: WR-02 run seven Phase-217 self-tests on merge-blocking fast_checks (eec5ce8)
- 217: WR-03 delete dead/broken readFileSync const in fix-queue-lint (9f758c2)
- 217: WR-03 resolveTokenRef refuses 4-entry scale unless token_family=radius (6d77b03)
- 217: WR-04 fix-apply --queue mode refuses loudly instead of no-op 0 applied (d91c672)
- 217: WR-05 handle git revert conflicts under set -e in autofix loop (f0581d1)
- 217: WR-05/06/07 dry-run restore fails loudly, scope git add, run rail 3 unconditionally (bccffbe)
- 217: WR-06 correct false merge-base claim on --base HEAD guards (ffef26e)
- 218-01: deflake first-nav goto in admin-eval.spec.ts (D-09) (4b2a264)
- 218-01: teach fix-queue-build.mjs to skip proxy-pinned L3 cells (Blocker-1 fix) (7128b7d)
- 218-07: make fix-queue rep selection order-independent (3c9561a)
- 218-08: worker-unique eval emails + probes.ts nit fixes (WR-06, IN-01/02) (25370bb)
- 218-09: add error fallthrough to MFA confirm + fix WR-04 token (4596f4d)
- 218-09: guard org-members handle_event heads + flash lookup miss (7fc0486)
- 218-10: union dev.local.proxy-host in reap_stale_uat_stacks (WR-05) (b7be873)
- 219-01: add :global attr + {@rest} spread to example icon/1 (D-02) (a148842)
- 219-02: commit canary deletion before rebirth so guard sees pure 'added' (D-03.2) (4346c89)
- 220-01: relocate cheerio require below no-bundles guard (c0ca7fc)
1.2.0 (2026-07-10)
Features
- 198-01: add mix ci alias as DX-01 PR-gate local mirror (6badb0e)
- 199-03: add 36-user ugly bulk cohort seeded before personas (FIXT-02, D-09, D-10, Finding 1) (6ab94ae)
- 199-03: mark multi-session/multi-org breadth as deliberate FIXT-02 cases (D-11) (e7fced6)
- 199-03: top up admin to >=25 self-tied audit events for pagination (FIXT-01, D-08) (0adb3fd)
- 199-04: un-skip MG-5/MG-6 content-equivalence test (FIXT-01, D-13) (6e6d993)
- 200-01: add /admin/users/:id/sessions route to all three router files in lockstep (44159e7)
- 200-01: create UserSessionsLive with session table and APG confirm dialog (e4c9764)
- 200-01: extend glossary drift guard to cover UserSessionsLive (33b5a84)
- 200-02: convert Sessions/Orgs to bounded previews + remove session revoke flow (DETAIL-02) (16a09e1)
- 200-02: recompose identity header into one calm identity bar (DETAIL-01) (2204dc4)
- 200-02: verify JTBD composition order and preserve host extra-section seam (DETAIL-02/D-07) (4f4733e)
- 201-01: consolidate filter panel, demote metric strip, resolve sg-chevron (216b64c)
- 201-01: DRY per-row presentation via shared field-slice components (467c2cd)
- 201-01: reduce status_pills/1 to decision-bearing signals (0323fc2)
- 201-02: emit non-empty extra_list_badges + extra_list_columns from example hook (a44fd23)
- 201-04: sync mg-1/mg-2/mg-5 design gallery boards to elevated live markup (44a3b77)
- 202-01: add audit_table_row/1, audit_pagination_nav/1, audit_empty_state/1 to components.ex (3fe5e58)
- 202-02: collapse 3 forms into 1 with folded-in toggles + <details> disclosure (e768f78)
- 202-02: rewire desktop table/pagination/empty-state to shared components; delete dup helpers (c34c95a)
- 202-03: add <details> advanced-disclosure to global audit filter form (e664e7f)
- 202-05: ratchet audit-index-live and audit-user-live ledger cells to Tier 2 (816a740)
- 203-01: demote global Authentication coverage chip (D-03) (e385117)
- 203-01: drop org roster always-on Confirmed pill (D-02) (d8d03a2)
- 203-03: add branding #restore-defaults-overlay 7-APG + axe case (D-06) (57b8cc1)
- 203-05: ratchet index-live, organization-live, branding-live to Tier 2 (D-08) + fold PAGE-04 todo (D-09) (239f393)
- 205-02: add zoe zero-state persona to Personas.all/0 and feature_map/0 (D-16, D-17) (aed13f6)
- 205-02: extend seeds.ex with ghost-org, i18n/RTL user, bulk_cohort_size/0, @seconds_per_day (D-16, D-18, D-19, IN-01, IN-02, IN-03) (0138137)
- 205-03: add 4 board-cfg-* page composite boards to design_gallery_live.ex (D-08, D-09) (4ca6e53)
- 205-03: register CONFIG_BOARDS in admin-design.spec.ts, add structural assertion (D-10, D-11) (da980c7)
- 206-01: add admin-css-conformance.sh guard + fix lone hex violation (1c4af42)
- 206-04: flip all 8 L1 component rows to tier 2 in quality ledger (2b698b9)
- 207-01: add narrow raw-px CHECK 3 to admin-css-conformance.sh (D-07) (f7bb6c8)
- 207-01: build admin-token-completeness.sh guard (D-06) (a87f85f)
- 207-04: flip 6 ledger rows (token-layer L0 + 5 L1) to bare tier 2 (bd77241)
- 209-01: add admin_checkpoint_recapture CI job (D-09 checkpoint recapture mechanism) (272e187)
- 209-02: add panel schema-check helper + 4 list/overview surface docs (4285c70)
- 209-02: author 4 leaf/detail surface panel docs (e52457f)
- 209-02: author v1.42-PERSONA-JTBD-PANEL roll-up index (99e61a4)
- 210-02: flip 11 mg-* L2 ledger rows to bare tier 2 with rich evidence (f5833b0)
- 212-02: wire 3 persona-flow specs into admin_behavior CI step (FLOW-01) (7a7da09)
- 212-03: branch-scope generated_admin_playwright_smoke if to run on PR #63 (GATE-02) (efaf350)
- 213-01: rebless install golden fixture under phx.new 1.8.8 (d5797e9)
- 213-02: add rebless_golden --check CI drift-detector (D-06) + D-11 smoke version-asserts (6cab0c5)
- 214-01: add Sigra.OptionalDeps.oban_running?/0 SOT and fix all three call sites (e1040b7)
- 214-02: add user_id ownership guard to delete_session/3 (D-08) (2ba35c1)
- 214-03: add app.css corruption guard and wire into ci.yml (D-17) (bbb0b37)
- example: give the Vaultr demo app its own typographic mini-brand (d242d1a)
- example: kicker section spacing + click-to-copy on vt-code credential chips (f20d398)
- example: lock the real login to Vaultr; brand-lab is a homepage preview only (485d38f)
- example: real Vaultr settings page + vt-* form/alert/menu primitives + product identity (eab0479)
- example: recolor the Night Ops brand-lab preset to indigo/violet (0fac2fd)
- example: Vaultr authenticated account-home hub at /app (88004a9)
- example: wire check_account_active into :require_authenticated (loop-safe) (619f1b1)
- install: mirror loop-safe auth-plug guards into generated user_auth (1ea0278)
Bug Fixes
- 199-04: target seeded >=25-event admin in per-user audit pagination assertion (FIXT-01, D-15) (bcbbfad)
- 199: assert >25 admin audit events to match pagination boundary (WR-01) (5be6445)
- 199: guard self-test fixture mutation actually applied (WR-04) (6e3efdd)
- 199: revise plan 03 — add FIXT-02 breadth task + clean verify commands (a620b22)
- 200: WR-02 harden open_revoke_session token decode against malformed input (146708e)
- 200: WR-03 scope-restrict UserSessionsLive return_to to active-scope users index (19a7d0f)
- 203: extend glossary auth-replica carve-out to promoted preview_pair (dcf1725)
- 203: update IndexLive tests for demoted auth-coverage chip (D-03) (52e6133)
- 204-02: delete stale Phase192 known-failure contract test (D-08) (c9e5cbb)
- 204-02: reconcile Vaultr→Tasklane doc drift + update Phase148 contract (D-08) (7202113)
- 204-03: raise .vt-status-pill contrast to ≥4.5:1 + recapture mobile baselines (D-03/D-04/D-05) (c96749f)
- 204: remediate code-review findings (WR-01 dead-code regex, WR-02 unscoped refute, IN-01 stale comment) (010cc42)
- 208.1-01: add responsive desktop/mobile swap to board-cfg-audit (1985994)
- 208.1-01: correct board-mg-1 .sg-metric count assertion to 6 (341e32a)
- 208.1-02: reconcile stale sudo heading + audit disclosure selectors (7854ab5)
- 208.1-02: scope dual-DOM strict-mode assertions to visible variant (ae1f947)
- 208.1-03: reconcile demo-showcase spec selectors and copy drift (9a32dfa)
- 208.1-03: reconcile non_admin spec selectors/copy to rendered UI (b9642f5)
- 208.1-04: reconcile library-side sudo heading assertions + golden fixture to 'Re-enter your password' (cbe0b92)
- 208.1-04: reconcile stale example unit smoke test assertions to current UI (2ef6cfd)
- 208.1-04: use viewport-only screenshot in captureAndVerify to avoid 32767px limit (24ee68c)
- 209-03: index_live — kill bare "All clear" + dedup Total-users (f5d8fb8)
- 209-03: organization_live — kill bare "All clear" + swap empty-states (fd1ca31)
- 209-04: branding_live — replace hardcoded scope_ribbon literal with context-appropriate scope_copy/1 helper (44dc4ee)
- 209-04: user_sessions_live — entity-name H1 + security-preserving revoke copy (copy/IA only, no tier ratchet) (869f199)
- 209-04: user_show_live — de-dup sessions count, raise Manage sessions, unify empty-states, sharpen kicker (b28da2d)
- 209-05: move audit_index scope_ribbon above header; waiver chips-post-form as Audit Explorer archetype (7702539)
- 209: harden Plan 03 empty-state gate (count-based, partial-fix-safe) (a02efb7)
- 209: remove dead @summary_posture assign in index_live (code-review IN-01) (8f56f64)
- 209: revise plans per checker feedback (OQ resolution, dedup single-owner, positive-replacement + recapture-proof gates) (6b7a938)
- 209: rework admin_checkpoint_recapture — drop circular canary self-gate (WR-01) (eb066b4)
- 211-04: correct persona panel status PRE-FIX → POST-FIX (D-07) (4d475b1)
- 212: revise plans 01/04 — recapture-PR canary reconciliation + full-backlog merge vehicle (dbae903)
- 214-03: delete orphaned :root value fragments from app.css (D-15) (76c6d11)
- 214-05: correct stray 1.20.0 version wart in contract.md (DEBT-04 D-13) (59c37a9)
- auth: complete email-change confirmation fix (double-encode + session opts) (c2ab16f)
- auth: email-change confirmation always failed (invalid/expired) (1044180)
- auth: run password-change + deletion on the real Sigra.Auth path (9a157a9)
- auth: stale-sudo redirects to /users/sudo, not /users/log_in (WS4) (6dae6d1)
- auth: thread session_store_opts in password-change + deletion (sibling of c2ab16f1) (880fe5f)
- ci: route recapture-gate slugs per lane (single-lane recapture) (cae8cbc)
- testing: truncate deletion fixture timestamps to :utc_datetime precision (08c947b)
- uat: make --dev host-run boot reliably (drop bogus flag, sync compile-env port) (fddb160)
- uat: stable host-run port + tolerate compile-env drift on --dev (260621-in8) (0487e74)
Reverts
- 206-03: restore CI-native admin-design baselines (43f5a3e)
1.1.0 (2026-06-13)
Features
- 154-02: add sg-notice CSS block inside @layer sg-components (2c023ba)
- 155-01: add stat, skeleton, and notice components (all 10 complete) (969fbe8)
- 155-01: define 8 live-analog admin components in Sigra.Admin.Components (d13801d)
- 157-01: redesign render/1 with front-door archetype and skeleton state (0a7cdce)
- 157-01: split mount/3 with connected? gate and loading assign (29a72c4)
- 157-02: redesign org overview render/1 — front-door archetype + skeletons (23b482e)
- 157-02: split org overview mount/3 with connected? gate (3dc1979)
- 157-04: add global-overview and org-overview checkpoint blocks to admin-checkpoints.spec.ts (e6296d5)
- 157-04: record 6 initial PNG baselines for global-overview and org-overview (e609b48)
- 158-01: add audit_row/1 as 11th component with audit_tone/1 and format_date/1 (e56ccd7)
- 158-02: dual-layout wrappers + audit_row mobile cards + tone consolidation in AuditIndexLive (73d296c)
- 158-03: add dual-layout + audit_row mobile cards to AuditUserLive (1d05c1e)
- 158-03: wire shared chrome + quick-filter chips into AuditUserLive (10fe1e4)
- 158-04: route user-detail Recent Audit through compact audit_row (4f190da)
- 158: automated snapshot drift guard + recapture gate (zero-human baseline review) (0d3c4d2)
- 159-01: add deletion_scheduled? to member_row type and shape_member_row/1 (8fbeedc)
- 159-01: add roster deletion pill and expand format_date/1 in organization_live.ex (75be3ba)
- 159-02: add pat and grace personas to all/0 and feature_map/0 (a5c4f9a)
- 159-03: enrich seeds.ex with expired invite, grace Acme membership, pat passkey, FIXT-04 audit rows (332d3c7)
- 159-03: update seeds_test.exs — expired_invitations key, grace/pat/expired-invite tests (4261ad6)
- 159-04: add admin-coherence-sweep.spec.ts — behavior filmstrip + GATE-03 check (D-07) (8223496)
- 159-05: fix scope_ribbon class + add OrganizationLive ribbon call (8ed3ddc)
- 159-05: make GATE-03 motion check discriminating (WR-02) (8169478)
- 159-05: run coherence sweep Playwright spec + fix spec locator issues (31e05f8)
- 160-01: D-06 dark brand-strong WCAG-AA fix + Sigra.Admin shared helper (IN-03) (36bc1cf)
- 160-03: re-record 7 dark checkpoint baselines for D-06 brand-strong fix (e3cacd1)
- 179-01: critique-render.mjs + brandbook/README.md font provenance (BRAND2-04) (beebd16)
- 179-01: outline-wordmark.mjs — per-glyph SVG path generator (BRAND2-04) (d267b99)
- 179-02: add B1/B2 refined lockups and C1 stacked wildcard (3437b86)
- 179-02: add Direction A integrated typemark candidates A1-A4 (a6be5ca)
- 179-02: add round-3 gallery index and rationale README (16a6cdd)
- 180-01: add round-4 gallery index and README (b6256e9)
- 180-01: add round-4 rail-i refinement candidates (b9b5b64)
- 181-01: write D4 Linked Rail mark, monochrome, and favicon SVGs (8e52d20)
- 181-01: write D4 Linked Rail typemark SVGs (primary, dark, subtitle) (ee29553)
- 181-02: archive v1 social-card and write D4 v2 social cards (light + dark) (0445a98)
- 182-01: replace stale v1 mark geometry in landing-hero.svg + readme-header.svg (d9175d7)
- 182-02: add scripts/brand/axe-brandbook.mjs — committed axe WCAG gate (fadda96)
- 182-02: expand index.html — scorecard id, expanded #logo, new #suite section (a2a6684)
- 183-01: propagate D4 admin lockup SVGs to installer + example (71953c4)
- 183-01: replace companion marks with D4 abstract rail glyph geometry (33313ee)
Bug Fixes
- 154: correct app.css line citations shifted by sg-notice insertion (WR-01) (3c0f033)
- 155: add attr :class merge to notice/1 (WR-01/WR-02) (5ad22cd)
- 156: remove nested <p> in user_show notice call (code-review WR-01) (ad506c2)
- 157: match org overview skeleton shapes to replaced content (WR-02) (5806872)
- 158: reflect active quick-filter chip state + dark-mode contrast (b92777a)
- 159-01: replace <p> with <div> in notice/1 slot wrapper (org-notice-nested-p) (81eeeb5)
- 159-04: scope sg-filter-chip transition to pointer:fine devices (D-06 GATE-03) (1364d17)
- 159-05: WR-01 NaiveDateTime guard + WR-04 transaction result propagation (65f7ce1)
- 160-01: D-07 needs-review link + OR-filter fix, dedup needs_review/1 (IN-03) (e0df0f3)
- 160: wire needs_review filter into Flop param contract + scope-safe where (CR-01, WR-01) (8231f84)
- 179-02: apply variable-font axis coords in glyph outlining (ec2bd48)
- 179-02: remove double Y-flip in outlined glyph path data (5a02a27)
- ci: pin phx_new to 1.8.7 to restore green install/golden jobs (f5755a4)
- install: repair auth-context test binding + core template count (232b4e3)
- upgrade: guard organization migrations (073f8fe)
1.0.0 (2026-06-03)
Features
- 135-01: add forwarders config block and Threadline demo section in AGENTS.md (e4add7c)
- 135-01: add integration test asserting Sigra→Threadline projection chain (b39a9ba)
- 135-01: add Threadline dep + committed migrations (capture, semantics, governance) (22790c4)
- 137-01: add Sigra.OptionalDeps SOT module (OD-01) (de3f3f8)
- 138-01: implement Sigra.Doctor with injection seam, nine-feature matrix, and wiring checks (4c69dcf)
- 138-02: implement Mix.Tasks.Sigra.Doctor thin shell with ANSI output and exit gate (87b7c51)
- 139-01: create companion-lib recipe contract fixture (RCT-01) (c0a02c9)
- 141-01: add create_user_identities migration (cb89bc7)
- 141-01: add Example.Accounts.UserIdentity schema (d8a38c6)
- 141-02: create Example.Demo.Personas pure-data module (D-01, D-05) (cff3116)
- 141-03: implement Example.Demo.Seeds idempotent upsert orchestrator (af8d1d3)
- 141-04: add D-03 raise-guard + wire Example.Demo.Seeds.run/0 in seeds.exs (4359dd0)
- 142-01: add Personas.feature_map/0 — D-02 single source for feature copy (b14965d)
- 142-01: create ExampleWeb.Demo.CredentialsLive + add /demo/credentials dev route (6665257)
- 142-02: rebrand layouts.ex — Vaultr brand span + contextual nav (D-08, D-09, D-10) (cf96964)
- 142-02: rebrand root.html.heex with Vaultr page title (D-08) (d650804)
- 142-03: add Seeds.print_credentials/0 — D-11 stdout block using Personas.feature_map/0 (926e095)
- 143-02: add demo-showcase spec with 4 committed PNG baselines (5325aaf)
- 143-02: add demo-showcase-chromium project partition to playwright.config.ts (3239dd1)
- 143-02: add Run demo-showcase spec step to CI example_playwright_smoke job (b65978f)
- 144-02: copy screenshots to guides/assets/ and wire ExDoc config (5d1b6a4)
- 144-02: write demo-showcase.md guide and add ga-evidence.md pointer (7838a1f)
- 146-01: harden Hex publish truth and recovery gates (74dadfb)
- 146-02: add canonical 1.0 release runbook (d2da7f0)
- 147-01: add published-to-candidate upgrade smoke harness (430131d)
- 149-01: add alternatives comparison (d7a942c)
- 149-01: add launch announcement narrative (583ea52)
- 149-01: add launch evidence bundle (ed51883)
- 149-02: curate AI launch routing (6451cd8)
- 149-02: route launch pack through public docs (aa3c291)
- 64-02: ConfirmationCodeNotifier + dispatch_confirmation_code/5 (c7f06d9)
- 64-02: MagicLinkNotifier + dispatch_magic_link/4 (583e80c)
- 64-02: scaffold Sigra.Integrations.Chimeway + PendingDelivery ETS (c2a34b7)
- admin-ui: Cmd-K palette overlay CSS + hidden trigger in shell (Stage 7) (87e9d37)
- admin-ui: inject admin hooks into committed example bundle (Stage 7) (1452c5f)
- admin-ui: investigator-shaped audit — outcome select, date range, filter chips, severity pill, teaching empty (Stage 5) (92abb7c)
- admin-ui: jobs-first needs-led landing launcher + posture strip + capability surface (Stage 2) (2e5999e)
- admin-ui: plain-JS CmdK + CopyToClipboard hooks source + install template (Stage 7) (ba364d7)
- admin-ui: summary-first user detail — security facts strip + risk callout (Stage 4) (1b2e56c)
- admin-ui: tenant-marked scope chrome + sidebar nouns, fix shell test (Stage 1) (2ec5dd6)
- admin-ui: users-index craft — showing X-Y of Z, applied-filter chips, teaching empty states, truncate+tooltip, richer mobile card (Stage 3) (628ec60)
- admin: Morgan org-admin persona + multi-session seed enrichment (Stage 6) (425ae1c)
- admin: org member roster + pending-invitations data layer + real org overview (Stage 6) (c11a784)
Bug Fixes
- 134-01: correct verified API errors in companion-lib recipes (826e5a0)
- 134-01: remove auto-linked Sigra.Organizations.add_member/4 from accrue.md (8ba5893)
- 135-01: make Threadline forwarder test isolation-safe (d7e508e)
- 138: align Sigra.Doctor predicates to canonical config semantics (CR-01, WR-01..WR-06) (6c936a9)
- 139: correct rulestead.md policy example — guard
indoes not compile (e2a7b7d) - 140-03: remove broken hidden-function backtick links from doctor.ex and optional_deps.ex moduledocs (6f60743)
- 141-03: resolve code-review warnings in demo seeds (db8961d)
- 143-01: add Run demo seeds step to CI example_playwright_smoke job (98818f2)
- 143-01: grant platform-admin to admin@demo.vaultr.test in SigraAdminPolicy (4dfd9b8)
- 144.1-01: correct Step 2 comment in demo-showcase.spec.ts — no TOTP challenge (TD-05) (faf4787)
- 144.1-01: replace stale v0.2.0 tag URLs with v0.2.1 in ga-evidence.md (WR-01 / TD-02) (f0af6b4)
- 144.2: rename testInfo→_testInfo, fix ga-evidence link, drop ExDoc suppression (46cbc18)
- 144: address code review findings CR-01/WR-02/WR-03 (8943d56)
- 145: address release contract review warnings (a367c2b)
- 145: align Mailglass deliver arity docs (5e2b17d)
- 145: align remaining Mailglass arity doc (ba6c79a)
- 145: align unreleased changelog compare base (df83626)
- 145: close companion recipe review warnings (9dceb62)
- 145: link contract security details (028e579)
- 146: close release gate review findings (5d7e318)
- 147: normalize upgrade posture references (36017c2)
- 147: retarget upgrade smoke source series truth (166e6d1)
- 147: revise upgrade smoke planning posture (c92ecb7)
- 148: align doctor exit contract with evaluator docs (cdc736c)
- 148: close llms evaluator title verification gap (7b2f914)
- 148: generate llms evaluator showcase title (10eb29d)
- 149: address launch review warnings (df5a324)
- 149: align AI index launch links (acd0e22)
- 153-01: make scratch repo teardown idempotent (7f73b56)
- admin-ui: relabel Cmd-K trigger 'Jump to…' (avoid Search-button collision + UX clarity) + scope-chrome assertion tolerates tenant-marked chip (Stage 8) (2581fa4)
- ci: compile deps before the dep-off lane removes threadline (392ee7c)
- demo: correct Carol org_member metadata to :acme (WR-02) (bb5d667)
- demo: use on_conflict: :nothing in upsert_organization/2 (WR-03) (a70c84b)
- install: backport org-scoped router opts + Layouts.app wrapper to templates (6040a8f)
- install: guard enterprise SSO in session_controller behind organizations? (6e9b42b)
- install: guard local_password_reset_denied? deny clause behind organizations? (3badc58)
- test: checkout_repo! runs DDL unboxed so admin tables persist on fresh DB (128e731)
0.3.0 (2026-05-25)
Added
- passkeys: Added
Sigra.Passkeys.delete_with_posture/4andSigra.Passkeys.DeleteResultso hosts can distinguish ordinary passkey deletion from last-passkey recovery posture without re-querying state.
Changed
- passkeys: Generated-host settings and controller flows now encode passkey credential IDs in forms and routes, decode them on the server side, and surface clearer last-passkey deletion guidance after the delete completes.
- auth: Confirmation-link issuance now stores the hash of the transported confirmation token string, so
confirm_user/3can successfully look up valid emailed confirmation links after HMAC verification. - passkeys: Generated confirmation and MFA recovery flows now redirect and message users more honestly when bootstrapping a first passkey or recovering from a canceled, timed-out, or unsupported browser ceremony.
Fixed
- generator:
--no-passkeysinstalls no longer leak passkey bootstrap helpers or warning-cleanliness regressions into generated apps. - ci: Release-gate coverage and generator fixtures now align with the encoded passkey-id and delete-posture behavior shipped in the library and templates.
Roadmap traceability
- Planning milestone v1.26 PK-LIFECYCLE (phases 115–121) shipped on 2026-05-25; see
.planning/milestones/v1.26-ROADMAP.md,.planning/milestones/v1.26-REQUIREMENTS.md, and.planning/milestones/v1.26-MILESTONE-AUDIT.md.
Unreleased
Template Updates Required
When generator templates change, maintainers list the required upgrade command here. Adopters should run:
mix deps.update sigra
mix sigra.upgrade --yes
Documentation
- Architecture learning path: Added complementary outside-in architecture and inside-out code walkthrough guides for adopters and maintainers, including the generated-host ownership boundary, durable session model, and current implementation seams.
- Hex 1.0.0 launch pack: Added
docs/launch/v1.0/announcement.md,docs/launch/v1.0/alternatives.md, anddocs/launch/v1.0/evidence.mdas the canonical launch narrative, alternatives comparison, and compact evidence bundle for the public 1.0 release path. - Hex 1.0.0 release guidance: GitHub Release, README, HexDocs, and AI-consumption routing should point to
docs/launch/v1.0/announcement.mdas the source for who should upgrade now, who should wait, and where proof lives. - Mailglass integration posture (v1.29 DOC-01): Sigra ships no library-resident Mailglass adapter and no
--with-mailglassinstaller flag. The supported integration posture is recipe-only host-owned wiring: the host implementsSigra.Mailerand delegates to a Mailglass-backed module. Seeguides/recipes/companion-libs/mailglass.mdfor the current supported configuration. - v1.0 adopter routing: Existing pre-1.0 adopters should start with
guides/introduction/upgrading-to-v1.0.mdfor the historical v1.0 cutover flow. - Migration lane (
phx.gen.auth): Existingphx.gen.authteams should useguides/introduction/migrating-from-phx-gen-auth.mdfor boundary-first migration guidance. - Migration lane (Pow/Guardian/Ueberauth): Existing Pow/Guardian/Ueberauth teams should use
guides/introduction/migrating-from-pow-guardian-ueberauth.mdfor boundary-first migration guidance.
Changed
- BREAKING (installer): Postgres installs now put Sigra-owned auth tables in the
authschema by default. Pass--auth-prefix publicto intentionally generate the previous public-schema placement; MySQL and SQLite remain unprefixed.
0.2.5 (2026-04-25)
Changed
- mfa: When
:audit_schemais configured,Sigra.MFA.confirm_enrollment/5writesmfa.enroll.failurefor invalid TOTP (pre-enrollment DB work) insideRepo.transaction/1viaEcto.Multi+Sigra.Audit.log_multi_safe/3, using the samecommit_ad_hoc_mfa_audit/5shell as other MFA ad-hoc audits (AUD-20-01 / AUD-04-022). The caller still receives{:error, :invalid_code}regardless of audit insert outcome; audit failures emit[:sigra, :audit, :log_safe_error]. Evidence:test/sigra/mfa_audit_atomicity_test.exs. - jwt: When
:audit_schemais configured,Sigra.JWT.refresh/3(andSigra.Auth.refresh_jwt/2) runs refresh-tokenuser_tokenspersistence andapi.jwt_refresh/api.jwt_refresh_reuseaudit inserts in a singleRepo.transaction/1viaEcto.Multi+Sigra.Audit.log_multi_safe/3(persistence + audit co-fate / AUD-08 for the guided path). Any step failure in that transaction returns{:error, :jwt_refresh_aborted}instead of issuing new tokens without a matching audit row. Evidence:test/sigra/jwt_refresh_audit_cofate_test.exs. - jwt: Refresh-token classify/revoke paths now base64url-decode the raw refresh token before hashing, so malformed or non-decodable inputs return
{:error, :invalid_token}instead of hashing the encoded wrapper bytes. - audit: When
:audit_schemais configured,Sigra.APIToken.audit_jwt_refresh/2andaudit_jwt_refresh_reuse/2writeapi.jwt_refresh/api.jwt_refresh_reuseinsideRepo.transaction/1via audit-onlyEcto.Multi+Sigra.Audit.log_multi_safe/3(audit-row atomicity only — standalone helpers; preferJWT.refresh/3for co-fate so audit is not double-emitted). - audit: When
:audit_schemais configured,Sigra.Account.clear_password_change_requirement/3clearsmust_change_passwordand writesaccount.password_change(metadata: %{forced: true}) in oneRepo.transaction/1viaEcto.Multi+Sigra.Audit.log_multi_safe/3.Sigra.Account.audit_forced_password_change/2is deprecated for that path — do not call both or you may duplicate audit rows. - audit: When
:audit_schemais configured,Sigra.APIToken.verify/2now writesapi.token_verify.failureaudit rows insideRepo.transaction/1viaEcto.Multi+Sigra.Audit.log_multi_safe/3(invalid, revoked, and expired branches). Success remains telemetry-only (D-27). Insert failures emit[:sigra, :audit, :log_safe_error](:invalid_changesetor:constraint_violation) while the caller still receives{:error, reason}.
Documentation
- planning: Milestone v1.19 (phase 83, AUD-20) — AUD-04-022 + EX-44-02 appendix, 09-VERIFICATION C-1 row 022, 09-03-SUMMARY, 44-AUD-04-INVENTORY for
Sigra.MFA.confirm_enrollment/5invalid-code transactional audit. See.planning/phases/83-mfa-confirm-enrollment-022/83-VERIFICATION.md. - planning: Milestone v1.19 (phase 82, AUD-19) — AUD-04-048 / 049 + 09-VERIFICATION C-1 rows, 44/45 inventories, 09-03-SUMMARY for
Sigra.JWT.refresh/3persistence + audit co-fate; AUD-08 closure for guidedJWT.refreshpath. See.planning/phases/82-jwt-refresh-persistence-audit-cofate/82-VERIFICATION.md. - planning: Milestone v1.18 (phase 81, AUD-18) — AUD-04-048 / 049 + 09-VERIFICATION C-1 rows, 44/45 inventories, 09-03-SUMMARY note for transactional JWT refresh/reuse audit in
lib/sigra/api_token.ex; AUD-08 explicitly out of scope. See.planning/phases/81-jwt-refresh-audit-atomicity/81-VERIFICATION.md. - planning: Milestone v1.17 (phase 80, AUD-17) — AUD-04-043 / EX-44-05 closure: 44-AUD-04-INVENTORY, 09-VERIFICATION C-1 row 043, 09-03-SUMMARY note; forced-clear audit atomicity in
lib/sigra/account.ex. See.planning/REQUIREMENTS.md. - planning: Milestone v1.16 (phase 79, AUD-16) — 44-AUD-04-INVENTORY + 09-VERIFICATION C-1 rows AUD-04-044..046 aligned to transactional
verify/2inlib/sigra/api_token.ex; 09-03-SUMMARY bounded-batch note; EX-44-01 verify slice retired. See.planning/REQUIREMENTS.mdand.planning/phases/79-api-token-verify-failure-audit/79-VERIFICATION.md. - planning: Milestone v1.15 (phase 78, AUD-14) — 44-AUD-04-INVENTORY + 09-VERIFICATION C-1 rows for AUD-04-035..042 and 047 aligned to
lib/sigra/account.ex/lib/sigra/api_token.ex; 09-03-SUMMARY bounded-batch note. See.planning/phases/78-account-api-c1-planning-truth/78-VERIFICATION.md.
Added
- tests:
test/sigra/jwt_refresh_audit_cofate_test.exscoversSigra.JWT.refresh/3persistence + audit co-fate (happy path, audit-off, reuse + audit,CHECKfault injection on happy and reuse branches). - tests:
test/sigra/api_token_audit_atomic_test.exscoversapi.jwt_refresh/api.jwt_refresh_reuse(happy path, audit-off,CHECKfault injection +log_safe_errortelemetry). - tests:
test/sigra/api_token_audit_atomic_test.exscoversapi.token_verify.failurefor invalid / revoked / expired paths plus audit-table fault injection (constraint / telemetry parity). - tests:
test/sigra/account_audit_atomicity_test.exsexercisesSigra.Account.request_email_change/4,confirm_email_change/3, andcancel_email_change/3with PostgresCHECKfault injection so domain mutations roll back when the pairedaccount.email_change_*audit insert is rejected — complements AUD-04-035..037 C-1 evidence alongsidechange_password. - tests:
test/sigra/account_audit_atomicity_test.exscoversSigra.Account.clear_password_change_requirement/3(happy path, audit-off branch, andaccount.password_changeCHECKrollback) for AUD-04-043 / AUD-17.
0.2.4 (2026-04-24)
Changed
- audit:
Sigra.MFA.audit_backup_codes_regenerate/3andSigra.MFA.audit_trust_browser/2now emit audit rows viaEcto.Multi+Sigra.Audit.log_multi_safe/3insideRepo.transaction/1when:audit_schemais configured (bounded SEED-002 closure for AUD-04-033 / AUD-04-034;regenerate_backup_codes/4remains the authoritative rotation path).
Fixed
- audit:
commit_ad_hoc_mfa_audit/5rescuesEcto.ConstraintError(and related DB constraint failures) when the audit insert is rejected at the database layer without a matching changeset constraint, preservinglog_safe/3-class behavior: emit[:sigra, :audit, :log_safe_error]withreason: :constraint_violationand return:ok.
Documentation
- planning: v1.11 adoption stabilization — triage notes (
.planning/v1.11-TRIAGE.md),upgrading-to-v1.11.md, ExDoc extras, intro upgrade cross-links, andMAINTAINING.mdmilestone pause guidance (STAB-01..STAB-04). - planning: v1.12 trust bundle — upgrading-to-v1.12.md (ExDoc extra), docs/uat-ci-coverage.md (v1.12 launch evidence subsection), and milestone UAT index on GitHub (TRN-01..TRN-03 doc polish).
Roadmap traceability
- Planning milestone v1.14 (phase 77, AUD-13) — operator-trust slice for MFA ad-hoc audit atomicity; see
.planning/milestones/v1.14-ROADMAP.md.
0.2.3 (2026-04-23)
Bug Fixes
0.2.2 (2026-04-23)
Bug Fixes
0.2.1 (2026-04-23)
Features
- 053-01: add Hex docs link and ExDoc publish reminder (3362bf0)
- 053-01: refresh Hex description for PUB-01 (acd275e)
- 06-01: add MFA deps, config, error types, and Credential struct (52a25f4)
- 06-01: implement MFA orchestrator, BackupCodes, Trust, and Lockout modules (e913806)
- 06-02: add MFA-aware authenticate flow and complete_mfa_verification (db192a1)
- 06-02: add RequireMFA and RequireMFAEnrolled plugs with mfa_pending session type (d3bb45b)
- 06-03: add MFA telemetry event catalog and integration (826945c)
- 06-03: add MFA testing helpers and TokenCleanup mfa_pending extension (bf17b7c)
- 06-04: add MFA email templates, Auth context delegation, and test fixtures (8a93edb)
- 06-04: add MFA migration tables and generated Ecto schemas (e66b8f4)
- 06-05: add MFA challenge page templates (controller + HTML + LiveView) (8efd59d)
- 06-05: add MFA settings templates, require_mfa plug, and generator wiring (89cc608)
- 07-01: APIToken module and RequireScopes plug with full test coverage (953adbe)
- 07-01: config extensions, StringList type, ScopeRegistry, error types, telemetry events (e1e0e39)
- 07-02: add Joken dependency, ClaimsBuilder behaviour, and Signer module (8c79f0c)
- 07-02: add JWT module and RefreshToken with family-based reuse detection (2d00c6e)
- 07-03: add Auth delegation, TokenCleanup extension, Testing helpers, Email notification (611e5f6)
- 07-03: rewrite FetchBearer with auto-detection and scope assignment (425527a)
- 07-04: add API controllers, email template, injector, and install task (86f9be4)
- 07-04: add API token migration and schema templates (9b13525)
- 08-01: add config extensions, email templates, and data export behaviour (cd3ef15)
- 08-01: implement hooks engine with Ecto.Multi integration and tests (b635995)
- 08-02: add Account orchestrator with unified delegation API (44ea30a)
- 08-02: implement Account Deletion module with 3 strategies (cd31c37)
- 08-02: implement EmailChange and PasswordChange modules (601d35f)
- 08-03: add telemetry events and Auth module lifecycle delegation (34e6f2b)
- 08-03: implement RequirePasswordChange plug and AccountDeletion Oban worker (6c26dce)
- 08-04: add 7 account lifecycle email templates (36363df)
- 08-04: auth context lifecycle delegation and hooks stub module (ada92fb)
- 08-04: migration template, user schema, and token TTL for account lifecycle (21332d3)
- 08-05: add generator injector for lifecycle routes, plugs, and tests (ba5d3c5)
- 08-05: add settings LiveView, reactivation page, and lifecycle testing helpers (61112c9)
- 09-01: add audit_events migration template (02ae340)
- 09-01: add AuditEvent schema template and wire install task (bd3f69f)
- 09-02: add Sigra.Audit changeset, cursor, query submodules (01f75de)
- 09-02: add Sigra.Audit public API (ce6dc7c)
- 09-03: integrate audit logging into auth + session + security subsystems (0724d96)
- 09-03: integrate audit logging into mfa + oauth + api_token + account (68e222c)
- 09-04: add Sigra.Workers.AuditCleanup Oban worker and startup warning (a01a25c)
- 10-01: add audit test helpers and section headers to Sigra.Testing (d891e2b)
- 10-02: add scenario fixtures to AuthFixtures template (24ecd7c)
- 10-03: add :cookie_domain config + Sigra.MFA.Trust.cookie_opts/1 (080fd4f)
- 10-03: runtime remember_me_options in UserAuth + MFA trust cookie + boot warning (4aa7030)
- 10-05: add pure helpers + doctests to Config/Auth/Testing (fa57f1e)
- 10-06: scaffold test/example Phoenix app with Sigra installed (2f1790e)
- 10.1.1-03: unify example app on Sigra canonical user_sessions store (B6, D-06/D-07) (ddf7b94)
- 10.1.1-05: flip installer default to binary_id (uuid) PKs (D-10) (d1d2c40)
- 10.1.1-06: add --yes non-interactive flag to sigra.install (2b15e81)
- 10.1.1-06: add install_smoke + example_http_smoke CI jobs (ae37e78)
- 10.1.1-06: add install-smoke.sh and http-smoke.sh CI drivers (c082ab3)
- 10.1.1-07: add data-testid hook to MFA TOTP secret (7dd8e25)
- 10.1.1-07: scaffold Playwright golden-path browser smoke harness (24e8c7c)
- 41: TOTP-gated backup code rotation and GA-01 regression (e5f399e)
- 43-02: atomic auth.register.success audit via register_user_multi (d2e6efb)
- 43-03: atomic magic-link and password-reset request audits via Multi (149ab89)
- 43-04: atomic auth.login.success audit with lockout Multi (3bc7811)
- 49-01: add mix ci.audit_45 alias for AUD-08 merge gate (3adb5fe)
- 50-01: add mix ci.install_golden alias for install golden tests (ba8ca30)
- audit: add audit_multi_step for multi-row Multi audits (a642496)
- mfa: atomic audit Multis for AUD-06 (MFA) (3d5abf1)
- uat: add Docker UAT environment + runbook for milestone v1.0 manual gates (812eca0)
Bug Fixes
- 05: enforce sudo mode on link_provider and unlink_provider (T-05-12) (802b2da)
- 05: WR-04 remove dead code branch in detect_context_name (77f61b5)
- 05: WR-05 document encrypted_* field naming convention in get_tokens (fa53680)
- 06: add Code.ensure_loaded! to function_exported? tests for isolation safety (61826f8)
- 06: add settings_url binding to email template test for MFA emails (86f9759)
- 06: correct struct syntax for Ecto.Changeset.cast in MFA enrollment (b968a86)
- 06: CR-01 use Ecto cast to trigger cloak_ecto encryption for TOTP secrets (3c74dc8)
- 06: CR-02 eliminate modulo bias in backup code and confirmation code generation (66f1d3b)
- 06: WR-01 wrap MFA enrollment and cleanup in Ecto.Multi transactions (41b3899)
- 06: WR-02 combine lockout increment and lock into single atomic query (59f6d78)
- 06: WR-03 align MFA pending state checks between controller, LiveView, and library plugs (84fd485)
- 06: WR-04 add missing settings_url binding for mfa_disabled_email template (a73c46a)
- 06: WR-05 pass required options to setup_totp and simulate_mfa_lockout in fixtures (d8bf183)
- 06: WR-06 handle trailing slashes in RequireMFA path comparison (c1f5e89)
- 07: revise plans based on checker feedback (2fd57a5)
- 08-05: update migration test to match partial unique index from Plan 04 (6037d26)
- 08: CR-01 add missing callback fns to email change request and cancel flows (befa404)
- 08: CR-02 add missing callback fns to email change confirm flow (d8f7d08)
- 08: CR-03 add missing validate_password_fn to password change flow (9903b78)
- 08: WR-01 execute hook multi instead of discarding it (4152725)
- 08: WR-02 document TTL-based cleanup for orphaned email change tokens (5285e68)
- 08: WR-03 include email and hashed_password in deletion_changeset for anonymize strategy (6b775d0)
- 08: WR-04 validate deletion strategy against known values with safe default (debe7fc)
- 09: CR-01 harden validate_metadata_size against non-map and unencodable metadata (58120a9)
- 09: WR-02 raise in Sigra.Audit.stream/2 when repo.stream/1 is unavailable (78a3474)
- 09: WR-06 WR-07 honor configured retention and batch cleanup deletes (065076f)
- 09: WR-08 WR-01 sanitize log_safe error telemetry + surface missing repo (41ec4a0)
- 10-review: CR-01 guard Mix.env() in generated UserAuth remember_me_options (7a922e7)
- 10-review: WR-01 correct MFA guide function references (fc43f52)
- 10-review: WR-02 preserve false/nil in assert_audit_event metadata lookup (138777c)
- 10-review: WR-03 make Sigra.MFA.Trust.cookie_opts/0 raise to prevent silent cookie_domain drop (009d424)
- 10-review: WR-04 oauth_enabled? requires at least one configured provider (1aae029)
- 10.1 IN-01,IN-02: robust migration timestamp offsets and pad/1 cleanup (8d031be)
- 10.1 IN-03: route password reset through Sigra.Auth.reset_password/4 (90d7adb)
- 10.1 IN-05: stop passing :secret_key_base to verify_confirmation_code/3 (7eef6d8)
- 10.1 IN-06 follow-up: move helper after handle_event clauses to satisfy --warnings-as-errors (d64177f)
- 10.1-01: build proper UserToken structs in request_password_reset and request_magic_link (10c7cf9)
- 10.1-02: backport installer template fixes #1-8 (0ab0d04)
- 10.1-02: backport installer template fixes #9-16 (b19bdf3)
- 10.1-03: eliminate mix docs --warnings-as-errors
@docreference warnings (b1f49d3) - 10.1-05: scenario/2 raises ArgumentError with valid atoms on unknown scenarios (95987e2)
- 10.1-06: delete aspirational cursor_portability_test (182edbf)
- 10.1-06: generator_reset_test stale alias assertion (81d66fd)
- 10.1-06: sigra.install_test bindings — stale after plan 10.1-02 (32dbae1)
- 10.1.1-02: fix /users/sudo KeyError on render (B7, D-08) (388856f)
- 10.1.1-02: wire confirmation email in RegistrationLive (B5, D-05) (fbdc743)
- 10.1.1-04: replace LoginLive with plain SessionController + SessionHTML (B9/D-12) (ba66d76)
- 10.1.1-05: flip test/example to uuid PKs end-to-end (B8 root fix) (949f182)
- 10: revise plans per checker iteration 1 feedback (c70ec28)
- 44: document APIToken.revoke/2 changeset error in typespec (8df3957)
- 49-01: scope ci.audit_45 to one multi-path mix test (c658a74)
- docs: include Nyquist matrix extra for ExDoc link validation (cac5a01)
- example: JS bundle + endpoint socket + router auth pipeline (58b7122)
- mfa: correct Ecto.Multi.merge arity for lockout audit Multis (09e2263)
- MFA: handle cleanup Multi errors in disable flows (2e1d309)
- Chore: Root
.formatter.exsno longer scanstest/example/_build(and other generated trees) where Hex-copied*.exinstall templates are not valid Elixir — restores reliablemix format --check-formattedfor contributors. - Human GA (v1.4): see .planning/v1.4-GA-UAT.md
- AUD-04: Auth
log_safe→Ecto.Multimigration inventory forSigra.Auth(prioritizedAUD-05batches B1–B3, exclusions, grep evidence) in43-AUD-04-INVENTORY.md(tag snapshot). - AUD-04 (continuation): MFA + Account + API token inventory (AUD-04-020+,
AUD-06/AUD-07batches) in44-AUD-04-INVENTORY.md(tag snapshot). - AUD-08 / Phase 45: OAuth + ops + worker AUD-04 slice (AUD-04-050+) in
45-AUD-04-INVENTORY.md(tag snapshot). - AUD-05 (Auth): When
:audit_schemais configured, success audits forauth.register.success, magic-link and password-reset request/verify flows, and confirmed-passwordauth.login.success(including lockout reset and optional hash upgrade) are written in the sameRepotransaction as the associated data changes viaEcto.MultiandSigra.Audit.log_multi_safe/3.
Roadmap traceability
Planning milestone v1.4 (GA readiness & audit trail completeness; not a Hex version): shipped 2026-04-22 per .planning/MILESTONES.md — see .planning/milestones/v1.4-ROADMAP.md, .planning/milestones/v1.4-REQUIREMENTS.md, .planning/milestones/v1.4-MILESTONE-AUDIT.md, and the GA matrix framing in .planning/v1.4-GA-UAT.md (Executed / Waived language; do not duplicate the matrix here).
0.2.0 - 2026-04-19
Roadmap traceability
Planning milestone v1.3 (cleanup & hardening tranche; not a Hex version): shipped 2026-04-19 per .planning/MILESTONES.md — see .planning/milestones/v1.3-ROADMAP.md, .planning/milestones/v1.3-REQUIREMENTS.md, and .planning/milestones/v1.3-MILESTONE-AUDIT.md.
Added
docs/NEXT-STEPS-MANUAL.md— short post-merge checklist (PR merge, Hex, GitHub Release) for maintainers.docs/audit-semantics.md— public note onlog/log_multi/log_safe, C-1 hybrid status, and pointers to testing helpers (linked from README).Sigra.Audit.Assertions— orderedlatest_audit_event/3+assert_audit_fields/3for tests; seeguides/recipes/testing.md.- Atomic
api.token_createaudit viaEcto.Multi/Sigra.Audit.log_multi_safe/3inSigra.APIToken(telemetry fromemit_telemetry_from_changes/1on successful commit only). - Example app smoke tests assert login and MFA enrollment audit rows; host
get_user_by_email_and_password/2now delegates toSigra.Auth.authenticate/2with fullSigra.Configsoauth.login.*audit runs. - Human GA matrix in
v1.3-HUMAN-UAT.mdclosed via machine substitutes; see.planning/uat-evidence/v1.3.0/INDEX.mdfor CI anchors and per-item evidence. - GA UAT shift-left:
docs/uat-ci-coverage.mdmaps SEED-001 items to CI and documents residual human checks;test/example/priv/playwright/tests/ga-uat-shift-left.spec.tscovers invitation email-lock and MFA regenerate UI reachability; example app gainsEmailsLifecycleHtmlTest;scripts/ci/getting-started-contract.shplusgetting_started_uat_contractCI job validate getting-started links/commands. - Generated and example
MFASettingsLiveregenerate form uses an explicittype="submit"on the regenerate button so LiveViewphx-submitfires reliably. - Published to Hex.pm as 0.2.0 (initial package listing).
0.1.0 - 2026-04-17
First library version line with Hex-oriented mix.exs packaging; upgrade to 0.2.0 for the Hex listing and additions above.
Roadmap traceability
Planning milestone v1.2 (admin dashboard tranche; not a Hex version): shipped 2026-04-17 per .planning/MILESTONES.md — see .planning/milestones/v1.2-ROADMAP.md, .planning/milestones/v1.2-REQUIREMENTS.md, and .planning/milestones/v1.2-MILESTONE-AUDIT.md.
Changed
- BREAKING (behavior):
session.createaudit now fires AFTERselect_active_organizationduring login, so the very first audit event of a successful login carries the realorganization_idrather than anilone. Previously,session.createfired before the active-org selection step and always had a null org, meaning the v1.2 impersonation anchor would have no tenant to pin against. If you were relying on the old ordering (e.g. a log scraper keyed on null-org events for login detection), update your consumers to match the new ordering. - BREAKING (API):
Sigra.Audit.Query.build/2now raisesArgumentErroron unknown filter keys instead of silently ignoring them. If your host app was passing an unknown key (e.g.actor:instead ofactor_id:) the query previously returned unfiltered results — now it fails loudly. Rationale: silent-ignore on an audit query is a security-adjacent bug; audit systems must be loud about misconfiguration. - BREAKING (installer):
Sigra.Workers.AccountDeletionjob args now require five additional stringified keys at enqueue time:"organization_id","actor_id","scope_module","organization_schema", and"audit_schema". Host apps that use the Sigra installer to generate the account-deletion Oban enqueue site should regenerate that site (or manually add the new args). The worker validates presence of all five viafetch_arg!/2up front BEFORE anyModule.safe_concatcall so theKeyErrorsurfaces with the actual missing key.
Fixed
- Hex package
fileslist includespriv/(installer, upgrade, and OAuth generator templates) somix sigra.install/mix sigra.upgradework when the dependency is pulled from Hex.
Added
Sigra.Audit.log_safe/3accepts a scope as the second positional argument. The scope is duck-typed on%{user, active_organization, impersonating_from}; passnilexplicitly for pre-authentication or truly anonymous call sites.log_safe/2remains as a thin shim that delegates tolog_safe/3with anilscope.Sigra.Audit.Querysupports:organization_id,:effective_user_id, and:organization_scopefilters.:organization_scopeaccepts{:only, org_id}or{:including_global, org_id}tagged tuples. The composite index(organization_id, inserted_at)is created onaudit_eventsby the new alter migration to keep org-scoped queries off seq-scan plans at scale.Sigra.Scope.build/3library constructor for the host-app%Scope{}struct, used by login-time scope synthesis and by Sigra-aware workers. Also addsSigra.Scope.from_opts/2andSigra.Scope.from_config/2convenience constructors.Sigra.Workersbehaviour — single@callback perform(scope, args)contract for Oban workers requiring tenant context.Sigra.Workers.new/3fails fast when required"organization_id"/"actor_id"arg keys are absent;Sigra.Workers.fetch_arg!/2is a belt+suspenders helper for workerperform/1implementations.Sigra.Workers.AccountDeletionis the reference implementation — it reconstructs the scope insideperform/1and delegates toperform/2with a real%Scope{}.Sigra.Testing.assert_audit_logged/2helper — a thin alias forassert_audit_event/2with the REQ DX-02 naming convention. Signature is(map, keyword)to matchassert_audit_event/2exactly.- Custom Credo check
Sigra.Credo.NoLogSafe2InLibthat forbids arity-2Sigra.Audit.log_safecalls inlib/sigra/**(with an exception for the shim definition itself and fortest/**). Registered in.credo.exsvia therequires:field so host apps pulling Sigra as a dep are not forced to take a Credo dependency. - New migration
alter_audit_events_add_org_columns.exsaddsorganization_id :binary_id(nullable, FK withon_delete: :nilify_allso historical rows survive organization deletion) andeffective_user_id :binary_id(nullable, v1.2 impersonation anchor) columns toaudit_events, plus the composite index(organization_id, inserted_at). On Postgres, the migration uses@disable_ddl_transaction true+create index(..., concurrently: true)for zero-downtime deploy on production audit tables. On SQLite/MySQL, a plainchange/0migration emits the same shape non-concurrently.