ops(alpha): self-hosted loop live (520 autonomous), briefing turn killed, tool-widening filed

This commit is contained in:
2026-08-29 06:26:46 -05:00
parent c76e662e18
commit ee46e700a8
5 changed files with 60 additions and 1 deletions
@@ -0,0 +1,47 @@
# TASK: mopac-redmine-go — Redmine Go CLI, TOP PRIORITY (Redmine 506)
## Context
Charles's strict self-hosting directive: "working out of redmine with a
go cli." The PMO (and every vertical) must STOP using python glue for
Redmine updates — this CLI replaces it the moment it lands. Jumped to
the top of the queue 2026-08-29 by direct order.
## Scope
1. New repo `ukrrs/mopac-redmine-go` (create via Gitea API if absent —
tea token pattern; clone to ~/projects/meta/MOPAC/redmine-go).
AGPLv3 LICENSE first commit.
2. Stdlib-only Go library + CLI binary `mred`:
- Config: URL + API key via env (`MRED_URL`, `MRED_KEY`) or
`--config` env-file (0600 discipline), key never logged.
- Commands (JSON-friendly flags, machine-parseable `-o json`):
- `issue list -p MOPAC [--status open|all] [--version Beta] [--limit N]`
- `issue show ID [--with journals]`
- `issue create -p PROJ -s SUBJECT [--desc FILE|-] [--tracker feature]`
`[--priority immediate] [--category X] [--version V] [--due DATE]`
`[--parent ID] [--est HOURS] [--note TEXT]`
- `issue update ID [--status done] [--priority ...] [--category ...]`
`[--version ...] [--due ...] [--done-ratio 100] [--desc FILE|-]`
`[--note TEXT]` (note = journal)
- `version list|create -p PROJ -n NAME [--due DATE] [--status open|closed]`
- `category list|create -p PROJ -n NAME`
- `relation create FROM TO --type blocks|relates`
- Exit codes: 0 ok, 1 usage/config, 2 API error (status in stderr,
one line, parseable).
3. Library surface usable by the harness later (`redmine.Client`) —
no copy-paste temptation.
4. Fake-Redmine test suite (table-driven; the harness repo's fake server
pattern is a good reference): create/update/note/relations/versions
round-trips, key-redaction, error mapping.
5. Docs standard: README with verified quickstart (against the fake
server), command reference table, status table.
## Build discipline
ALL DEV IN DOCKER (digest-pinned builder; dev.sh/Makefile family
pattern). NEVER broad pkill. Atomic conventional commits, push origin
main. TDD red/green.
## Deliverable
`REPORT-20260829-1400-redmine-cli.md` in `~/.coordinate/inbox-pmo/`:
command surface, test results, and EXACT PMO replacement mappings (the
python operations I use today -> mred one-liners) so the PMO switches on
acceptance with zero downtime.
+1
View File
@@ -86,3 +86,4 @@
2026-08-29T06:19:13-05:00 | PMO | 497 amended: per-account BW scale (100+ refs), one bootstrap seed per account, batch warm + memory cache
2026-08-29T06:19:29-05:00 | PMO | 497 corrected: BW machine accounts map to CLOUDRON accounts (per-vertical API identities), not raw Linux accounts
2026-08-29T06:20:17-05:00 | PMO | identity model ticket filed (linux runtime + cloudron acting, N per account); 497 corrected
2026-08-29T06:21:06-05:00 | PMO | identity model FINAL: 1:1 linux->BW vault (cloudron+3rd-party entries); acting identity selected per task/turn, stamped on all actions + usage
+10
View File
@@ -0,0 +1,10 @@
harness: loop: vertical=demo poll=2m0s state=state/loop redmine=projects.knownelement.com (SIGINT to stop)
harness: intake: 3 task(s) in redmine scope
harness: loop: scan: 3 task(s) in scope, 3 new/updated
harness: loop: dispatch 520 (updated 2026-08-29T06:23:26-05:00): "Alpha: V1 core summary note on 483"
harness: task 520 (redmine): "Alpha: V1 core summary note on 483" class=study -> mopac-study -> glm-4.7-flash
harness: REPORT reports/REPORT-demo-520-20260829-112526.md
harness: loop: status New -> Resolved on #520
harness: loop: noted REPORT on #520
harness: loop: dispatch 519 (updated 2026-08-29T06:23:26-05:00): "Alpha: draft briefing v0 format as note on 495"
harness: task 519 (redmine): "Alpha: draft briefing v0 format as note on 495" class=study -> mopac-study -> glm-4.7-flash
+1 -1
View File
@@ -1 +1 @@
Context gathered. Setting up the task list, then finishing recon (Redmine 495, deploy template, remotes).Redmine 495 confirms scope and repo name `ukrrs/mopac-discourse-go`. Creating the Gitea repo now.Repo created (id 428). Cloning and checking the push credential pattern.Recon complete. Building the client repo now.Now the typed surfaces: categories, topics, posts.Now the fake-server test suite:Now the CLI:Now the fake server for the smoke test, plus dev.sh/Makefile/env.example:The smoke.sh has ordering bugs — rewriting it cleanly:Check gate green. Running the end-to-end smoke:Smoke OK. Writing the README and pushing the client:Now the live verification (before the README's claims stand):Live checks match the known state (reads 200, create 403). Committing and pushing the client:Part A complete. Wiring the dependency into the harness:Expected — nothing imports it yet. Writing Part B code first, then vendoring. Checking the TOML helpers:Now adding `BriefConfig` to the harness config:Now the Default, apply, and Validate entries:Now the Validate block — checking the current tail of Validate first:Extending the intake client with the windowed issue listing:Now the brief package core:Now delivery + orchestration:Now the Run orchestrator:Wiring the subcommand into main.go:Now the brief package test suite — fake Redmine, Gitea, and Discourse:Now config tests for `[brief]`, then vendoring and the check gate:
Context gathered. Setting up the task list, then finishing recon (Redmine 495, deploy template, remotes).Redmine 495 confirms scope and repo name `ukrrs/mopac-discourse-go`. Creating the Gitea repo now.Repo created (id 428). Cloning and checking the push credential pattern.Recon complete. Building the client repo now.Now the typed surfaces: categories, topics, posts.Now the fake-server test suite:Now the CLI:Now the fake server for the smoke test, plus dev.sh/Makefile/env.example:The smoke.sh has ordering bugs — rewriting it cleanly:Check gate green. Running the end-to-end smoke:Smoke OK. Writing the README and pushing the client:Now the live verification (before the README's claims stand):Live checks match the known state (reads 200, create 403). Committing and pushing the client:Part A complete. Wiring the dependency into the harness:Expected — nothing imports it yet. Writing Part B code first, then vendoring. Checking the TOML helpers:Now adding `BriefConfig` to the harness config:Now the Default, apply, and Validate entries:Now the Validate block — checking the current tail of Validate first:Extending the intake client with the windowed issue listing:Now the brief package core:Now delivery + orchestration:Now the Run orchestrator:Wiring the subcommand into main.go:Now the brief package test suite — fake Redmine, Gitea, and Discourse:Now config tests for `[brief]`, then vendoring and the check gate:Test data bug — closed stamp lands outside the window. Fixing:The briefing renders beautifully — the fallback log just goes to stdout instead of `out`. Threading the writer through:
+1
View File
@@ -0,0 +1 @@
I have full context: sibling pattern (mopac-bitwarden-go), harness fake-server test style, PMO python glue to replace, creds at `~/.creds/redmine.env`, Redmine at projects.knownelement.com. Setting up the work plan.Toolchain verified. Creating the repo via Gitea API (idempotent check first):Repo created. Cloning and seeding with LICENSE:Harness done. Now TDD config package — tests first (red):Red confirmed. Implementation:Green. Two atomic commits: