v1.2 #6

Merged
xavier merged 20 commits from dev into main 2026-08-16 15:23:07 +02:00
Owner
No description provided.
Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs(plans): v1.2 scope wording fixed (no-name, Principal) + PM status notes + backlog additions (incl. raw uniform-notification idea)
Some checks failed
release / build + scan + publish (push) Successful in 1m5s
CI / pnpm gate (typecheck, lint, build, test) (push) Failing after 1m37s
43e73cc473
Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
Execution greenlit by the Principal 2026-08-15. Waves P1->Q1(proof
gate)->R->S->T->U; the ADR #37 par-5 proof obligations gate the store
before login-form UI work builds on it. Standing constraints recorded
(proxy untouched, profiles/session module boundary, per-surface
duplicate note only).

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
Overdue ship hygiene: AGENTS.md requires the execution file to be deleted
at the ship commit/tag; v1.1.2 shipped and was tagged but the file
lingered. Git at the tag is the permanent record. T2.7c (upstream pnpm
issue filing) remains pending-Principal and does not gate the tag per D3.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
feat(web): connection-profile store + masked-key helper (v1.2 wave P1)
All checks were successful
release / build + scan + publish (push) Successful in 1m19s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 2m2s
d4d208175d
New packages/web/src/profiles/ module per ADR #37 + ADR #38 par2 / COMPONENTS.md
'Profile Store': versioned-envelope record with allowlist serializer +
strict per-entry parse (unknown keys dropped) + numeric-version read
lockout; Zustand store over localStorage key vedrfolnir.profiles with
F5-normalized identity dedupe, key-scoped storage-event cross-tab
liveness, and graceful degradation; pure masked-key prefix/
disambiguation helper. No ../session imports (non-colocation layer 4);
proxy untouched; no new deps. Tests land in wave Q1 (tester-owned).

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
test(web): pin the four ADR #37 proof obligations for the profile store (v1.2 wave Q1)
All checks were successful
release / build + scan + publish (push) Successful in 59s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m36s
2626993804
Whole-storage no-leak scan (real login/logout both remember states + real
expiry erase; fixture secret scanned across every localStorage union
sessionStorage key), round-trip key-set (runtime allowlist proof incl. a
compiler-defeating smuggle), tamper-drop (+4 malformed variants, clean
rewrite), and logout/expiry survival (blob byte-identity). Plus identity
dedupe, version lockout, corrupt-container, degradation, cross-tab
liveness, and masked-key table coverage. Web suite 1315 -> 1357, all
green. Proof gate passed: login-form wave (R) cleared.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
feat(web): login-form connection-profile surface (v1.2 wave R, ADR #38)
All checks were successful
release / build + scan + publish (push) Successful in 1m30s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m42s
ad02634f4d
Saved-connections block atop the card in both endpoint modes (rows are
select buttons; nested delete with stopPropagation, enabled on blocked
rows); two-state access-key field (prefilled renders a masked
type=button presentation with INPUT_CLASS chrome - the mask is never an
input value; activation swaps to a cleared live input); Save-profile
secondary button (secret not required; two explicit fields only) with a
per-surface transient 'Already saved' note that self-dismisses (4s,
timer cleaned up on unmount) plus a not-saved degradation note;
free-text select = raw endpoint + prefilled + focus to secret field;
drop-down select maps by normalized endpoint, no match = blocked
(aria-disabled + tooltip + deletable, drop-down mode only - F6/F9b
stealth preserved). Doc-comment updated; profiles/ store untouched;
proxy untouched.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
test(web,e2e): login-form profile surface coverage (v1.2 wave S)
All checks were successful
release / build + scan + publish (push) Successful in 1m14s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m36s
8b3c45d77a
Unit: 24 tests pinning saved-connections rendering, save gating (secret
not required), duplicate/note self-dismissal (fake timers), delete,
select in both modes (cosmetic :443 option matching), masked-button
semantics (mask never an input value; full key submitted), focus
management, blocked rows drop-down-only, endpoint_forbidden regression
guard. E2E: 5-test connection-profiles spec on a private hermetic
stack - save/sign-in/logout/survival/masked-listing/select-with-
secret-only/sign-in/delete/blocked-row; full E2E suite 44P/5S/0F.
Unit totals 2243 across the workspace, all green.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs+test: v1.2 landing ride-along - helpers docblock, review close-out, backlog entries
All checks were successful
release / build + scan + publish (push) Successful in 1m10s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m41s
5f60cb8513
Reviewer T5.1 APPROVED with obligations: F5 stale logoutViaSessionStore
docblock fixed (comment-only; warns that the helper erases connection
profiles and new login-surface E2E must use the real Logout button);
review close-out recorded in the plan (checklist 1-10 PASS; architect
handoffs F1 nesting addendum + F3 ADR #37 par1 memory-authority
clarification); backlog entries for the helper retirement (adjudicated)
and the refocusAccessKey polish (F2). Full gate re-run live per F6:
frozen install, build, 2243 tests, typecheck, lint, 3x check:* - green.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs(readme): connection-profiles highlight bullet; close v1.2 plan (T6.1)
All checks were successful
release / build + scan + publish (push) Successful in 1m15s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 2m1s
2577e68968
Documenter pass per the plan's T6.1 clause: one Highlights bullet
(device-local profiles, secret never stored, remember-on-this-device
distinction). Plan closed with the landing commit chain, the two
architect handoffs (F1/F3), and the compose-rebuild E2E note. All v1.2
tasks done; ships when the Principal tags (file deleted at the tag).

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs(arch): ADR #37/#38 review clarifications (F3, F1) + v1.2 living-doc refresh
All checks were successful
release / build + scan + publish (push) Successful in 1m5s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m37s
b896519648
ADR #37 §1 — dated clarifying note (F3): the disk blob is the source
of truth; in-memory Zustand state is a per-tab cache whose authority is
bounded to the window between a failed persist and the next re-read
(login remount or other-tab storage event, both wholesale resyncs).
Quota-failure semantics stated explicitly, including the symmetric
failed-delete revert; behavior changes routed to spec + Principal.

ADR #38 §3 — dated addendum (F1): prescribes sibling select/delete
buttons inside the row <li> as the house pattern (the original nested
per-row button is invalid HTML — interactive content cannot nest);
sanctions the aria-disabled pattern for blocked rows (native disabled
suppresses title tooltips); rules the login-surface correction a
pre-tag code action.

ARCHITECTURE.md / COMPONENTS.md — v1.2 content refreshed from planned
to shipped state (profiles module file list, ProfileAddResult/notSaved
store interface, disk-authoritative degradation note, phased-delivery
prose covering the third client-only slice).

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs(specs): persistence-failure feedback for profile saves/deletes (transient note, list reflects persisted state)
All checks were successful
release / build + scan + publish (push) Successful in 57s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m35s
0b2976e80e
Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
Principal-directed pre-tag pass (docs/plans/v1.2.md):

- A1 (ADR #38 §3 F1 addendum): SavedConnections rows restructured to
  sibling buttons (select body + delete x) as flex children of the
  row <li> - no interactive nesting, no stopPropagation; blocked-row
  aria-disabled recipe preserved verbatim; delete stays enabled on
  blocked rows.
- A2 (ADR #37 §1 F3): save-failure note copy now states the real
  lifetime - not durably saved, disappears when the list is next
  loaded - instead of the inaccurate 'this tab' claim.
- A3 (spec FR, 0b2976e): delete path wired to the same transient
  note; removeProfile returns 'removed' | 'absent' | 'locked' and
  the note is gated on 'removed' && notSaved (stale-flag guard).

Proxy untouched; no new deps/knobs; per-surface note mechanism only.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
Unit: row selectors move to button:first-of-type (two sibling buttons
per <li>); new §1 DOM-shape pin (no interactive nesting); §10
persistence-failure suite with a real store + throwing setItem
fixture - failed-delete note + restore-at-next-read-without-notice,
failed-save drop-at-next-read, stale-notSaved guard (store + UI),
and neither failure blocks login (both flavors, reviewer N2).
Store-level delete-degradation pins added.

E2E: F9b delete is a real .click() now that the delete is a sibling
outside the aria-disabled subtree (workaround note updated); the
blocked-row dispatchEvent stays with a truthful MUST-STAY note.

Gates: build green; 2251 unit tests; typecheck/lint/check:* clean;
E2E 44P/5S/0F on fresh hermetic stacks built from the working tree.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
v1.2 pre-tag amendment: plan close-out (A6)
Some checks failed
release / build + scan + publish (push) Successful in 1m21s
CI / pnpm gate (typecheck, lint, build, test) (push) Failing after 1m34s
f0e1389388
Records the Principal-directed pre-tag amendment (2026-08-15) in
docs/plans/v1.2.md: items A1-A6 with statuses, gate results
(2251 unit / typecheck / lint / check:* / E2E 44P-5S-0F on fresh
stacks), the N1 architect handoff (stale COMPONENTS.md 'on saves'
line), and the reviewer-adjudicated one-off note.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs(arch): COMPONENTS.md profile-store note covers deletes too (v1.2 amendment follow-up)
All checks were successful
release / build + scan + publish (push) Successful in 1m2s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m34s
4c03e40af8
Persistence-failure feedback was extended from saves-only to saves and deletes in the v1.2 pre-tag amendment (71c9a93/c895817; spec 0b2976e). The Profile Store entry still said the transient notSaved state is 'surfaced as a note on saves' — now states saves and deletes.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
e2e: enforce always-rebuild on the E2E compose stacks
All checks were successful
release / build + scan + publish (push) Successful in 1m3s
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m28s
4587887112
Add pull_policy: build to the proxy service in compose.e2e.yaml and tests/e2e/compose.e2e.dropdown.yaml so a plain up -d always rebuilds s3-vedrfolnir-e2e:local from the working tree (layer-cached) instead of silently reusing a stale cached image - the vector that left the canonical 18081/18082 stacks pre-v1.2 during the landing. Header comments updated: drop the '--build only needed the first time' claim, note the shared image tag between the two projects. Canonical stacks refreshed and verified serving the v1.2 bundle.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
docs: drop redundant --build from E2E compose example commands
All checks were successful
CI / pnpm gate (typecheck, lint, build, test) (push) Successful in 1m49s
release / build + scan + publish (push) Successful in 55s
b4611c5bef
Since 4587887 set pull_policy: build on the proxy service of both E2E compose stacks (compose.e2e.yaml, tests/e2e/compose.e2e.dropdown.yaml), a plain 'docker compose up -d' always rebuilds from the working tree (layer-cached). Remove the now-redundant --build flag from the E2E-stack example commands in comments and docs, adjusting the surrounding sentences minimally so they stay truthful. The integration stack (compose.h1.yaml) deliberately keeps the flag; --build-arg usages and live CI script logic are untouched.

Co-Authored-By: Xavier's assistant <assistant@gijoe88.com>
xavier merged commit b4611c5bef into main 2026-08-16 15:23:07 +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!6
No description provided.