pmo: 07:02 heartbeat — q14 report imminent, q15 mid-B4, q16 gated, no flakes

This commit is contained in:
2026-08-29 07:04:03 -05:00
parent d4ed0b6132
commit 54751ae623
8 changed files with 181 additions and 13 deletions
+1
View File
@@ -15,3 +15,4 @@
2026-08-29T04:55:19-05:00 wake sent (pending=4 active=1)
2026-08-29T05:02:15-05:00 wake sent (pending=4 active=1)
2026-08-29T06:02:15-05:00 wake sent (pending=4 active=1)
2026-08-29T07:02:15-05:00 wake sent (pending=5 active=1)
+30
View File
@@ -40,3 +40,33 @@ harness: loop: status New -> Resolved on #518
harness: loop: noted REPORT on #518
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
harness: intake: 1 task(s) in redmine scope
harness: loop: scan: 1 task(s) in scope, 0 new/updated
+1
View File
@@ -0,0 +1 @@
Now Part B1 — file tools. Checking the llm tool types:Writing the file tools test first (TDD red):Now the implementation:File tools green. Now wiring config `[tools.files]` + `[loop] turn_timeout_secs` (TDD):Now the config implementation:Now the conductor wiring. Checking writeback render for empty content handling:Writing loop tests for file tools, timeout, and e2e turn (TDD red):Now wire the conductor (loop.go):Now runTurn timeout handling + execTool dispatch:All three failures are the expected red. Fixing: unknown-tool counts as denial, double-%w wrapping, and extending the shipped allow-list:Now extend the shipped allow-list in both example and live config:All green. Now B4 — end-to-end fake-Redmine turn test + status-file heartbeat tests:Now implement the heartbeat in daemon.go:Now wire hb into the Conductor struct and daemon flow:
+6 -1
View File
@@ -1 +1,6 @@
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:Now the core piece. First the stateful fake Redmine server (test infrastructure, harness-style):Now the library test suite (red first):Red confirmed (library absent). Fixing fake's query type, then writing the library:All three failures are test-side: fake returns issues in map order, `*` is URL-encoded, and one assertion is inverted. Fixing:Now sort fake issue listings for determinism:
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:Now the core piece. First the stateful fake Redmine server (test infrastructure, harness-style):Now the library test suite (red first):Red confirmed (library absent). Fixing fake's query type, then writing the library:All three failures are test-side: fake returns issues in map order, `*` is URL-encoded, and one assertion is inverted. Fixing:Now sort fake issue listings for determinism:All green. Committing the library:Library committed. Now the CLI — tests first:Red. Implementing the CLI:Fixing the update-path project resolution (numeric project id, no MOPAC hardcode, single fetch):Now the main entrypoint and run tests:Only relation failed — but flag stops at positionals, so update should have tripped too. Investigating before patching:All four failures share one root cause: flags after positionals. Checking the list-test detail first:Confirmed. Adding a loose arg parser that accepts flags anywhere (task surface requires `update ID --note`, `relation create FROM TO --type`):Now switch all subcommands to `parseArgs`:Guarding the lone `-` (stdin convention) against an infinite loop in parseArgs:Found it: the fake's issue list returns stored write-shape issues instead of the read projection. Fixing:My projection edits never landed (stale content mismatch). Applying against current text:All green. Committing CLI:Smoke pattern clear. Adding a fixed-address listener to the fake, the smoke server main, and the smoke script:Three fixes before running: hoist leading `--config` in Run, clean the readiness probe, and extract ID2 by subject:Smoke failed at issue create. Reproducing manually to see the error:Fake is up (transient reset). Retrying the failing steps manually:Found it: the smoke's create command is missing `-o json`, so the `"id":` grep fails silently. Fixing:Smoke fully green. Committing, then README per docs standard:Verifying Redmine 506 reference (read-only) before committing:506 confirmed as this task. Adding env.example, final check, push:All pushed. Now the PMO report with exact replacement mappings:Verifying the report's cutover commands live (read-only): sed transform + real `issue list`:Live read verified against the real tracker (issues 522/521/519, exit 0). Updating docs to record it:Delivered and pushed (8 commits, `ukrrs/mopac-redmine-go` @ `788f6fe`):
- **Library + CLI**: `redmine.Client` (issues/notes-journals, versions, categories, relations, name→id resolution) and `mred` with the full specced surface, `-o json`, flags-after-positionals, exit 0/1/2 with one-line `http NNN` stderr.
- **Tests**: 62 unit tests green (round-trips, filters, error mapping, key-redaction — the fake echoes the key in error bodies to prove nothing leaks) + end-to-end smoke `OK` against the containerized fake; all builds via the digest-pinned Docker builder.
- **Live-verified read-only**: `mred issue list -p MOPAC` against projects.knownelement.com returned 522/521/519, exit 0, zero code change. Live writes left to PMO acceptance.
- **Report**: `~/.coordinate/inbox-pmo/REPORT-20260829-1400-redmine-cli.md` — command surface, test results, and row-per-operation python→mred mappings for all four glue scripts, plus the one-time setup block and cutover checklist (#506 closes via `mred issue update 506 --status done --done-ratio 100 --note ...`).