• v0.3.0 40b163128c

    v0.3.0
    All checks were successful
    Build Web image / Build and push Web image (push) Successful in 54s
    Build API image / Build and push API image (push) Successful in 13m52s
    Stable

    nrupard released this 2026-06-22 19:54:27 +02:00 | 815 commits to main since this release

    Changelog

    2944919 Merge pull request 'Release v0.3.0' (#185) from release/v0.3.0 into main
    ea039f7 Release v0.3.0
    876275b Merge pull request 'fix(e2e): surface bunyip login error + stop login-bearing retries (BUNYIP-165)' (#184) from fix/BUNYIP-165-login-error-surface-no-retry into main
    50cf786 fix(e2e): surface bunyip login error + stop login-bearing projects retrying
    5a1c7ca Merge pull request 'docs(e2e): step 4 reuse the mokosh-apps OIDC client (BUNYIP-148)' (#183) from docs/bunyip-148-runbook-oidc-client-reuse into main
    f7aa167 docs(e2e): step 4 - reuse the mokosh-apps OIDC client, not a bunyip-web one
    136ad6b Merge pull request 'fix(e2e): bunyip-e2e-bootstrap ON CONFLICT match partial unique index (BUNYIP-161)' (#182) from fix/BUNYIP-161-bootstrap-partial-index-conflict into main
    bf5dd18 fix(e2e): match the partial unique index in bunyip-e2e-bootstrap upsert
    437fabc Merge pull request 'docs(e2e): clarify Infisical password retrieval in the runbook (BUNYIP-148)' (#181) from docs/bunyip-148-e2e-infisical-password into main
    42cb25d docs(e2e): clarify the Infisical password retrieval in the runbook
    af13138 Merge pull request 'build(oci): ship bunyip-e2e-bootstrap in the bunyip-api runtime image (BUNYIP-156)' (#180) from feat/BUNYIP-156-ship-e2e-bootstrap-binary into main
    c096587 build(oci): ship bunyip-e2e-bootstrap in the bunyip-api runtime image
    ab3dacc Merge pull request 'feat(e2e): Playwright E2E suite for bunyip against deployed instances (BUNYIP-148)' (#179) from feat/BUNYIP-148-e2e-playwright-suite into main
    689bb9e docs(e2e): add first-time setup runbook to dev-docs/e2e.md
    b73a2d8 fix(e2e): strip trailing slash on base URLs + tighten consent-form assertion
    1370992 feat(e2e): Playwright E2E suite for bunyip against deployed instances
    0fcb0e0 Merge pull request 'chore: Sync the checks and justfile recipes' (#178) from chore/sync-checks-justfile into main
    f8a7890 chore: Sync the checks and justfile recipes
    54b5276 Merge pull request 'fix(oidc): clear stale host-only op_session on silent-SSO set path (BUNYIP-146)' (#177) from fix/bunyip-146-op-session-cookie-domain into main
    a83ca28 test(oidc): pin path+secure equality in op_session_set dual-emit test (BUNYIP-146)
    f3223a4 fix(oidc): clear stale host-only op_session on silent-SSO set path (BUNYIP-146)
    e7aceb2 Merge pull request 'feat(events): SSE event bus + browser auto-reconciliation (BUNYIP-145)' (#176) from feat/bunyip-145-sse-event-bus into main
    47d5fc9 feat(events): SSE event bus + browser auto-reconciliation (BUNYIP-145)
    0c808cd Merge pull request 'fix(admin): revoke refresh-tokens on claim-feeding mutations (BUNYIP-144)' (#175) from fix/bunyip-144-revoke-rt-on-claim-mutations into main
    aae2c9c fix(admin): revoke refresh-tokens on claim-feeding mutations (BUNYIP-144)
    7cfc27b Merge pull request 'feat(ci): cap native check.yml parallelism at nproc/2' (#174) from feat/GOV-10-native-check-nproc-cap into main
    990d61a feat(ci): cap native check.yml parallelism at nproc/2
    a2f7b4c Merge pull request 'fix(migrations): auto-reconcile BUNYIP-79 in-place-edited checksums at startup' (#173) from fix/bunyip-79-migration-checksum-reconcile into main
    4b971c7 fix(migrations): auto-reconcile BUNYIP-79 in-place-edited checksums at startup
    61681bb Merge pull request 'chore: rename LICENSE.md to LICENSE (BUNYIP-143)' (#171) from chore/rename-license-file into main
    9d0ec19 chore: rename LICENSE.md to LICENSE
    31cde4d Merge pull request 'feat(profile-B): OIDC profile+phone scopes, consent screen, claim emission (BUNYIP-140)' (#170) from feat/bunyip-140-oidc-profile-scopes into main
    bf7a8fb feat(profile-B): OIDC profile+phone scopes, consent screen, claim emission (BUNYIP-140)
    9133dc9 Merge pull request 'feat(profile-A): users.first_name/last_name/phone columns + Settings UI (BUNYIP-139)' (#169) from feat/bunyip-139-user-profile-fields into main
    c9b86eb feat(profile-A): users.first_name/last_name/phone columns + Settings UI (BUNYIP-139)
    05c728f Merge pull request 'feat(oidc): register lets-chat-psa as confidential OIDC client (LC-22)' (#168) from feat/lc-22-register-lets-chat-oidc-client into main
    c65e640 feat(oidc): register lets-chat-psa as confidential OIDC client (LC-22)
    0efcf6e Merge pull request 'fix(dev): create external network in ensure-env for clean clone' (#167) from fix/pre-commit-clean-clone into main
    7f134ff Merge branch 'main' into fix/pre-commit-clean-clone
    4172b80 Merge pull request 'fix(admin): expose API-editable application fields and reorder in the edit/list UI' (#159) from fix/BUNYIP-121-application-edit-fields into main
    907882e fix(admin): expose API-editable application fields and reorder in the edit/list UI
    d757a96 fix(dev): create external network in ensure-env for clean clone
    7339efe Merge pull request 'feat(auth): trusted devices to skip TOTP + sensitive-op re-prompt' (#166) from feat/bunyip-138-trusted-devices into main
    2f1ba44 feat(auth): trusted devices to skip TOTP + sensitive-op re-prompt
    abf7d4d Merge pull request 'feat(auth): session hardening - panel, role-change revoke, admin TTL/idle' (#165) from feat/bunyip-137-session-hardening into main
    8d1dd4a fix(auth): clamp admin refresh deadline to the stricter window on rotation
    c1f7892 feat(auth): session hardening - panel, role-change revoke, admin TTL/idle
    2f718af Merge pull request 'feat(web): add public /roadmap coming-soon page' (#164) from feat/bunyip-136-roadmap-page into main
    bd4fbab feat(web): add public /roadmap coming-soon page
    6f6aef1 Merge pull request 'fix(settings): wire up resend verification email control' (#161) from fix/BUNYIP-110-resend-verification-email into main
    bbc4781 Merge branch 'main' into fix/BUNYIP-110-resend-verification-email
    22ee93c Merge pull request 'fix(admin): allow editing and resending a sent feedback response' (#160) from fix/BUNYIP-123-feedback-response-edit-resend into main
    3fb428e Merge branch 'main' into fix/BUNYIP-123-feedback-response-edit-resend
    023caa3 Merge pull request 'fix(admin): make the Memberships surface editable with grant/revoke' (#158) from fix/BUNYIP-118-membership-edit-route into main
    53d641f Merge branch 'main' into fix/BUNYIP-118-membership-edit-route
    cd3f494 Merge pull request 'feat(admin): add reactivation affordance + endpoint for suspended users' (#157) from feat/BUNYIP-120-admin-user-reactivate into main
    c8e2416 Merge branch 'main' into feat/BUNYIP-120-admin-user-reactivate
    6cafb9b Merge pull request 'fix(api): drop permissive CORS allowed_origin_fn (origin reflection)' (#156) from fix/BUNYIP-124-cors-origin-reflection into main
    0755bec Merge branch 'main' into fix/BUNYIP-124-cors-origin-reflection
    0d612ea Merge pull request 'feat(admin): edit email, force-verify, and clear 2FA on user detail' (#155) from feat/BUNYIP-119-admin-user-edit-email-2fa into main
    e9b2914 Merge branch 'main' into feat/BUNYIP-119-admin-user-edit-email-2fa
    4d985a3 Merge pull request 'fix(admin): validate tier-settings slots/trial input and surface save errors' (#154) from fix/BUNYIP-111-tier-settings-validation into main
    868f603 Merge branch 'main' into fix/BUNYIP-111-tier-settings-validation
    4da02c7 Merge pull request 'fix(web): Stripe key format, change-email/2FA edge, feedback-respond cap (BUNYIP-117)' (#163) from fix/web-edge-117-validation-and-error-surfacing into main
    3246e38 Merge pull request 'fix(web): edge validation hardening + tier Stripe IDs (BUNYIP-112/113/115/122)' (#162) from fix/web-validation-bundle into main
    b4dcaa0 fix(web): Stripe key format, change-email/2FA edge, feedback-respond cap (BUNYIP-117)
    16b8591 fix(web): edge validation hardening + tier Stripe IDs (BUNYIP-112/113/115/122)
    1a32883 fix(settings): wire up resend verification email control
    c4d71c7 fix(admin): allow editing and resending a sent feedback response
    276f009 fix(admin): make the Memberships surface editable with grant/revoke
    acce4f9 feat(admin): add reactivation affordance + endpoint for suspended users
    ab3c397 fix(api): drop permissive CORS allowed_origin_fn (origin reflection)
    d63840c feat(admin): edit email, force-verify, and clear 2FA on user detail
    59c5b49 fix(admin): validate tier-settings slots/trial input and surface save errors
    19f4749 Merge pull request 'fix(admin): reject unknown roles in the user-role change handler (BUNYIP-114)' (#153) from fix/BUNYIP-114-role-enum-validation into main
    fb44e45 fix(admin): reject unknown roles in the user-role change handler
    f3f7746 Merge pull request 'fix(settings): require a non-empty password to delete an account (BUNYIP-116)' (#152) from fix/BUNYIP-116-delete-account-require-password into main
    28283ec fix(settings): require a non-empty password to delete an account
    a8463f9 Merge pull request 'fix(feedback): record originating page via ?from= on the feedback launcher (BUNYIP-104)' (#150) from fix/BUNYIP-104-feedback-from into main
    ff2951a Merge branch 'main' into fix/BUNYIP-104-feedback-from
    24adae8 Merge pull request 'fix(admin): confirm before role change and application-group delete (BUNYIP-109)' (#149) from fix/BUNYIP-109-admin-confirm into main
    31d0f46 fix(feedback): record originating page via ?from= on the feedback launcher (BUNYIP-104)
    a84d568 fix(admin): confirm before role change and application-group delete (BUNYIP-109)
    88648c1 Merge pull request 'fix(dashboard): badge admins as Admin instead of No Membership (BUNYIP-108)' (#148) from fix/BUNYIP-108-membership-badge-admin into main
    4e43b22 Merge branch 'main' into fix/BUNYIP-108-membership-badge-admin
    26f5c21 fix(dashboard): badge admins as "Admin" instead of "No Membership" (BUNYIP-108)
    93377ec Merge pull request 'fix(billing): compare Stripe webhook signature in constant time (BUNYIP-107)' (#147) from fix/BUNYIP-107-webhook-constant-time into main
    c943316 fix(billing): compare Stripe webhook signature in constant time (BUNYIP-107)
    e79b02e Merge pull request 'feat(downloads): per-card download affordance, retire Downloads page [BUNYIP-100 2/2]' (#146) from feat/bunyip-100-unified-downloads into main
    4f68ac3 Merge remote-tracking branch 'origin/main' into feat/bunyip-100-unified-downloads
    f1a1d21 feat(downloads): per-card download affordance, retire Downloads page
    6560b74 Merge pull request 'feat(groups): application groups (data, admin, user grouping) [BUNYIP-100 1/2]' (#145) from feat/bunyip-100-application-groups into main
    0c39e6a Merge branch 'main' into feat/bunyip-100-application-groups
    90c982b Merge pull request 'chore: gitignore the local-only "For AI/" working dir' (#144) from chore/ignore-for-ai-dir into main
    570f8da Merge branch 'main' into chore/ignore-for-ai-dir
    5c17cd2 Merge remote-tracking branch 'origin/main' into feat/bunyip-100-application-groups
    ecc3912 feat(groups): application groups (data, admin management, user grouping)
    070aa73 Merge pull request 'fix(bunyip-101): use post-9c082eb hashes (script had pre-edit values inverted)' (#143) from ops/bunyip-101-reconcile-migration-checksums into main
    e6603ef chore: gitignore the local-only "For AI/" working dir
    ff396b8 fix(bunyip-101): use post-9c082eb hashes (script had pre-edit values inverted)
    e23b1d8 Merge pull request 'feat(admin): show Hub/Binary/OCI surface tags on applications' (#142) from feat/bunyip-99-admin-surface-tags into main
    51e812c Merge branch 'main' into feat/bunyip-99-admin-surface-tags
    0ebd98b feat(admin): show Hub/Binary/OCI surface tags on applications
    d6ea0dc Merge pull request 'ops(bunyip-101): script to reconcile _sqlx_migrations after in-place edits' (#141) from ops/bunyip-101-reconcile-migration-checksums into main
    0bece53 ops(bunyip-101): script to reconcile _sqlx_migrations after in-place edits
    ef60351 Merge pull request 'chore: Sync .gitignore with other repos' (#140) from chore/gitignore into main
    3d8802c Merge branch 'main' into chore/gitignore
    3805e24 chore: Sync .gitignore with other repos
    b93b455 Merge pull request 'feat(justfile): add dev-clean / dev-clean-all teardown recipes' (#139) from feat/dev-clean-recipes into main
    469df5d feat(justfile): add dev-clean / dev-clean-all teardown recipes
    0818659 Merge pull request 'fix(bunyip-domain): correct repository SQL binding, silent no-ops, and dead methods' (#136) from fix/bunyip-76 into main
    8021d5d fix(bunyip-domain): correct repository SQL binding, silent no-ops, and dead methods
    a48fd69 Merge pull request 'fix(migrations): close data-integrity gaps and gate version collisions' (#135) from fix/bunyip-79 into main
    69f657f Merge branch 'main' into fix/bunyip-79
    e4c835f Merge pull request 'fix(web): handler correctness, dedup helpers, drop dead web types' (#133) from fix/bunyip-78 into main
    fdaa024 Merge branch 'main' into fix/bunyip-78
    9c082eb fix(migrations): close data-integrity gaps and gate version collisions
    415eea1 Merge pull request 'chore: add pre-commit hook recipes' (#138) from chore/pre-commit-hooks into main
    41f4170 chore: add install-hooks and pre-commit just recipes
    868c1f2 Merge pull request 'chore: Add JetBrains .idea preferences' (#137) from chore/add-jetbrains-idea into main
    e628821 chore: Add JetBrains .idea preferences
    e419930 Merge pull request 'fix(feedback): raise hero pill contrast to WCAG AA' (#134) from fix/bunyip-97 into main
    bc99793 Merge branch 'main' into fix/bunyip-97
    b2d7653 Merge pull request 'fix(bunyip-api): handler correctness for webhooks, admin, auth, dedup' (#132) from fix/bunyip-77 into main
    f8c22f2 Merge branch 'main' into fix/bunyip-77
    6709e70 Merge pull request 'fix(admin-tier): count admin-granted lifetimes toward slot usage' (#131) from fix/bunyip-96 into main
    4d4cbd1 Merge branch 'main' into fix/bunyip-96
    e37a93e Merge pull request 'fix(auth): harden middleware and auto-ban against IP spoofing and map growth' (#130) from fix/bunyip-72 into main
    fe1542d fix(feedback): raise hero pill contrast to WCAG AA
    7bee494 fix(web): handler correctness, dedup helpers, drop dead web types
    a077d4a fix(bunyip-api): handler correctness for webhooks, admin, auth, dedup
    836b478 fix(admin-tier): count admin-granted lifetimes toward slot usage
    54b01af fix(auth): harden middleware and auto-ban against IP spoofing and map growth
    7dd2151 Merge pull request 'fix(auth): validate token issuer, drop 2FA email gate, unify email-change SQL' (#129) from fix/bunyip-75-token-issuer into main
    da8552c fix(auth): validate token issuer, drop 2FA email gate, unify email-change SQL
    32c4c39 Merge pull request 'feat(oidc): /token mints configured tenant claim on at+jwt and id_token (BUNYIP-63)' (#128) from feat/bunyip-63-token-mint-emits-tenant-claim into main
    3f785d3 Merge pull request 'feat(oidc): /authorize tenant gate + picker (BUNYIP-62)' (#127) from feat/bunyip-62-authorize-tenant-gate-and-picker into main
    1dfb600 Merge pull request 'feat(oidc): add oauth_client_user_tenants assignments + admin API' (#126) from feat/bunyip-61-oauth-client-user-tenants into main
    41a7648 feat(oidc): /token mints configured tenant claim on at+jwt and id_token (BUNYIP-63)
    2e4bf6c feat(oidc): /authorize tenant gate + picker (BUNYIP-62)
    f3969ec feat(oidc): add oauth_client_user_tenants assignments + admin API
    b4e0406 Merge pull request 'fix(layout): cap visible toasts at 5 to bound the toast-root column' (#121) from fix/cap-toast-stack-at-5 into main
    8ff1b79 fix(layout): cap visible toasts at 5 to bound the toast-root column
    a3aa9d1 Merge pull request 'fix(admin-feedback): mask email on detail + no-email indicator + await reply email send' (#116) from fix/feedback-detail-mask-email-and-await-send into main
    425a531 fix(admin-feedback): mask email on detail + no-email indicator + await reply email send
    e056efb Merge pull request 'feat(admin-feedback): per-row Archive action + Reply button discoverability' (#115) from feat/feedback-admin-archive-and-reply-button into main
    f071797 feat(admin-feedback): per-row Archive action + Reply button discoverability
    4810e52 Merge pull request 'feat(admin-feedback): spam filter + mark/unmark spam + delete + Close-into-Closed-tab' (#114) from feat/feedback-admin-ops-spam-and-delete into main
    3818b2f Merge remote-tracking branch 'origin/main' into feat/feedback-admin-ops-spam-and-delete
    d26756c Merge pull request 'fix(membership): collapse 'Lifetime x3' stutter on the lifetime card' (#113) from fix/lifetime-card-stutter into main
    ef18d93 feat(admin-feedback): spam filter + mark/unmark spam + delete + Close-into-Closed-tab
    1dd72d0 fix(membership): collapse 'Lifetime x3' stutter on the lifetime card
    d2df1ec Merge pull request 'feat(feedback): magic-byte MIME validation + dim bomb cap + proxy hardening' (#112) from feat/feedback-attachment-security-hardening into main
    9ab3655 Merge pull request 'feat(feedback): attachments upload + admin thumbnails + BFF download proxy' (#111) from feat/feedback-attachments-upload-and-download into main
    935f79b feat(feedback): magic-byte MIME validation + dim bomb cap + proxy hardening
    e703f99 Merge pull request 'feat(webhook): Stripe event_id idempotency on receipt' (#110) from feat/stripe-webhook-idempotency into main
    3009e98 Merge pull request 'feat(audit): emit auth_refresh_reuse_detected on refresh-token replay' (#109) from feat/audit-refresh-reuse-event into main
    577802e Merge pull request 'fix: harden three unwrap/expect panic surfaces in request paths' (#108) from fix/harden-unwrap-panic-surfaces into main
    708abc0 Merge pull request 'feat(feedback): admin detail subpage + respond + archive/restore' (#107) from feat/feedback-admin-detail-and-archive into main
    dc84d33 Merge pull request 'feat(feedback): thread page_path through form + display in admin row + CSV export' (#106) from feat/feedback-page-path-and-csv-export into main
    d094513 Merge pull request 'fix(layout): restore floating feedback launcher, drop top-bar icon' (#105) from fix/feedback-widget-restore-floating into main
    b9ccc29 Merge pull request 'fix(stripe): add request timeout to raw reqwest calls into Stripe API' (#104) from fix/stripe-client-timeout into main
    007e86c feat(webhook): Stripe event_id idempotency on receipt
    112f7ce feat(audit): emit auth_refresh_reuse_detected on refresh-token replay
    29939af fix: harden three unwrap/expect panic surfaces in request paths
    4406f1d feat(feedback): attachments upload + admin thumbnails + BFF download proxy
    00f2a45 feat(feedback): admin detail subpage + respond + archive/restore
    dc54130 feat(feedback): thread page_path through form + display in admin row + CSV export
    0655b6d fix(layout): restore floating feedback launcher, drop top-bar icon
    5dea7f2 fix(stripe): add request timeout to raw reqwest calls into Stripe API
    68a6822 Merge pull request 'docs: add 2026-06-06 platform audit to dev-docs/audits' (#103) from docs/add-platform-audit-2026-06-06 into main
    2423431 docs: add 2026-06-06 platform audit to dev-docs/audits
    630e1db Merge pull request 'fix(admin-feedback): show name + masked email on each row + toggle Reviewed' (#102) from fix/feedback-admin-row into main
    70191f4 fix(admin-feedback): show name + masked email on each row + toggle Reviewed
    a8300a9 Merge pull request 'fix(feedback): repeated tags decode + inline error instead of bare 422 page' (#101) from fix/feedback-form-tags-and-inline-error into main
    2cb8b99 fix(feedback): repeated tags decode + inline error instead of bare 422 page
    8d34083 Merge pull request 'feat(legal): single POLICY_LAST_UPDATED constant + refresh stale "January 2025"' (#100) from feat/bunyip-upgrade-07-legal-dates into main
    7f21783 Merge pull request 'feat(2fa): preserve QR + manual key when verification code is wrong' (#99) from feat/bunyip-upgrade-04-2fa-preserve into main
    bade61f Merge pull request 'feat(settings): suppress browser autofill on email / delete-account forms' (#98) from feat/bunyip-upgrade-02-settings-hygiene into main
    a118c02 Merge pull request 'feat(membership): consolidate plan name + lifetime card shape + merge with billing' (#97) from feat/bunyip-upgrade-01-membership-plan into main
    27031b5 Merge pull request 'chore(ci): shrink check.yml disk footprint to avoid runner ENOSPC' (#96) from chore/check-ci-disk-footprint into main
    e026576 chore(ci): shrink check.yml disk footprint to avoid runner ENOSPC
    d7288ba Merge pull request 'feat(theme): make the high-contrast toggle visibly transform the page in light mode' (#95) from feat/bunyip-upgrade-08-high-contrast into main
    6632cec Merge pull request 'feat(layout): dynamic top-bar title across dashboard / admin pages' (#94) from feat/bunyip-upgrade-03-topbar-title into main
    0860504 Merge pull request 'feat(layout): replace floating feedback launcher with a top-bar icon button' (#93) from feat/bunyip-upgrade-06-feedback-top-bar into main
    3a0cd08 Merge pull request 'feat(layout): app-wide toast system + Copy button confirmation' (#92) from feat/bunyip-upgrade-05-toast-system into main
    2d45ba6 feat(legal): single POLICY_LAST_UPDATED constant + refresh stale "January 2025"
    ec77829 feat(2fa): preserve QR + manual key when verification code is wrong
    296ea05 feat(settings): suppress browser autofill on email / delete-account forms
    b6df86e feat(membership): consolidate plan name + lifetime card shape + merge with billing
    d7ad944 feat(theme): make the high-contrast toggle visibly transform the page in light mode
    91a1396 feat(layout): dynamic top-bar title across dashboard / admin pages
    99921d3 feat(layout): replace floating feedback launcher with a top-bar icon button
    5d5babe feat(layout): app-wide toast system + Copy button confirmation
    cccd66a Merge pull request 'fix(oidc): extract JwtService via app_data instead of web::Data param' (#91) from fix/oidc-silent-sso-via-access-token into main
    782caa3 fix(oidc): extract JwtService via app_data instead of web::Data param
    e28ce7b Merge pull request 'fix(oidc): silent SSO also consumes refresh_token cookie on /authorize' (#90) from fix/oidc-silent-sso-via-access-token into main
    6b29275 fix(oidc): silent SSO also consumes refresh_token cookie on /authorize
    2571300 Merge pull request 'fix(oidc): silent SSO on /authorize via hub access_token cookie' (#89) from fix/oidc-silent-sso-via-access-token into main
    ab463fd fix(oidc): silent SSO on /authorize via hub access_token cookie
    9323932 Merge pull request 'fix(web): enable reqwest stream feature for bunyip-web' (#88) from fix/bunyip-web-reqwest-stream into main
    2a71b2a fix(web): enable reqwest "stream" feature for bunyip-web
    8423bba Merge pull request 'fix(dev): set default-run so cargo run resolves to bunyip-api' (#87) from fix/bunyip-api-default-run into main
    9caf17c fix(dev): set default-run so cargo run resolves to the bunyip-api server
    a7747d3 Merge pull request 'feat(oidc): mirror bunyip_role into the ID token (PMS-158)' (#86) from fix/bunyip-emit-role-claim into main
    0e3e9ae feat(oidc): mirror bunyip_role into the ID token (PMS-158)
    a17d670 Merge pull request 'fix(web): relay rotated session cookie on admin redirects (BUNYIP-67)' (#85) from fix/bunyip-67-admin-redirect-cookies into main
    9b9c328 fix(web): relay rotated session cookie on admin redirects (BUNYIP-67)
    30ebf1c Merge pull request 'feat(api): add bunyip-e2e-bootstrap test-account seeder (BUNYIP-52)' (#84) from feat/bunyip-52-e2e-bootstrap-binary into main
    f9e51d6 docs(api): note ENVIRONMENT-vs-DATABASE_URL residual risk on e2e guard (BUNYIP-52)
    aad41de feat(api): add bunyip-e2e-bootstrap test-account seeder (BUNYIP-52)
    42df032 Merge pull request 'feat(web): wire the delete-application admin UI (BUNYIP-65)' (#83) from feat/bunyip-65-delete-applications into main
    2514e92 fix(web): relay rotated session cookie on delete-application redirect (BUNYIP-65)
    2d34eb5 feat(web): wire the delete-application admin UI (BUNYIP-65)
    b5498dc Merge pull request 'fix(web): proxy binary downloads through the BFF (BUNYIP-64)' (#82) from fix/bunyip-64-download-asset-bff-proxy into main
    20affa4 fix(web): forward status + Content-Length on download proxy (BUNYIP-64)
    1e0c3ea fix(web): proxy binary downloads through the BFF (BUNYIP-64)
    13e523b Merge pull request 'feat(oidc): emit bunyip_role claim in at+jwt for resource servers (BUNYIP-66)' (#81) from feat/bunyip-66-emit-bunyip-role-claim into main
    bed0c47 fix(oidc): default bunyip_role on deserialize for rolling-deploy compat (BUNYIP-66)
    9a703a3 feat(oidc): emit bunyip_role claim in at+jwt for resource servers (BUNYIP-66)
    3e96796 Merge pull request 'fix(oidc): clear stale op_session cookie on authorize when sid -> no row' (#80) from fix/stale-oidc-cookie-renders-404 into main
    df379de fix(oidc): clear stale op_session cookie on authorize when sid -> no row
    561bea9 Merge pull request 'BUNYIP-59: immutable release tags, Cargo.lock sync, tag-collision guard' (#79) from fix/bunyip-59-release-hygiene into main
    881e1c1 fix(release): immutable version tags, lockfile sync, tag-collision guard

    Downloads