carlos / platform Public

spec: gate list has three states; the tty prompt echoes on purpose

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Paul Campbell pushed by paul@keymail.dev 0880da8e9dae61bcd428d46f972c960691cb08fa parent 133c77d
1 file changed, +12 −8
  • docs/superpowers/specs/2026-09-07-password-gate-design.md +12 −8

CI passed — run details

diff --git a/docs/superpowers/specs/2026-09-07-password-gate-design.md b/docs/superpowers/specs/2026-09-07-password-gate-design.md
index 3b62df343..515d391ba 100644
--- a/docs/superpowers/specs/2026-09-07-password-gate-design.md
+++ b/docs/superpowers/specs/2026-09-07-password-gate-design.md
@@ -305,14 +305,18 @@ only, sub-verbs as positional words that never reach `fs.Parse`.
`set` without `-password` reads one line from stdin, so a password can be
piped or typed without landing in the shell's history or `ps` output; an
-empty line is refused. There is no no-echo terminal prompt: that needs
-`golang.org/x/term`, which the module does not depend on, and a
-platform-specific termios call is exactly what the cross-compile gate
-exists to keep out. Without `-host`, `set` and `clear` apply to **every** instance of the app,
-one PATCH each, and print each host as it goes; a failure part way is
-reported per host and the verb exits non-zero, with nothing rolled back —
-the record is per host and the operator re-runs. `list` prints host and
-`open`/`password set`.
+empty line is refused. When stdin is a terminal the verb prints `Password:`
+to stderr first; what is typed echoes, deliberately, because a no-echo
+prompt needs `golang.org/x/term`, which the module does not depend on, and
+a platform-specific termios call is exactly what the cross-compile gate
+exists to keep out. The session is resolved before the read, so a
+logged-out user is told before typing a secret. Without `-host`, `set` and
+`clear` apply to **every** instance of the app, one PATCH each, and print
+each host as it goes; a failure part way is reported per host and the verb
+exits non-zero, with nothing rolled back — the record is per host and the
+operator re-runs. `list` prints host and one of three states:
+`open`, `password set`, or `unknown — console predates gates` when the
+reply carries no `gated` key at all (§9).
`-account`, `-account-id`, `-console` as every other API verb.