diff --git a/.planning/phases/19.5-social-login-in-sm-user-plugin/19.5-05-SUMMARY.md b/.planning/phases/19.5-social-login-in-sm-user-plugin/19.5-05-SUMMARY.md index bd68dc05..293375e2 100644 --- a/.planning/phases/19.5-social-login-in-sm-user-plugin/19.5-05-SUMMARY.md +++ b/.planning/phases/19.5-social-login-in-sm-user-plugin/19.5-05-SUMMARY.md @@ -3,7 +3,7 @@ phase: 19.5-social-login-in-sm-user-plugin plan: 05 subsystem: auth tags: [sociallogin, sm-user-plugin, email-proof, pre-account-takeover, postgres, gormigrate, gate, vitest, bm] -status: draft +status: complete requires: - phase: 19.5-04 provides: "sm-user-plugin v0.1.4 social sign-in hooks, sm-sociallogin-plugin v0.1.1 matching (ownerVerifiedEmail), scripts/check-phase19.5.sh" @@ -14,13 +14,13 @@ provides: - "bm src/views/OAuthCallbackView.test.ts (D-28): the real view mounted with vue's createRenderer, no new npm dependency" - "gate: USER_ADDED_MIGRATIONS, refused_migration_changes, migration_writes_rows, DOCKER_USER_UPDATES_TESTS, detect_vitest REQUIRE_FILES" - "19.5-SECURITY-REVIEW.md T-19.5-39..46 and CR-02 open; 19.5-VALIDATION.md rows 19.5-05-01..07, D-26..D-28" -affects: [19.5-05 Task 6 (release go-ahead), 19.5-05 Task 7 (release or hold)] +affects: [".planning/todos/pending/email-proof-release.md (release on hold, hand-off to the 19.8 session)", "sm-demo-app and sm-bm-app pins (unchanged until the release)"] actuals: - tokens: 30829 # chars/4: Tasks 1-3 diffs 18621 + Tasks 4-5 diffs 12208 (bm view test, gate change, security review and validation map) - tasks: 5 # of 7; at the Task 6 checkpoint - commits: 5 # summercms.go commits of this plan before this draft's commit (7170c5b, 30e0cd9, c2c8c6a, 7e43873, 8c7794e); rev-list from the ledger counts 7 because two foreign 19.8-03 commits landed in between + tokens: 33300 # chars/4: Tasks 1-3 diffs 18621 + Tasks 4-5 diffs 12208 + Task 7 (hold) todo about 2470 + tasks: 7 # Tasks 1-5 executed, Task 6 answered "hold", Task 7 recorded the hold + commits: 9 # MEASURED: git rev-list --count 3346060..20ecc41; 7 are this plan's (7170c5b, 30e0cd9, c2c8c6a, 7e43873, 8c7794e, b57d2e1, 20ecc41), 2 are foreign 19.8-03 commits (2057643, 4895b25); the final SUMMARY commit comes on top plan_head_before: 33460607db95276e8180487a8ece7e4f0070b1e7 -plan_head_after: 8c7794efa250e6b5f03fcae1ce2c075f779e94f9 +plan_head_after: 20ecc41 tech-stack: added: [] patterns: @@ -55,26 +55,26 @@ key-decisions: - "An email change through /update or the admin form clears email_verified_at; a case-only change (strings.EqualFold) keeps it" - "Harness e.user is a proven account so plan 02-04 link cases keep testing the link path; e.unprovenUser models accounts without proof" - "The bm view test compiles the view's own template for the client at test time (vitest's node environment gives the SFC only ssrRender) and provides an empty SSR context; vite.config.ts and the dependencies stay unchanged" -requirements-completed: [] # D-26, D-27, D-28, SC-3 are marked by the final context (Task 7), not this draft -duration: 68min + - "Task 6 answered hold: nothing pushed or tagged, no pointer moved; the release is handed to the 19.8 session to decide with the framework v0.4.0 release (todo email-proof-release)" +requirements-completed: [D-26, D-27, D-28] # in local commits; SC-3 (tags and app pins, D-21 release) is open under the hold, tracked by email-proof-release.md +duration: 75min completed: 2026-10-21 --- # Phase 19.5 Plan 05: Proof of Address for Social Sign-in Linking Summary -Status: draft (at Task 6 checkpoint) - **users.email_verified_at (stamped only by the mailed activation code and the completed reset-code password reset, cleared on an email change) is now the owner-side condition for auto-linking a verified provider, so an auto-mode `/register` account goes pending instead of handing its sign-in to a squatter; the bm OAuth callback view's code handling is pinned by a vitest view test without a new dependency** -This draft covers Tasks 1-5 of 7. The Task 6 go-ahead (release or hold) is pending; Task 7 finalizes this file. +All 7 tasks are done. Task 6 was answered **hold**, so Task 7 recorded the hold: the fix lives in local commits in four repositories, nothing is pushed or tagged, no application pin moved, and `.planning/todos/pending/email-proof-release.md` hands the release to the 19.8 session (decided together with the framework v0.4.0 release). ## Performance - **Duration:** 29 min (Tasks 1-3) + 39 min (Tasks 4-5, about 25 of them spent on two gate runs that timed out on blocked loopback; see Issues) - **Started:** 2026-10-21T11:37:14Z - **Second context:** 2026-10-21T12:08Z to 12:47Z -- **Tasks:** 5 of 7 -- **Files modified:** 20 across four repositories (plus deferred-items.md) +- **Third context (Task 7, hold):** about 7 min +- **Tasks:** 7 of 7 (Task 7 on the hold branch) +- **Files modified:** 20 across four repositories (plus deferred-items.md and the release todo) ## Accomplishments @@ -119,10 +119,12 @@ This draft covers Tasks 1-5 of 7. The Task 6 go-ahead (release or hold) is pendi | hand-off | `c2c8c6a` | docs(19.5-05): hand-off draft after Task 3 (email proof in user and sociallogin) | | 4 | `7e43873` | test(19.5): gate the bm callback view test | | 5 | `8c7794e` | docs(19.5): proof of address in the security review and validation map | +| 6 | `b57d2e1` | docs(19.5-05): draft at the Task 6 checkpoint (bm view test, review, release table) | +| 7 | `20ecc41` | docs(19.5): capture the email-proof release todo | Two foreign commits of another session (`2057643`, `4895b25`, both `fix(19.8-03)`) landed between them on summercms.go master; they are not this plan's. -**sm-demo-app, fonoteka.go:** no commit yet. fonoteka.go's worktree shows `plugins/golem15/user` modified (the checkout is at 35cf166); it is not staged until Task 7. +**sm-demo-app, fonoteka.go:** no commit (release on hold). fonoteka.go's worktree shows `plugins/golem15/user` modified (the checkout is at 35cf166); it stays unstaged until the release. ## Tests added (all pass) @@ -171,6 +173,13 @@ Followed the plan's decisions. Within them: - **Files modified:** `../sm-bm-app/frontend/src/views/OAuthCallbackView.test.ts` - **Commit:** `5fd0cc3` +**2. [Task 6 hold] The fix is not released; the applications keep the takeover path** +- **Found during:** Task 6 / Task 7 +- **Issue:** The user answered the Task 6 checkpoint with "hold". SC-3 and D-21 (tags v0.1.5 and v0.1.2, app pins at them) are not met by this plan. +- **Unreleased commits:** sm-user-plugin `add1f7a`, `a99cb46`, `35cf166`; sm-sociallogin-plugin `3bb5650`, `962190b`, `c4ebf05` (plus the `chore: require sm-user-plugin v0.1.5` commit still to be made); sm-bm-app `5fd0cc3`. +- **Pins that lack them:** sm-demo-app and sm-bm-app `plugins/golem15/user` c43ba87 (v0.1.4) and `plugins/golem15/sociallogin` d7ee28d (v0.1.1), with the matching go.mod requires; fonoteka.go gitlink c43ba87 (worktree at 35cf166, unstaged). Until they move, an auto-mode `/register` account squatting an address is still linked on the owner's verified Google sign-in in both apps that mount sociallogin. +- **Tracked by:** `.planning/todos/pending/email-proof-release.md` (commit `20ecc41`), addressed to the 19.8 session to review and decide with the framework v0.4.0 release. Task 7's verify command (the `--sociallogin`, `--demo`, `--bm`, `--fonoteka` stages at the new pins) was not run, because no pin moved. + Environment-only adjustments (no repository change): - Docker-backed runs used `TESTCONTAINERS_HOST_OVERRIDE=127.0.0.1` and ran outside the sandbox. - `change_password_no_proof` sets `has_self_set_password` before calling change-password, as `TestChangePassword` does (`insertUser` creates the row with the flag false, which change-password answers with an opaque 500). @@ -202,17 +211,24 @@ Proposed tags (each `git ls-remote --tags origin ` printed nothing; no tag Current pins: sm-demo-app and sm-bm-app `plugins/golem15/user` c43ba87 (v0.1.4), `plugins/golem15/sociallogin` d7ee28d (v0.1.1); sm-demo-app go.mod requires sm-user-plugin v0.1.4 and sm-sociallogin-plugin v0.1.1; sm-bm-app go.mod requires sm-user-plugin v0.1.4 and sm-sociallogin-plugin v0.0.0 (replace to the submodule; only the user line names a version); fonoteka.go gitlink c43ba87. -Pointer-bump commits Task 7 would make (on "release"): +Pointer-bump commits a release makes (not made under the hold; the todo carries them): 1. sm-sociallogin-plugin: `chore: require sm-user-plugin v0.1.5` (go.mod, go.sum), then tag v0.1.2. 2. sm-demo-app: `chore: bump sm-user-plugin to v0.1.5` (gitlink, go.mod, go.sum), then `chore: bump sm-sociallogin-plugin to v0.1.2` (gitlink, go.mod, go.sum); `--demo` and `scripts/check-pins.sh` green after each; push. **The push would include the foreign `b325460` unless the reply excludes it.** 3. sm-bm-app: the same two commits (only the versioned require line changes); `--bm` green after each; push including `5fd0cc3`. 4. fonoteka.go: `chore: bump sm-user-plugin to v0.1.5` (only `plugins/golem15/user`), local only. -## Hand-off for Task 6 and Task 7 +## Task 6 reply -- Task 6 records the user's reply verbatim under `## Task 6 reply` here. -- Before Task 7's gate runs, check that loopback to Docker works (the NordLayer `lo` accept rules); a quick probe: `TESTCONTAINERS_HOST_OVERRIDE=127.0.0.1 go test -short -count=1 -timeout 120s -run '^TestPermissionSetScan$' ./plugins/golem15/user/classes` in fonoteka.go finishes in about 15 s when it works. -- Nothing is pushed or tagged. +> hold + +Added by the user with the reply: the 19.8 session (console commands overhaul) is on hold awaiting this gap closure, and the 19.8 agent will review and decide on the release together with its framework v0.4.0 release. + +## Task 7 (hold) + +- Pushed: nothing. Tagged: nothing. Pointers moved: none. fonoteka.go `plugins/golem15/user` stays unstaged at 35cf166. +- Todo: `.planning/todos/pending/email-proof-release.md` (commit `20ecc41`, `docs(19.5): capture the email-proof release todo`). It holds the release table, the D-21 steps (sm-user-plugin v0.1.5 at `35cf166`; sm-sociallogin-plugin `chore: require sm-user-plugin v0.1.5` then v0.1.2; sm-demo-app and sm-bm-app user bump then sociallogin bump, gate green after each, then push; fonoteka.go user bump local only), the note that plugin tags live in the plugins' own repositories apart from the framework v0.4.0 tag, the foreign unpushed `b325460` in sm-demo-app, the NordLayer loopback rules for Docker gate runs, and the open takeover path in the apps until the release. It does not set `resolves_phase`, so completing Phase 19.5 does not close it. +- g15office task: **not created.** No g15office tool was available in the executing session (the g15office MCP server is not exposed to subagents). The todo's frontmatter says so; the orchestrator or the next session with the tool creates the task (type Bug or Task, description ending `Local: .planning/todos/pending/email-proof-release.md`), writes its ID into the todo, and makes it a subtask of the Phase 19.5 milestone task `onunbz3l`. +- Task 7's verify command was not run (hold: no pin moved). ## User Setup Required @@ -220,8 +236,8 @@ None. --- *Phase: 19.5-social-login-in-sm-user-plugin* -*Draft: 2026-10-21* +*Completed: 2026-10-21 (Task 7 on the hold branch)* ## Self-Check: PASSED -All twelve commits listed (U 3, S 3, B 1, F 5) and the five created files exist; the draft status line and the Release table heading are present once; no tag points at either plugin master and v0.1.2 is absent on the remote. +All 14 commits listed exist (U 3, S 3, B 1, F 7); the five created files and the todo exist; no draft status line remains; the Release table heading is present once; no tag points at either plugin master and v0.1.2 is absent on the remote.