2026-06-17 07:33:49 +02:00
|
|
|
# ops-warden
|
2026-03-28 00:35:11 +00:00
|
|
|
|
2026-06-17 07:33:49 +02:00
|
|
|
SSH Certificate Authority and certificate lifecycle manager for the ops fleet.
|
|
|
|
|
Signs short-lived certs for `adm` / `agt` / `atm` actors and exposes the
|
|
|
|
|
`cert_command` interface consumed by `ops-bridge` and other tooling.
|
|
|
|
|
|
2026-06-17 08:20:32 +02:00
|
|
|
See `INTENT.md` for direction, `SCOPE.md` for current implementation, and
|
2026-06-18 20:44:53 +02:00
|
|
|
`wiki/AccessManagementDirective.md` for SSH policy. ops-warden issues SSH certs
|
|
|
|
|
and routes every other credential need to its owner — see `wiki/AccessRouting.md`.
|
|
|
|
|
Latest gap analysis: `history/2026-06-17-post-wp0007-reassessment.md`.
|
2026-06-17 07:33:49 +02:00
|
|
|
|
2026-07-07 16:57:39 +02:00
|
|
|
## Get the source (Forgejo)
|
|
|
|
|
|
|
|
|
|
Canonical repo: `https://forgejo.coulomb.social/coulomb/ops-warden`
|
|
|
|
|
Releases: `https://forgejo.coulomb.social/coulomb/ops-warden/releases`
|
|
|
|
|
|
|
|
|
|
**HTTPS clone:**
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
git clone https://forgejo.coulomb.social/coulomb/ops-warden.git ~/ops-warden
|
|
|
|
|
cd ~/ops-warden
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**SSH clone** (recommended for push/pull; add to `~/.ssh/config` if missing):
|
|
|
|
|
|
|
|
|
|
```sshconfig
|
|
|
|
|
Host forgejo-remote
|
|
|
|
|
HostName 92.205.62.239
|
|
|
|
|
Port 30022
|
|
|
|
|
User git
|
|
|
|
|
IdentityFile ~/.ssh/id_gitea
|
|
|
|
|
StrictHostKeyChecking accept-new
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
git clone forgejo-remote:coulomb/ops-warden.git ~/ops-warden
|
|
|
|
|
cd ~/ops-warden
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Legacy Gitea remotes (`gitea-remote`, `gitea.coulomb.social`) still work during
|
|
|
|
|
migration; new checkouts should use Forgejo.
|
|
|
|
|
|
2026-06-17 07:33:49 +02:00
|
|
|
## Install
|
|
|
|
|
|
2026-07-07 16:57:39 +02:00
|
|
|
From a Forgejo checkout:
|
|
|
|
|
|
2026-07-03 00:54:21 +02:00
|
|
|
**Recommended** (warden + experiential memory for route/worker/agent sessions):
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
make install-all
|
|
|
|
|
make verify-memory
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
SSH-only install (no phase-memory):
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
make install
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Manual equivalent:
|
|
|
|
|
|
2026-06-17 07:33:49 +02:00
|
|
|
```bash
|
|
|
|
|
uv sync
|
2026-07-03 00:54:21 +02:00
|
|
|
uv tool install . --with-editable ../phase-memory --force
|
2026-06-17 07:33:49 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Or run without installing:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
uv run warden --help
|
|
|
|
|
```
|
|
|
|
|
|
2026-07-03 00:54:21 +02:00
|
|
|
phase-memory must be a sibling checkout at `../phase-memory` by default, or set
|
|
|
|
|
`PHASE_MEMORY_REPO` when running make. Opt out of memory at runtime with
|
|
|
|
|
`WARDEN_MEMORY=0`.
|
|
|
|
|
|
2026-07-07 16:57:39 +02:00
|
|
|
### Upgrade after a release
|
|
|
|
|
|
2026-07-07 16:59:22 +02:00
|
|
|
When a new tag is published on Forgejo (e.g. `v0.1.2`):
|
2026-07-07 16:57:39 +02:00
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cd ~/ops-warden
|
|
|
|
|
git fetch --tags origin
|
|
|
|
|
git pull --ff-only
|
|
|
|
|
make install-all
|
|
|
|
|
warden route list # sanity check the installed CLI
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
If `warden` still behaves like an older build (same version string but missing
|
|
|
|
|
recent subcommands or fixes), clear the cached wheel and reinstall:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
uv cache clean ops-warden
|
|
|
|
|
uv tool install . --with-editable ../phase-memory --reinstall --force
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Check out a specific release:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
git fetch --tags origin
|
2026-07-07 16:59:22 +02:00
|
|
|
git checkout v0.1.2
|
2026-07-07 16:57:39 +02:00
|
|
|
make install-all
|
|
|
|
|
```
|
|
|
|
|
|
2026-06-17 07:33:49 +02:00
|
|
|
## Quick start (local backend)
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# One-time: generate a CA key (keep mode 600, never commit)
|
|
|
|
|
ssh-keygen -t ed25519 -f ~/.ssh/ops-ca-user -C "Ops SSH User CA" -N ""
|
|
|
|
|
|
|
|
|
|
# Configure warden (~/.config/warden/warden.yaml) — see wiki/OpsWardenConfig.md
|
|
|
|
|
warden inventory add agt-example --type agt --principal agt-example
|
|
|
|
|
warden sign agt-example --pubkey ~/.ssh/id_ed25519.pub
|
|
|
|
|
warden status agt-example
|
|
|
|
|
warden scorecard
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Production uses the `vault` backend against OpenBao or HashiCorp Vault (Vault-compatible
|
2026-06-17 23:51:12 +02:00
|
|
|
SSH secrets engine API). Template: `examples/warden.production.example.yaml`.
|
|
|
|
|
See `wiki/OpsWardenConfig.md` and `wiki/OpenBaoSshEngineChecklist.md`.
|
2026-06-17 07:33:49 +02:00
|
|
|
|
feat(WP-0011): warden route lookup CLI over the pointer catalog
Add a read-only `warden route` command group (list/show/find) that reads
registry/routing/catalog.yaml and tells a worker which subsystem owns a need
and which wiki/canon doc to follow. ops-warden still executes exactly one lane
(SSH); routed entries return a pointer and never call any subsystem.
- src/warden/routing/: models.py + catalog.py loader; enforces the
no-double-source rule (non-SSH entries with steps/cert_command fail validation),
dup-id and schema checks.
- route list (active-only unless --all, --tag), route show (SSH appends steps +
cert pattern; routed ends with "next action on <owner> — see <wiki_ref>"),
route find (keyword ranking, --json).
- tests/test_routing.py: load/validation, find ranking, CLI JSON shapes, plus a
drift guard (every wiki_ref anchor resolves; every entry has a reviewed date).
- Docs: wiki/AccessRouting.md CLI section, README quick reference, SCOPE A3 -> A4.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 21:03:24 +02:00
|
|
|
## Routing lookup (`warden route`)
|
|
|
|
|
|
|
|
|
|
ops-warden issues SSH certs and **routes** every other credential need to its
|
|
|
|
|
owner. The `route` command group is a read-only lookup over the pointer catalog
|
|
|
|
|
(`registry/routing/catalog.yaml`) — it never calls another subsystem or returns
|
|
|
|
|
secrets.
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-25 10:27:23 +02:00
|
|
|
warden route list [--all] [--json] # scenarios (active-only unless --all)
|
|
|
|
|
warden route list --stale [--stale-days 90] [--all] # past review cadence
|
|
|
|
|
warden route show <id> [--json] # owner + wiki/canon pointers; SSH adds steps
|
|
|
|
|
warden route find "issue an api key" # rank scenarios by keyword overlap
|
feat(WP-0011): warden route lookup CLI over the pointer catalog
Add a read-only `warden route` command group (list/show/find) that reads
registry/routing/catalog.yaml and tells a worker which subsystem owns a need
and which wiki/canon doc to follow. ops-warden still executes exactly one lane
(SSH); routed entries return a pointer and never call any subsystem.
- src/warden/routing/: models.py + catalog.py loader; enforces the
no-double-source rule (non-SSH entries with steps/cert_command fail validation),
dup-id and schema checks.
- route list (active-only unless --all, --tag), route show (SSH appends steps +
cert pattern; routed ends with "next action on <owner> — see <wiki_ref>"),
route find (keyword ranking, --json).
- tests/test_routing.py: load/validation, find ranking, CLI JSON shapes, plus a
drift guard (every wiki_ref anchor resolves; every entry has a reviewed date).
- Docs: wiki/AccessRouting.md CLI section, README quick reference, SCOPE A3 -> A4.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 21:03:24 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Full role and examples: `wiki/AccessRouting.md`.
|
|
|
|
|
|
2026-06-17 07:33:49 +02:00
|
|
|
## Development
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-07-03 00:54:21 +02:00
|
|
|
make install-all
|
|
|
|
|
make test
|
|
|
|
|
make lint
|
2026-06-17 07:33:49 +02:00
|
|
|
uv run pytest -m integration # requires ssh-keygen in PATH
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Key paths
|
|
|
|
|
|
|
|
|
|
| Path | Purpose |
|
|
|
|
|
|------|---------|
|
|
|
|
|
| `~/.config/warden/warden.yaml` | Backend and CA/Vault settings |
|
|
|
|
|
| `~/.config/warden/inventory.yaml` | Actor → principals registry |
|
|
|
|
|
| `~/.local/state/warden/` | Signed certs, keys, `signatures.log` |
|
|
|
|
|
|
|
|
|
|
## Documentation
|
|
|
|
|
|
2026-06-17 08:20:32 +02:00
|
|
|
- `INTENT.md` — operational access steward mission (NetKingdom-aligned)
|
2026-06-17 08:22:45 +02:00
|
|
|
- `wiki/CredentialRouting.md` — which subsystem for each credential type
|
|
|
|
|
- `wiki/NetKingdomSecurityMap.md` — platform security component map
|
|
|
|
|
- `wiki/ActorInventoryPatterns.md` — standard adm/agt/atm actor patterns
|
2026-06-17 07:33:49 +02:00
|
|
|
- `wiki/OpsWardenConfig.md` — configuration reference
|
|
|
|
|
- `wiki/CertCommandInterface.md` — `cert_command` contract for callers
|
|
|
|
|
- `wiki/InterHubBootstrapAccessLane.md` — short-lived cert envelope for bootstrap tasks
|
|
|
|
|
|
|
|
|
|
## Workplans
|
|
|
|
|
|
|
|
|
|
Active and proposed work lives in `workplans/`. Finished plans are archived under
|
|
|
|
|
`workplans/archived/`.
|