diff --git a/STATUS.md b/STATUS.md index 782ec9c..1fec4ce 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,33 +1,54 @@ # STATUS.md — Agent Identity Provisioning -## Current State +**Last updated:** 2026-08-13 (Session 2) +**Phase:** Active development — vp-techops provisioning in progress -**Phase:** Development — building the Playwright automation. Not yet executable (awaiting Cloudron invite links from user). +## Current State (Session 2) -**Ticket:** [#442](https://projects.knownelement.com/issues/442) +### Completed -## What's Built +- [x] **BW state sync fixed** — added `sync()` to `login()` lifecycle; 5-phase cross-container persistence test passes +- [x] **Container UID/GID fixed** — provision user now matches host TSGCOO (1002:1002) +- [x] **Cloudron 2FA enabled** — TOTP on vp-techops account, secret stored in BW, full round-trip verified +- [x] **Discourse SSO + signup** — account created (username: vptechops), SSO via OpenID Connect working +- [x] **Discourse API key** — User API key generated via RSA flow, stored in BW, verified working +- [x] **Gitea token** — stored in BW, verified working (user=vptechops, active=true) +- [x] **BW vault** — 3 items: Cloudron (TOTP), Discourse (API key), Gitea (token) -- [x] Repo created: `TSYSGroupCorporate/agent-identity-provisioning` -- [x] Framework adopted (check-rules.sh, hooks, Makefile) -- [x] Dockerfile (Playwright v1.52.0 + bw CLI + Python deps) -- [x] docker-compose.yml -- [x] agents.yaml.example (manifest template) -- [ ] provision-agent.py (main Playwright script) — IN PROGRESS -- [ ] bw-helper.py (BW CLI wrapper) — IN PROGRESS -- [ ] Shellcheck on all scripts -- [ ] Install hooks -- [ ] Initial commit + push +### Blocked (needs Charles) -## Blockers +- [ ] **Redmine SSO** — Cloudron returns "You do not have access" when vp-techops tries OIDC to Redmine. Charles must grant Redmine app access for the vp-techops Cloudron user. +- [ ] **Redmine API key** — blocked by SSO above -- **User must provide:** Cloudron invite links (manifest), BW account credentials -- **Discourse admin key:** needed for VP SecOps category creation — assign to vp-techops agent after provisioning +### Remaining -## Inbox +- [ ] Gitea token cleanup (multiple stale tokens may exist from session 1 iterations) +- [ ] Integrate Discourse/Gitea flows into provision-agent.py main script +- [ ] Provision remaining agents (vp-secops, vp-techcompliance, coo, svp-knel, svp-tctc) -- User wants `bw-run.sh` in TSYSGroupAIOS (DONE — needs commit) -- Cross-linking audit tracked as #441 -- BW migration of reachableceo keys tracked as #440 (due Aug 19) -- Discourse admin key → assign to vp-techops agent -- User will create `coo` Linux account + BW account, then run provisioning from dedicated session +## BW Vault State + +| Item | Username | Password | TOTP | +|---|---|---|---| +| vp-techops Cloudron | tsgstaff-coo-vptechops@turnsys.com | 32 chars | Enabled | +| vp-techops Discourse | vptechops | 32-char API key | N/A | +| vp-techops Gitea | vptechops | 40-char token | N/A | + +## Key Technical Discoveries (Session 2) + +1. **Cloudron 2FA flow:** Profile -> Setup -> switchToTotp (Cloudron defaults to Passkey) -> extract base32 secret -> #totpTokenInput -> Enable +2. **Cloudron OIDC TOTP field:** `#inputTotpToken` (not `#inputTotp` as previously assumed) +3. **Discourse SSO:** Click `.login-button` -> click `button:has-text("OpenID")` in modal +4. **Discourse User API Key:** RSA-based flow with PKCS1v15 padding (not OAEP). Response payload is JSON: `{"key":"...","nonce":"..."}` +5. **Discourse API auth:** Use `User-Api-Key` header (not `Api-Key`) + +## Provisioner Container + +- Image: `agent-identity-provisioning-provision:latest` +- UID/GID: 1002:1002 (matches host TSGCOO) +- Source code mounted as read-only volumes for fast iteration +- BW state persists via `./bw-state` bind mount + `sync()` after every login + +## Ticket + +[#442](https://projects.knownelement.com/issues/442)