A security follow-up to 0.5.0: the demo is now a real deployable app, one host-privilege gap is closed, and the follow-up UI work is pinned by tests.
Changed
- The demo is real now. "Load Demo Stack" used to seed rows that
claimed to be running — an
nginxdemos/hellocontainer, a PM2 service fromvercel/next-learn, and a Postgres row with no container behind any of them. It now creates a single deployable service: a Docker source build ofgithub.com/ersinkoc/nextjs-test(multi-stage Dockerfile, port 3000,/api/health), queues its first build, and re-seeding is idempotent. Legacy fake rows are reaped on the first new-seed call. No PM2, no database, no fake state.
Fixed
- Watch-path webhook matcher could hang forever. Patterns like
**a**b**c**dcompiled into a regex that backtracked ~C(n,3) steps on long non-matching paths (ReDoS); the matcher is now a bounded DP walk with identical folding semantics, over-long inputs fail open, and the tokenizer's own comment no longer breaks the server build. - Deploy finalize no longer strands the previous container when env decryption fails, and the managed-env fingerprint merges into the config snapshot instead of replacing it.
- Web coverage regression on the 0.5.0 follow-ups: the activity drawer's reconnect badge flow and the KeyValueEditor's second-Add focus are pinned by tests.
- Misc: orchestrator routes are operator-gated (see Security); ESM-illegal
requirein the PgBouncer userlist renderer repaired with a regression test.
Security
- Orchestrator routes are operator-gated.
GET /v1/orchestratorsandGET /v1/orchestrators/:name/stacksexecuted host Docker daemon commands through the registered drivers behind bare authentication; they now require the operator, like the exec terminal. - Mimosa sweep cleanups. The last six false-positive findings were resolved at the source: five test-fixture tokens now use the runtime assembly pattern, and the login form's bullet placeholder is built at runtime instead of a literal scanners classified as a credential.