v2.2 #10

Merged
xavier merged 6 commits from dev into main 2026-08-30 10:38:43 +02:00
Owner
No description provided.
specs: new docs/specs/notifications.md (transient action feedback: info/success/warning, 4s auto-dismiss, bounded oldest-drop stacking; errors stay contextual with dismiss sweep; migration inventory; object-ops close-on-success, rename dwell retired per Principal ruling) + README index row + GLOSSARY UI-feedback terms.

architecture: ADR #52 — store-owned transient stack, descriptor-only emission API, format-once i18n, store-owned timers, app-root mount, one stable aria-live region, object-ops restructure; ARCHITECTURE.md + COMPONENTS.md updated for the notification surface.

governance: AGENTS.md documentation tense rule — specs and architecture docs describe the product as it is (or committed-will-be), no version tags/phase markers/status narration; swept the full spec set and architecture docs (titles, (vX) badges, Phase blocks, phased-delivery table, inline era narration).

anchors: swept dead work-item IDs (definitions deleted with post-tag plan files) from living docs; kept resolvable schemes only (ADR numbers, in-spec requirement IDs like endpoint-allowlist F1-F16, literal file paths, plan-file links). DECISIONS.md and code comments untouched.

plans: docs/plans/v2.1.1.md deleted post-tag per the plans layout rule.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
Zustand module-singleton notification store (descriptor-only notify API, format-once at emission via the locale store's createIntl seam, store-owned 4 s timers in a side-channel Map, bounded stack cap 3 oldest-drop) + NotificationSurface (one stable role=status aria-live=polite region at the app root, bottom-left fixed, pointer-events pass-through, real keyboard-operable x, no focus management). Mounted in App.tsx inside AppIntlProvider after RouterProvider. Catalogs: notifications.surface.* in en-US + fr-FR. 15 unit tests (fake timers, structural no-re-announce). Implements ADR #52 waves 2-3 groundwork; spec docs/specs/notifications.md.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
LoginPage: ad-hoc note mechanism (showNote/note/noteTimerRef/NOTE_DISMISS_MS) deleted; duplicate-save -> info, persistence-failure save + delete -> warning on the shared store (ADR #52 #9). SqlRunner: export cancelled arm -> info notification (reuses sql.export.cancelledHeadline), never touches exportError; ExportErrorNotice sheds its dead calm arm. Dismiss sweep: sql-store dismissError action (idle+null pair) + keyboard-operable x on the query-error notice (sql.error.dismissAria, en+fr). Tests: 11 flipped to store/behavior assertions, +4 new incl. errors-never-notify boundary; fr 'Export annule' seam test replaces dead cancelled injection. Review R1 (fr-FR.json NBSP regression) fixed byte-exact.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
All six ObjectOpsDialog bodies (delete-object/folder/bulk, rename, copy, create-folder) now emit one success notification and close immediately (ADR #52 #8, Principal ruling 2026-08-28). SuccessNotice, useAutoClose, AUTO_CLOSE_DELAY_MS and the per-body success states retired; rename's explicit-confirmation dwell retired (success = notify renameDoneBody + close); failures, honest partial-rename states and user aborts stay in-dialog and never notify. Dead renameDoneHeadline descriptor + objectOps.rename.doneHeadline catalog key removed from both locales (PM ruling: no catalog limbo; parity 524). Tests: timer-leak + rename dwell pins flipped to the immediate-close contract; 6 bodies covered, 7 never-notify boundary pins.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
E2E (real Chromium + MinIO, both compose stacks): minio-happy-path 9b flipped from the retired rename dwell to close-on-success + notification visible AFTER the dialog closes + explicit x dismissal; 9a copy flow strengthened with the outlives-dialog assertion; connection-profiles duplicate-save pins the info notification. Unit: empty-folder delete click-through (notify + close), folder-delete mid-run Stop never-notify pin (with direct never-reached re-assert), OpError-alongside pin for the failed+targetCreated honest partial state, stale bug-repro comment rewritten as a regression guard. Full E2E suite 66 passed / 5 pre-existing skips / 0 failed. Plans: v2.2 wave statuses closed; metadata-adversarial load flake logged in backlog (recurrence-gated).

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs(specs): v2.2 route-backs — auth-session repointed at notification surface; severity no-op/trivial-completion split
All checks were successful
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 2m7s
CI / pnpm gate (typecheck, lint, build, test) (pull_request) Successful in 1m36s
release / build + scan + publish (push) Successful in 42s
f3a821abec
auth-session.md: the duplicate-save and persistence-failure wordings now name the shared notification surface (notifications.md) with their severities (info / warning), replacing the generic 'transient on-screen note' channel description; success criteria updated to match.

notifications.md: info severity sharpened — a redundant request (desired end state already holds, e.g. duplicate profile save) is info; a request that completes trivially (folder delete enumerating zero objects) is success: the requested outcome is delivered. Keeps the shipped delete-folder behavior correct with no code change.

Both flagged by the v2.2 plan T4.3 ship-time route-backs (PM execution report).

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
xavier merged commit f3a821abec into main 2026-08-30 10:38:43 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
xavier/s3-vedrfolnir!10
No description provided.