Skip to content

feat(boatstack): flow watch — bounded observe-compare loop over the frontier - #238

Merged
bigboateng merged 1 commit into
mainfrom
boatstack/flow-watch
Jul 28, 2026
Merged

feat(boatstack): flow watch — bounded observe-compare loop over the frontier#238
bigboateng merged 1 commit into
mainfrom
boatstack/flow-watch

Conversation

@bigboateng

Copy link
Copy Markdown
Contributor

Third slice of the published → merged program (stacked on #237). A published PR lives in an asynchronous world — CI runs, reviews land, merges happen — while Boatstack is a synchronous oracle. flow watch is the smallest waiting primitive that bridges the two: it decides when to ask the oracle again, and hands control back the moment the answer differs.

What changed

  • New flow watch (--interval default 30s, floor 5s; --timeout default 30m; --json): each tick re-runs the read-only frontier observation and compares stable per-row signatures (stage, lifecycle, PR phase, actor, operation, failing-check set — deliberately not reason wording).
  • Exits: changed (names the rows that moved, exit 0), terminal (nothing on the frontier can move — refuses to wait, exit 0), timeout (exit 1, so scripts and agent loops distinguish "something happened" from "still waiting").
  • Time flows through injectable seams (flowWatchNow/flowWatchSleep), so conformance runs instantly with a virtual clock.
  • SKILL.md + references/workflow.md (PR_OPEN -> WATCH): compose as watch exits → next-status → continue; observation and actuation stay separate so waiting can never become acting.

Boundary conformance

  • Boundary: a new waiting loop sitting between external GitHub state and the operator/agent.
  • Control law: watch-observes-and-exits-never-acts — no writes, no transition execution path reachable, bounded by construction.
  • Required evidence: flow_watch_conformance_test.go — positive (external phase change ends the wait and names shipped/delivery), negative (no change → timeout outcome, frontier intact, tick count matches the virtual clock), bypass (delivery ledger byte-identical across many ticks including a terminal MERGED tick), failure-state (gh failing every tick → Unknown rows, loop still ends at deadline; all-terminal frontier → refuses to wait, 0 ticks).
  • Failure behavior: observation failures degrade rows fail-closed to PR_UNKNOWN; store/config faults exit with the resolver's error.
  • Release condition: full suite green; no registry rows, no auto-drive changes.

Evidence

  • go build ./... && go vet ./... && go test ./... — pass.
  • Release note added: 2026-07-28-flow-watch-loop.md.

Next slice: delivery.terminal config (published default | merged opt-in) + goal threading.

Base automatically changed from boatstack/flow-frontier to main July 28, 2026 16:30
…rontier

New `flow watch` verb: re-observe the read-only frontier on an interval and
exit on the first row-signature change (position, actor, lifecycle, failing
checks), immediately when nothing can move, or at the deadline with a
distinct exit code (1) so callers can tell change from timeout. Time flows
through injectable seams so the loop is provable without real waiting; a
failing gh observation degrades rows to Unknown and the loop stays bounded.

The watch observes and exits — it never executes a transition and never
writes, pinned across ticks including a terminal MERGED observation. SKILL.md
and workflow.md document composing watch with the loop (watch exits →
next-status → continue).

control-law: watch-observes-and-exits-never-acts

Disclosure-Reviewed: reviewed — public-safe only, private facet kept out of this commit
@bigboateng
bigboateng force-pushed the boatstack/flow-watch branch from 1623d81 to fbab6ba Compare July 28, 2026 16:33
@bigboateng
bigboateng merged commit 5850912 into main Jul 28, 2026
12 checks passed
@bigboateng
bigboateng deleted the boatstack/flow-watch branch July 28, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant