Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ This document is the source of truth for scope and the work breakdown. How we wo
| `remote-client` | `nudge ask` and `nudge mcp` use `NUDGE_SERVER`, an https URL, in place of the socket when it is set (decision 35) | Done (#42) |
| `machine-label` | A question and a session carry the machine's name, and the page shows it (decision 34); done by naming the project "project (machine)" on the client, which the page and the push title show as they are | Done (#43) |
| `vapid-file` | `nudge serve` can take its VAPID key from a file or the environment, for a host with no Keychain (decision 35); it is `NUDGE_VAPID_KEY_FILE`, with no key in the settings file | Done (#44) |
| `ingress-check` | A throwaway pod behind a `tailscale` Ingress in the homelab: does the proxy send `Tailscale-User-Login` and the Ingress's name as `Host`, and does it keep a request open for hours (risk 12) | Todo |
| `ingress-check` | A throwaway pod behind a `tailscale` Ingress in the homelab: does the proxy send `Tailscale-User-Login` and the Ingress's name as `Host`, and does it keep a request open for hours (risk 12). Done: the proxy sends both; a request held 330 s was answered; hours untested | Done |
| `container-image` | A Dockerfile in this repo: a static `linux/amd64` Go binary, non-root, `nudge serve` as the entrypoint | Todo |
| `server-setting` | A `server` key in the settings file, read by `nudge ask` and `nudge mcp` as `NUDGE_SERVER` is (decision 36) | Todo |
| `image-workflow` | `.gitea/workflows/image.yaml`: builds with BuildKit and pushes `git.tail9e9088.ts.net/codedogapp/nudge:<tag>` from the Gitea mirror | Todo |
Expand Down Expand Up @@ -181,7 +181,7 @@ sequenceDiagram
9. **The tool call's timeout.** Copilot CLI ends an MCP tool call that runs longer than its server's `timeout`, and the question goes away with the call. Its docs give 30 s as the default; in `mcp`'s live check, Copilot CLI 1.0.102 without a `timeout` ended the call after 180 s with `MCP error -32001: Request timed out`. A server added without the day-long `timeout` of `docs/setup.md` (decision 17) loses every question that isn't answered within minutes. With `timeout` at 600,000 ms, a call that waited 150 s for its answer worked; longer waits haven't been tried.
10. **Small models and the fallback.** Without the MCP server, claude-haiku-4.5 called `ask_user` in two of four sessions with the rule. In the other two it got `nudge ask` right only at the second try: once it put `--details` after the question, which Go's `flag` package doesn't parse, so `nudge ask` printed its usage and exited 2; once it ran a bare `nudge`, which isn't on the `PATH`. claude-opus-5.5 got it right the first time. In `skill`'s single session with the skill and `nudge` on the `PATH`, claude-haiku-4.5 ran `nudge ask` right the first time, with no permission prompt, then wrote the answer into the skill's folder instead of the session's. The MCP server (decision 17) keeps agents out of the shell; §6, question 3, would remove one mistake.
11. **Homebrew's Go behind `go.mod`.** The formula builds with Homebrew's `go` and `GOTOOLCHAIN=local` (fact 14), so a `go` line in `go.mod` that's newer than homebrew-core's `go` fails the build, on the Mac and in the tap's CI, until homebrew-core catches up. Before a tag raises the `go` line, the lead checks homebrew-core's `go`.
12. **The operator proxy and long requests.** Unverified: whether the Tailscale operator's Ingress proxy sends `Tailscale-User-Login`, passes the Ingress's name as `Host` (the lock checks both, decision 8), and keeps `/agent/questions` and `/agent/sessions` open for hours. `ingress-check` finds out.
12. **The operator proxy and long requests.** Checked on 2026-10-27 with a throwaway pod behind an Ingress of class `tailscale` (`../nudge-spikes/ingress-check/`): the proxy sends `Tailscale-User-Login` and `Host` as the Ingress's name, with no port (so decision 8's lock works), and a request held for 330 s was answered. Not tried: a hold of hours. The pod is also reachable inside the cluster without the proxy, where anyone could forge the header, so `k8s-manifests` needs a NetworkPolicy that admits only the proxy's pods.

## 6. Open questions

Expand Down
Loading