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
@@ -0,0 +1,54 @@
# TASK: MOPAC self-host core — `harness loop` replaces the bash stack
## Context
Charles (2026-08-28 ~21:30): "get to be self hosting asap — smallest core
that can bootstrap itself (redmine/gitea interaction fine, discourse later)"
and "moving away from the brittle _crossfeed setup and doorbell PMO<->work
channel". The MVP bar is already met (`harness once --demo` live, REPORT in
reports/). This turn makes the harness drive ITSELF: Redmine is the SoR,
the conductor is the worker, no bash middle layer.
## What dies (list explicitly in REPORT, do not delete yet)
- `/home/_crossfeed/tooling/agent-stack/semaphore.sh` + slot-file cap
(replaced by in-process concurrency limit)
- `~/.coordinate/scripts/queue-next.sh`, `queue-after.sh`, `pmo-heartbeat.sh`
(replaced by the loop + its own wake discipline)
- dispatch-turn.sh doorbell `screen -S reachableceo-PMO -X stuff` — note:
this doorbell is ALREADY dead (screen is named RCEO-PMO, message silently
dropped). Mention in REPORT; deletion happens after Charles signs off.
## Scope — smallest self-bootstrapping core
1. `harness loop` subcommand (Go, stdlib only, chainable with `once`):
- Poll Redmine intake (existing `/issues.json` query) on interval
(config, default 120s). `--once` flag = single scan (cron-able).
- For each new/updated task issue not yet processed: run the bounded
turn (existing conductor), then write REPORT back (existing Redmine
note writeback — currently stubbed; implement the note POST) and
update issue status per config map (e.g. In Progress -> Done).
- State: append-only JSONL (one event per dispatch/report), dedup by
issue id + updated_on. No _crossfeed paths, no slot files.
- v0 = SEQUENTIAL turns (one at a time). Concurrency knob can come later.
- Gitea: optional REPORT commit step behind config flag (off by default).
Discourse: out of scope.
2. Credentials: harness.toml `key_ref` gains `mpk:` scheme → POST to
keyproxy `/v1/resolve` (see ukrrs/mopac-keyproxy, built tonight).
`env:` / `file:` refs keep working as fallback, so the loop runs with
or without keyproxy up. Do not hardcode hosts — all in harness.toml.
3. `harness loop` supervises ITS OWN turns; PMO (me) verifies REPORTs and
archives. The loop logs one line per action to stdout + JSONL.
## Build discipline
- ALL DEV IN DOCKER: digest-pinned golang:1.26 builder, bind-mounted repo,
Makefile build/vet/test through docker run. No host Go toolchain.
- Docs standard applies (README status table + config reference update).
- Tests: loop end-to-end against a fake Redmine HTTP server (pattern
exists in internal/loop tests) — dispatch, dedup, writeback, status map.
## Deliverables
- Commits + push to ukrrs/MOPAC main.
- `REPORT-20260828-2131-selfhost-core.md` in `~/.coordinate/inbox-pmo/`:
what runs, exact command to start the loop, what it replaces (the die
list), how to roll back (just stop the loop, bash stack still present).
## Added by PMO (21:30, post docs-turn rot finding)
- Rename Go module path `reachableceo/...` -> `ukrrs.com/mopac/...` or similar (go.mod module line + all internal imports). Mechanical, verify with build+vet+test in the Docker builder. Cited as doc rot in docs-standards REPORT; folding here since it is a source change.