carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1# Census overlay email-signin (the console's email sign-in: an address with no Keymail mailbox signs in by an emailed link and code, an email session re-confirms by email, and the old Apps-inbox confirmation link is retired; docs/superpowers/specs/2026-10-21-console-email-signin-design.md), loaded LAST, after claim-merge-main-4. Proposed: every row carries rev3=PROPOSED-email-signin, and the ruling is asked of the census owner on #280 (docs/superpowers/notes/census-proposal-email-signin.md).
2# Every unit here runs in the console (cmd/console serve under console.service, user carlos-console). The root carlos binary links neither internal/console nor internal/mail; TestRootBinaryLinksNoConsoleOrMail (root_binary_deps_test.go) pins that with go list -deps. No root read is added.
3# Ten changed legacy units are re-frozen at their main disposition with this branch's appended (serve, NewServer, Server.handleCLIApprovePage, Server.handleCallback, Store.PurgeExpired, Store.migrate, and the check, home, layout and team templates). Eighteen new units are proposed accepted legacy at their siblings' class: console SQL on the console's own database (the email_challenges store methods, SessionInfo, PendingInviteAddress, CreateSessionMethod, takePendingActionByHash), newStore's two crypto/rand reads for an in-memory key, request URL query reads (handleHome, handleSignin, handleEmailLinkPage), and two new embedded templates. Frozen declarations are added, so the seal moves.
4@legacy 006b0fb7c42c5f08b48695f1c9b54fc9e510a0ab0bb52fa6e360305c02d33b6d internal/console/templates/check.html external legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=Check your email: the approved copy, a code form posting to /auth/email/code and a send-again form; whole embedded template remains frozen as legacy UI input file:external@0 4e48af64d20853805ded890a2e79be77808f2070167cb5127bbd147b5ecb23d6
5@legacy 06700ab26d8a524d543c3ecff9e19ed21817d4781ed8c9d07318a1a8011015c6 internal/console/templates/stepup_email.html external legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: the email step-up's Confirm it's you page: one code form posting to /auth/email/stepup/code; embedded at build time and rendered per request as legacy UI input, as its sibling templates (J4 root-input) file:external@0 092bc86b580a9cf5de260be9ff2ece3392c05849365fa4bd789510c44a437b04
6@legacy 1a2394f940d20ebc92a7c9f010ebd92d9497bbf94f351c81ea6acd99515e04d3 internal/console/emailsignin_store.go Store.TakeEmailLink legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one transaction: a QueryRow of the challenge by its link hash and its DELETE; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@362,file:QueryRow@205 49b1dbedf7a6af718368d3492610c16678d79921156247aa9e5028060138e212
7@legacy 21e0acb56c4325dee1d35cb1417eaba757d67f1499e6fb1a7fb24bdce1a09473 internal/console/templates/home.html external legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=the front page's one address form posting to /auth/continue, with the approved copy, a banner and a no-mail note; whole embedded template remains frozen as legacy UI input file:external@0 d4fc1163306864dc5dbc3714fb2734cab49bbffffab4971ab8738934f3c0e818
8@legacy 2f2c601ae245fba68aeaa0b08d0b63f7cb6f56528753d2c16b0762e8ed22eb2a internal/console/templates/team.html external legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=the confirm and invite notes and the invite placeholder come from approved copy fields; whole embedded template remains frozen as legacy UI input file:external@0 9f4dd7d37f5589b3495f090e83e084a9aeee278cea754ed8af85bacd89f0696e
9@legacy 3741a389f9d4ee7daeb546ff62393dcca237f83463c85a0640e977262f67f67d internal/console/emailsignin_store.go Store.LiveEmailChallenge legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of a binding's newest live challenge; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:QueryRow@244 32351c70194532f6e778070ee910ee5462572a628107dba992759ef986a9b8be
10@legacy 3a20fefebf829d02238900b3d09d0db8e2e882be1a7f788e51d6e9b3d5b51ac1 internal/console/store.go Store.migrate legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=adds the sessions.method column (default keymail, the backfill) and calls migrateEmailSignin; SQLite DDL on CONSOLE_DB; the existing site moves file:Exec@12017,file:Exec@18103 1efcdb4a2abf964e42e30d87faa0698c6013684b6f0bb3d1acb13b3e9bdc3141
11@legacy 4ebae1e28d51d8a7bd6e9e86c07ee056757365f77bfc4b2ad18623ab65e8fe72 internal/console/emailsignin_store.go Store.PeekEmailLink legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of a challenge by its link hash, deleting nothing; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:QueryRow@119 4c899382f8ee2628137714c0dbabfa1b85aa9a9d306c950fd8bea37dad5bd66f
12@legacy 510d507b21da01220f5c322eb2a3ed2c77645412edca18ac97028c1f70d14650 internal/console/emailsignin_store.go Store.migrateEmailSignin legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: CREATE TABLE IF NOT EXISTS email_challenges and one additive ALTER, called from Store.migrate; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@56,file:Exec@801 54f0a37a8bbfc24db86cf9d2b0bf307bd5bba67ecdea4cc86fa7c0145116acb8
13@legacy 55e6a4bf2f00fd349cc31217828006866ff368b9bf086b7cf53387d32ca72ebe internal/console/server.go Server.handleSignin legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: keeps a safe local next from the request URL in a short-lived cookie for handleCallback; its one site is r.URL.Query() of the request URL, not a file; the same class as handleCallback's URL query (J4 root-input) file:Query@656 50a233daa82e6afed6c5d977a90033d457a0006c9cb4ad8db01a3f1c4d1aa179
14@legacy 56842d4ce9e3841b0402675c578b06354fbbd116edcc75222f821ef99d0f61f9 internal/console/emailsignin_store.go Store.TakeEmailCode legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one transaction: a QueryRow of the challenge, then an attempt count UPDATE or a DELETE of it and its binding's others; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@1338,file:Exec@1431,file:Exec@1674,file:Exec@739,file:QueryRow@355 a222b3f6309d1832408b9815525a3d1bd3da100833c6f8d0ce5d1dc34dd11cfc
15@legacy 5aac2d57e856a3709686b5f98fe70b6f0e77025c19f4464925104219eff4e75f internal/console/emailsignin_store.go Store.HoldEmailChallenge legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow counting a binding's live challenges, then the delete and insert of a refused request's unsent challenge; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:QueryRow@312 b9e810b3c2a7175063958b1a099a9d9b79a595b251744c11db10ca1e54932515
16@legacy 5ae6f37ca5abfccecb5fda3807725b6acc550f6aa0391c0c3e6fecbe2a6dd59b internal/console/store.go newStore legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: two crypto/rand.Read calls from the kernel's random source: a 32-byte in-memory HMAC key for emailed codes and an 8-byte epoch label, never written down; no file, no store, no box state; the same class as Keymail.sealEnvelope's crypto/rand read (accepted-legacy, census-ruling-console-invite-delivery) file:Read@213,file:Read@259 d349c559879ad5a2dcd40d87da721b7f72ba744ce8fe5ce8cd0b1a86dd58b2d1
17@legacy 6667720ec8636d3eccf87309b30f08c4d32995fd3b063d6da5e2a47989f70461 internal/console/server.go NewServer legacy accepted-legacy accepted-legacy;rev3=PROPOSED-scan-demand-revival;basis=Console construction adds queue and notification state. The existing logs/data route literal moves; it is not a filesystem read.;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=sets consoleNameCfg from Config.ConsoleName and the challengeSem send bound, and registers the four /auth/email routes; no goroutine; the one data-literal is still the logs/data route pattern, moved; the record-write census re-digests the same unit data-literal@9511 9a49c1fc11bbe553672d824a6efb619612b3a9a9d1589db814aef6db81418169
18@legacy 80f85672905dbec4711c38ecd46e7458353e608c1d1673e34a91f3aa76753804 internal/console/templates/email_link.html external legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: the emailed link's confirm page: one form posting the link token and a login-CSRF nonce to /auth/email/link; embedded at build time and rendered per request as legacy UI input, as its sibling templates (J4 root-input) file:external@0 10a416ee3e92136a91c83564edaedd23b78465659b213c389237c5401a1ac69e
19@legacy 917d4f9bff29cf8742a9f7c9c0890d3574d9c5069fdb519f350282c2ca7cd1ba internal/console/store.go Store.SessionInfo legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of a session's address, method and expiry in the console's own sessions table; the same class as Store.SessionAddress (J4 root-input) file:QueryRow@119 9be462c390ba21ce3ff91e393cd231fc9c7cb733817add8f8cd81cc2aa414a06
20@legacy a4f3b08af53655216841405f3764de45b14876225e42e00849c78d43a057c135 cmd/console/main.go serve legacy accepted-legacy accepted-legacy;rev3=PROPOSED-scan-demand-revival;basis=Console service wires the optional callback signer and starts the claim-guarded queue worker. The same three data path literals move; it does not add a privileged reader.;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=passes CARLOS_CONSOLE_NAME to NewServer as Config.ConsoleName, the name the console's emails use; the same three /data literals at the same offsets; no read added data-literal@4077,data-literal@5178,data-literal@5415 d13aeef31223db8c798e4e24860f878784416acae3cf4d8e7ed32a8a5d8b9d91
21@legacy a59f02afda1b85b8cc2c4a6261d7f20a53e834ea76dfd57f58947b760174e1b6 internal/console/templates/layout.html external legacy accepted-legacy accepted-legacy;rev3=PROPOSED-console-switcher-filter;basis=Account switcher adds a client-side filter box and a scrolling list; whole embedded template remains frozen as legacy UI input.;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=CSS only: email inputs styled as text inputs and sign-in form labels; whole embedded template remains frozen as legacy UI input file:external@0 8581a554a918e7664f6f6dc3432b8819341aee657df5f5be5b0db681a8ba2c24
22@legacy a7825af298422e6d81470f4b804bf99527eb18f0c8a94059140e39a607b1b346 internal/console/stepup.go Store.takePendingActionByHash legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: TakePendingAction's body moved unchanged, keyed by the token's hash so an email step-up challenge (which stores only the hash) can redeem it; the same QueryRow and DELETE on the console's own pending_actions table that TakePendingAction held as file:Exec@599,file:QueryRow@304 (J4 root-input) file:Exec@582,file:QueryRow@302 0c9c9568cb9e5fc1c0b0ab4ead23ed6de772b0fada086ac29775f0f994b6a35c
23@legacy abb6a8a53c38a1bef3c8cc8450a07a604905bfc424fb87a9880d26235a0a7013 internal/console/store.go Store.PendingInviteAddress legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of an invite's address, expiry and acceptance in the console's own invites table, read without consuming it, for the signed-out invite page's prefill; the same class as Store.PendingInviteFor and CountPendingInvites (J4 root-input) file:QueryRow@137 c13d4b6f7397d6a2fbd51dc122dc6adbe04e1d773d0417d769d07063831fc643
24@legacy acbb55d5d6788a8523b713d5d118c8bc581d3e1713ea9976286685659419c87a internal/console/emailsignin_store.go deleteBound legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one DELETE of a binding's challenges inside the caller's transaction; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@148 bdb9d1c1b7780710a75f3f74bb1ae1f4b8191d3a4dae6dcef9d4e660ee970a07
25@legacy b6aaab60628651fdf65a0eaa980c4db2988d445e0ae4c258b640b14c5a6de0e2 internal/console/store.go Store.CreateSessionMethod legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: CreateSession's INSERT into the console's own sessions table moved here with the method column (keymail or email); the site CreateSession held as file:Exec@167 (J4 root-input) file:Exec@181 7fe480594b99ed5e22eb8ca72eccf6d081b446001a54fb717c9f555e50d51838
26@legacy bafabc3cd8ab9d83c11237cc03355cee73f2be2cfc79898ec2f67cb9b43bf80f internal/console/store.go Store.PurgeExpired legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=also deletes expired rows of the console's own email_challenges table: one more SQLite Exec on CONSOLE_DB file:Exec@177,file:Exec@293,file:Exec@66 2abacdba9ce796d4084a233119ff9aef91dbaac7aa8995212b220369b8a9fb46
27@legacy bd8e908ba78f2b376ee306fb695819d9006737404996b02fe0238e23d1fc2ebb internal/console/authcli.go Server.handleCLIApprovePage legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=signed out, renders the sign-in front page with next set back to /auth/cli (a code-shaped ?code= kept only for display) instead of redirecting; the added site is r.URL.Query() of the request URL, not a file; the existing site moves file:Query@171,file:Query@648 52b0fb7aaf3e10ededce8e9e7e399dc666cae734716f9b419c9a41d1f6248948
28@legacy dfceefa98c2e6e18edc72d3323eb9617ca0cbd5bc587fff57abf9a28961627e4 internal/console/server.go Server.handleHome legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: the signed-out front page now carries next; its one site is r.URL.Query() of the request URL, not a file; the same class as handleCallback's URL query (J4 root-input) file:Query@214 4358941da24be00cdee19a9401a45046f81cee94eedceeba18a80ef74c67181c
29@legacy f0e5b3e7e6cbd1e0be4f70ea412d5e8b6718c4fe85a33147bed998e550ef0d90 internal/console/server.go Server.handleCallback legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=the Keymail sign-in's session minting moves into finishSignin, shared with the email doors, and it reads the next cookie handleSignin set; its one site, r.URL.Query() of the callback URL, unchanged file:Query@80 f0d39185734b88859031d6462d8530c9ee343fb79cee32d2160e10f9f1cf4e5d
30@legacy f1aa9e9bd78037515adb709a5560c739b108a8fb61e384d3b695aa90cb2874d8 internal/console/emailsignin.go Server.handleEmailLinkPage legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: GET /auth/email/link; its one site is r.URL.Query() of the request URL (the t parameter), not a file; it peeks the challenge in the console's own database without spending it and renders a confirm page; the same class as handleCallback's URL query (J4 root-input) file:Query@88 29ad3d44c4ac35a3f9615a6738253d700966b793940c76c7a7a8aa1b4322de5e
31@legacy f66bf3fc801e99ca632bded15417efd42be4d8a188f8ac465e437bcd402bfaa7 internal/console/emailsignin_store.go Store.insertEmailChallenge legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one INSERT of a challenge row whose row key, link and code it mints from crypto/rand (randomToken, rand.Int), the code kept only as an HMAC under the in-memory key; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@476 6ed9a6f94f949896b808cfb54791af7034f08b6f494eaa380cd18ffeaf5ec674
32cmd/console/main.go serve legacy accepted-legacy accepted-legacy;rev3=PROPOSED-scan-demand-revival;basis=Console service wires the optional callback signer and starts the claim-guarded queue worker. The same three data path literals move; it does not add a privileged reader.;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=passes CARLOS_CONSOLE_NAME to NewServer as Config.ConsoleName, the name the console's emails use; the same three /data literals at the same offsets; no read added data-literal@4077,data-literal@5178,data-literal@5415 d13aeef31223db8c798e4e24860f878784416acae3cf4d8e7ed32a8a5d8b9d91
33internal/console/authcli.go Server.handleCLIApprovePage legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=signed out, renders the sign-in front page with next set back to /auth/cli (a code-shaped ?code= kept only for display) instead of redirecting; the added site is r.URL.Query() of the request URL, not a file; the existing site moves file:Query@171,file:Query@648 52b0fb7aaf3e10ededce8e9e7e399dc666cae734716f9b419c9a41d1f6248948
34internal/console/emailsignin.go Server.handleEmailLinkPage legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: GET /auth/email/link; its one site is r.URL.Query() of the request URL (the t parameter), not a file; it peeks the challenge in the console's own database without spending it and renders a confirm page; the same class as handleCallback's URL query (J4 root-input) file:Query@88 29ad3d44c4ac35a3f9615a6738253d700966b793940c76c7a7a8aa1b4322de5e
35internal/console/emailsignin_store.go Store.HoldEmailChallenge legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow counting a binding's live challenges, then the delete and insert of a refused request's unsent challenge; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:QueryRow@312 b9e810b3c2a7175063958b1a099a9d9b79a595b251744c11db10ca1e54932515
36internal/console/emailsignin_store.go Store.LiveEmailChallenge legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of a binding's newest live challenge; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:QueryRow@244 32351c70194532f6e778070ee910ee5462572a628107dba992759ef986a9b8be
37internal/console/emailsignin_store.go Store.PeekEmailLink legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of a challenge by its link hash, deleting nothing; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:QueryRow@119 4c899382f8ee2628137714c0dbabfa1b85aa9a9d306c950fd8bea37dad5bd66f
38internal/console/emailsignin_store.go Store.TakeEmailCode legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one transaction: a QueryRow of the challenge, then an attempt count UPDATE or a DELETE of it and its binding's others; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@1338,file:Exec@1431,file:Exec@1674,file:Exec@739,file:QueryRow@355 a222b3f6309d1832408b9815525a3d1bd3da100833c6f8d0ce5d1dc34dd11cfc
39internal/console/emailsignin_store.go Store.TakeEmailLink legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one transaction: a QueryRow of the challenge by its link hash and its DELETE; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@362,file:QueryRow@205 49b1dbedf7a6af718368d3492610c16678d79921156247aa9e5028060138e212
40internal/console/emailsignin_store.go Store.insertEmailChallenge legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one INSERT of a challenge row whose row key, link and code it mints from crypto/rand (randomToken, rand.Int), the code kept only as an HMAC under the in-memory key; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@476 6ed9a6f94f949896b808cfb54791af7034f08b6f494eaa380cd18ffeaf5ec674
41internal/console/emailsignin_store.go Store.migrateEmailSignin legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: CREATE TABLE IF NOT EXISTS email_challenges and one additive ALTER, called from Store.migrate; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@56,file:Exec@801 54f0a37a8bbfc24db86cf9d2b0bf307bd5bba67ecdea4cc86fa7c0145116acb8
42internal/console/emailsignin_store.go deleteBound legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one DELETE of a binding's challenges inside the caller's transaction; console SQL on its own email_challenges table (CONSOLE_DB), as its store siblings (J4 root-input) file:Exec@148 bdb9d1c1b7780710a75f3f74bb1ae1f4b8191d3a4dae6dcef9d4e660ee970a07
43internal/console/server.go NewServer legacy accepted-legacy accepted-legacy;rev3=PROPOSED-scan-demand-revival;basis=Console construction adds queue and notification state. The existing logs/data route literal moves; it is not a filesystem read.;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=sets consoleNameCfg from Config.ConsoleName and the challengeSem send bound, and registers the four /auth/email routes; no goroutine; the one data-literal is still the logs/data route pattern, moved; the record-write census re-digests the same unit data-literal@9511 9a49c1fc11bbe553672d824a6efb619612b3a9a9d1589db814aef6db81418169
44internal/console/server.go Server.handleCallback legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=the Keymail sign-in's session minting moves into finishSignin, shared with the email doors, and it reads the next cookie handleSignin set; its one site, r.URL.Query() of the callback URL, unchanged file:Query@80 f0d39185734b88859031d6462d8530c9ee343fb79cee32d2160e10f9f1cf4e5d
45internal/console/server.go Server.handleHome legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: the signed-out front page now carries next; its one site is r.URL.Query() of the request URL, not a file; the same class as handleCallback's URL query (J4 root-input) file:Query@214 4358941da24be00cdee19a9401a45046f81cee94eedceeba18a80ef74c67181c
46internal/console/server.go Server.handleSignin legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: keeps a safe local next from the request URL in a short-lived cookie for handleCallback; its one site is r.URL.Query() of the request URL, not a file; the same class as handleCallback's URL query (J4 root-input) file:Query@656 50a233daa82e6afed6c5d977a90033d457a0006c9cb4ad8db01a3f1c4d1aa179
47internal/console/stepup.go Store.takePendingActionByHash legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: TakePendingAction's body moved unchanged, keyed by the token's hash so an email step-up challenge (which stores only the hash) can redeem it; the same QueryRow and DELETE on the console's own pending_actions table that TakePendingAction held as file:Exec@599,file:QueryRow@304 (J4 root-input) file:Exec@582,file:QueryRow@302 0c9c9568cb9e5fc1c0b0ab4ead23ed6de772b0fada086ac29775f0f994b6a35c
48internal/console/store.go Store.CreateSessionMethod legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: CreateSession's INSERT into the console's own sessions table moved here with the method column (keymail or email); the site CreateSession held as file:Exec@167 (J4 root-input) file:Exec@181 7fe480594b99ed5e22eb8ca72eccf6d081b446001a54fb717c9f555e50d51838
49internal/console/store.go Store.PendingInviteAddress legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of an invite's address, expiry and acceptance in the console's own invites table, read without consuming it, for the signed-out invite page's prefill; the same class as Store.PendingInviteFor and CountPendingInvites (J4 root-input) file:QueryRow@137 c13d4b6f7397d6a2fbd51dc122dc6adbe04e1d773d0417d769d07063831fc643
50internal/console/store.go Store.PurgeExpired legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=also deletes expired rows of the console's own email_challenges table: one more SQLite Exec on CONSOLE_DB file:Exec@177,file:Exec@293,file:Exec@66 2abacdba9ce796d4084a233119ff9aef91dbaac7aa8995212b220369b8a9fb46
51internal/console/store.go Store.SessionInfo legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: one QueryRow of a session's address, method and expiry in the console's own sessions table; the same class as Store.SessionAddress (J4 root-input) file:QueryRow@119 9be462c390ba21ce3ff91e393cd231fc9c7cb733817add8f8cd81cc2aa414a06
52internal/console/store.go Store.migrate legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=adds the sessions.method column (default keymail, the backfill) and calls migrateEmailSignin; SQLite DDL on CONSOLE_DB; the existing site moves file:Exec@12017,file:Exec@18103 1efcdb4a2abf964e42e30d87faa0698c6013684b6f0bb3d1acb13b3e9bdc3141
53internal/console/store.go newStore legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: two crypto/rand.Read calls from the kernel's random source: a 32-byte in-memory HMAC key for emailed codes and an 8-byte epoch label, never written down; no file, no store, no box state; the same class as Keymail.sealEnvelope's crypto/rand read (accepted-legacy, census-ruling-console-invite-delivery) file:Read@213,file:Read@259 d349c559879ad5a2dcd40d87da721b7f72ba744ce8fe5ce8cd0b1a86dd58b2d1
54internal/console/templates/check.html external legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=Check your email: the approved copy, a code form posting to /auth/email/code and a send-again form; whole embedded template remains frozen as legacy UI input file:external@0 4e48af64d20853805ded890a2e79be77808f2070167cb5127bbd147b5ecb23d6
55internal/console/templates/email_link.html external legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: the emailed link's confirm page: one form posting the link token and a login-CSRF nonce to /auth/email/link; embedded at build time and rendered per request as legacy UI input, as its sibling templates (J4 root-input) file:external@0 10a416ee3e92136a91c83564edaedd23b78465659b213c389237c5401a1ac69e
56internal/console/templates/home.html external legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=the front page's one address form posting to /auth/continue, with the approved copy, a banner and a no-mail note; whole embedded template remains frozen as legacy UI input file:external@0 d4fc1163306864dc5dbc3714fb2734cab49bbffffab4971ab8738934f3c0e818
57internal/console/templates/layout.html external legacy accepted-legacy accepted-legacy;rev3=PROPOSED-console-switcher-filter;basis=Account switcher adds a client-side filter box and a scrolling list; whole embedded template remains frozen as legacy UI input.;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=CSS only: email inputs styled as text inputs and sign-in form labels; whole embedded template remains frozen as legacy UI input file:external@0 8581a554a918e7664f6f6dc3432b8819341aee657df5f5be5b0db681a8ba2c24
58internal/console/templates/stepup_email.html external legacy accepted-legacy accepted-legacy;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=new: the email step-up's Confirm it's you page: one code form posting to /auth/email/stepup/code; embedded at build time and rendered per request as legacy UI input, as its sibling templates (J4 root-input) file:external@0 092bc86b580a9cf5de260be9ff2ece3392c05849365fa4bd789510c44a437b04
59internal/console/templates/team.html external legacy accepted-legacy accepted-legacy;rev3=J4;basis=root-input;rev3=PROPOSED-email-signin;identity=the console (cmd/console serve under console.service, user carlos-console);basis=the confirm and invite notes and the invite placeholder come from approved copy fields; whole embedded template remains frozen as legacy UI input file:external@0 9f4dd7d37f5589b3495f090e83e084a9aeee278cea754ed8af85bacd89f0696e
60# Three units are retired by an H3 census-ruling removal, in the form console-invite-delivery used for Keymail.SendApp while it was proposed (the loader takes an H3 removal only with a census-ruling- basis). A removal is not in the seal.
61@remove internal/console/server.go Server.handleConfirm
62@removed internal/console/server.go Server.handleConfirm H3 census-ruling-email-signin (PROPOSED, awaiting the census owner on #280): still declared, and reads nothing now: it is the retired Apps-inbox confirmation link; nothing mints those links any more, so it renders the expired message and reads, spends and writes nothing (its TakeConfirmation, EnsureUser, GrantToken and CreateSession calls are gone). It runs in the console as carlos-console.
63@remove internal/console/stepup.go Store.TakePendingAction
64@removed internal/console/stepup.go Store.TakePendingAction H3 census-ruling-email-signin (PROPOSED, awaiting the census owner on #280): still declared, and reads nothing now: its body and both sites moved unchanged into Store.takePendingActionByHash, an accepted-legacy row in this overlay, which it calls with hashToken(rawToken). It runs in the console as carlos-console.
65@remove internal/console/store.go Store.CreateSession
66@removed internal/console/store.go Store.CreateSession H3 census-ruling-email-signin (PROPOSED, awaiting the census owner on #280): still declared, and reads nothing now: its one site, the sessions INSERT, moved into Store.CreateSessionMethod, an accepted-legacy row in this overlay, with the method column; it calls that with MethodKeymail. It runs in the console as carlos-console.
67# Envelopes re-pinned. cmd/console: main.go (serve). internal/console: delivery.go, emailsignin.go, emailsignin_limits.go, emailsignin_store.go and signincopy.go are new; authcli.go, consolemail.go, keymail.go, keymailfed.go, server.go, stepup.go, store.go, store_gate.go and storenotify.go changed. The scan's only read-site changes are the rows above. internal/console/templates: check, home, layout and team changed, email_link and stepup_email new.
68@coverage cmd/console 07518c79a3cc295474e3bfe23cb2e21b683349d65b22d056369c720a10f79652
69@coverage internal/console 8d60431a5b81bbd1e3a4acb46e95b16d848e17916a71a7c11510c43788547ec6
70@coverage internal/console/templates 5bf548c2be6168aaa35b4ac90efdbd73b333fd3120419b84a16522fb96af2452
71