ops(archive): TASK prompts and REPORT verifications, studies through V1

This commit is contained in:
2026-08-29 05:22:43 -05:00
parent bd0cea1757
commit b2c4b74d76
37 changed files with 2049 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# REPORT — keyproxy v0 finish (commit + push of the self-killed turn)
Date: 2026-08-28 21:30
Repo: https://git.knownelement.com/ukrrs/mopac-keyproxy (branch `main`, pushed through `47343d5`)
Task: verify the keyproxy-v0 working tree left uncommitted by the previous
turn (it self-SIGTERM'd via a broad pkill before committing), re-test in
the Docker builder, commit in logical chunks, push, report.
## What shipped (v0, per the TASK spec)
- **Two shapes, one resolver**: `keyproxy serve` (localhost HTTP resolve
hop) + `keyproxy get REF` (exec-style CLI, bare value, no newline).
- **Endpoints** (`internal/server/server.go`):
- `POST /v1/resolve` — bearer-token auth (constant-time compare,
bootstrapped at startup from the file backend), body
`{"ref":"mpk-<name>"}``{"value":"..."}`.
- `GET /healthz` — unauthenticated liveness.
- Status codes: 200 / 401 / 400 (malformed body or non-`mpk-` ref,
never echoed) / 404 / 405 / 413 (4 KiB cap) / 500 (recovered panic,
detail suppressed) / 501 (stub backends) / 502. Failure bodies carry
ref + backend + fixed reason enum only.
- **Backends** (`internal/backend/`, one `Backend` interface):
- `file` — 0600 KEY=VALUE env files, parsed in pure Go (never
sourced), `~` expansion, permission mask enforced before read
(default 0600, stricter passes, looser refused).
- `env` — process-environment indirection (source IS the var name).
- `bitwarden`, `vault`**explicit not-implemented stubs** returning
501 `not_implemented` behind the same interface; phase-3 drop-ins.
- **Config** (`internal/config/`): strict stdlib-only TOML subset parser;
unknown keys and backend-specific misconfigurations fail loudly at
startup; `keyproxy.toml.example` tracked, real `keyproxy.toml`
gitignored (holds the ref MAP — locations only, never material).
- **Redaction, no persistence, no admin UI**: memory-only material; every
log line naming a ref masks it `<ref>=***`; auth failures log remote
address only; parse errors carry line numbers, never contents; panic
values discarded. Enforced by tests + smoke log scan.
- **Build discipline**: all dev in Docker via digest-pinned
`golang:1.26-bookworm`
(`golang@sha256:e8c859f5...e5514`); `dev.sh build|vet|test|check|smoke`,
`make` is a thin front door. Host runs no Go toolchain.
## Verification (re-run this turn, all in the Docker builder)
- `./dev.sh check` (= build + vet + test): PASS —
`ok internal/backend`, `ok internal/config`, `ok internal/server`,
`go vet` clean, binary built.
- `./dev.sh smoke` (end-to-end, containerized): **10/10 PASS**
healthz; 401 no-token; 401 wrong-token; 200 file resolve;
200 env resolve; 404 unknown ref; 400 invalid ref without echo;
501 bitwarden stub; 501 vault stub; 405 GET resolve.
Server log verified redacted: no material strings, refs masked
`ref=mpk-smoke=***`. Smoke container torn down by exact name
(`docker rm -f keyproxy-smoke`); no pkill used this turn.
## Commits pushed to origin/main
Previous turn left everything uncommitted. Committed in 5 logical chunks
(hashes post-rebase, see note below):
| Commit | Content |
|---|---|
| `b43bc55` | backend interface + file/env backends + bitwarden/vault stubs + env-file parser, with tests |
| `7bec2a1` | config loader + stdlib TOML subset parser, with tests |
| `82861b6` | HTTP resolve hop (auth, redaction, reason enums), with tests |
| `24a57c1` | CLI (`serve`, `get`, `help`; exit codes 0/1/2) |
| `47343d5` | dev.sh/Makefile Docker tooling, smoke/, keyproxy.toml.example, .gitignore, README |
Note: first push was rejected — origin/main had been re-seeded
(`6c88e65` + `325a36c`), an unrelated history whose README/LICENSE are
byte-identical to our never-pushed local seed. Resolved by rebasing the 5
implementation commits onto `325a36c` (dropping the redundant local seed;
resulting tree verified identical to the pre-rebase tree). Push:
`325a36c..47343d5 main -> main`, working tree clean.
## How to start it
See README "Quickstart" (repo root, verified verbatim on 2026-08-28):
`./dev.sh check` → create 0600 env files + `cp keyproxy.toml.example
keyproxy.toml``./bin/keyproxy serve` (binds 127.0.0.1:8082) →
`POST /v1/resolve` with bearer token, or `./bin/keyproxy get mpk-example`.
## Left for phase 3
- `bitwarden` backend: replace stub with Bitwarden Secrets Manager REST
(machine accounts, stdlib-first — official SDK license is
AGPL-incompatible).
- `vault` backend: replace stub with HashiCorp Vault KV v2 + AppRole
(official Go api pkg, MPL-2.0, vendored).
- Optional: short-TTL memory cache (per README "Today vs planned").
Both stubs already fail loudly (501 `not_implemented`) naming ref +
backend; connectors slot into the single `backend.Backend` interface and
`newRegistry()` in `cmd/keyproxy/main.go`.
## Hygiene
- No broad pkill this turn; the only process handling was
`docker rm -f keyproxy-smoke` (exact container name) in the smoke
script's cleanup trap.
- Nothing seeded beyond the repo; real `keyproxy.toml`, `*.env`,
`bin/`, `.smoke/` all gitignored; working tree clean after push.