Load the engine, then take its pieces away and check what survives
A standalone harness, never part of the test run, that drives a real stack through the durable path — the webhook, which journals every trigger — and then stops Redis, kills the engine mid-cascade and restarts the broker under a live subscription. Latest-value-wins with concurrent cascades means counter equality is not a promise, so what it asserts is that the queue drains, that state ends on the last value sent, and that nothing reached the dead-letter stream. Every docker verb goes through one helper that checks the compose label before it acts and refuses anything outside this project, because the machines this runs on host unrelated services. Two invariants are deliberately looser than they look. The queue belongs to the whole stack, so "nothing pending" would be measuring other people's traffic; the harness waits on the age of the oldest unacknowledged entry instead, which a stuck item always dominates. And the observability tables are cleared only after the collector's flush interval has passed, since deleting a flow publishes an audit event of its own. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017MeiWk3Yq12n2pTvnQWYvt
This commit is contained in:
@@ -16,6 +16,8 @@ should reopen it.
|
||||
- INFRA: merge the philosophy statement at the beginning of vision.md into the rest of the document. Dissolve the decision dates and fold the decisions into a clean structure
|
||||
- BUG/UI mobile friendly support is degraded: 1) toolbar in the "Flows" viewport extend mobile viewport width 2) position of nodes should never be static; always adjust such that there are as few as possible overlaps and direction is left to right (desktop) or top to bottom (mobile) 3) Dashboard view is not mobile friendly at all; as dashboard design is infeasible on mobile, render all widgets in a vertically stacked order. This allows to inspect each widget and make changes. Layout changes are not a feature on mobile 4) the home view is not responsive; all items shown there should re-order on mobile such that no scrollbars appear
|
||||
|
||||
- Move the "brain" into the "Home" at the top; flat without a box and the same background, such the brain renders just on the surface of the home screen
|
||||
- Move the "Health" page into "Home" as well underneath the flow control toggles (replaces the running / failing flows row in the current home view)
|
||||
|
||||
### Connector write paths
|
||||
|
||||
@@ -51,6 +53,8 @@ is what M4 still waits on, together with porting the flows.
|
||||
- CHORE/API: `/observability/summary` reports the work queue's `depth` as the Redis stream length, which is the journal size (capped at `STREAM_MAXLEN`) rather than a backlog. The health screen shows `pending` instead; the field name still invites the wrong reading.
|
||||
- FEAT/UI: the health screen's window is fixed at 24 hours and the charts fold minute buckets in Python. A range picker (and `date_bin()` behind it) is the next step if anyone wants a week.
|
||||
- CHORE/FLOW: run records for a deleted flow stay until the retention window passes, so a flow that no longer exists keeps appearing in the history. Deliberate — it is a record of what ran — but `forget_flow` could offer to clear it.
|
||||
- BUG/API: `MetricsCollector.flush` takes its buckets and pending events out of the collector before writing them, so a failed write loses everything accumulated since the last flush rather than retrying it. Unobserved so far — the soak run never took Postgres away — but it is a silent hole whenever the database blips. Putting the batch back, merged with whatever arrived meanwhile, closes it.
|
||||
- CHORE/API: nothing can ask the collector to flush now, so anything needing the tables to be current has to wait out `FLUSH_INTERVAL_S` — which is what the soak harness does before clearing its own rows.
|
||||
|
||||
### Dashboard follow-ups
|
||||
|
||||
@@ -86,6 +90,8 @@ is what M4 still waits on, together with porting the flows.
|
||||
- CHORE/UI: `routeTree.gen.ts` was generated by an older router version than the installed one; the next build reorders ~130 lines regardless of who touched it.
|
||||
- CHORE/UI: the alerts screen duplicates the backend's `ALERTING_EVENTS`; the chooser drifts if the backend set grows. A rule with nothing ticked covers everything, so it fails soft.
|
||||
- CHORE/UI: `tests/runtime.spec.ts` still calls the home page "the dashboard" (`dashboard-flow-row`), which now collides with the dashboards feature.
|
||||
- CHORE/INFRA: `make soak`'s redis scenario stops the container the whole stack shares, so every flow briefly fails to journal, not just the soak fixtures. They recover on their own — nothing was dead-lettered or quarantined in the run this note comes from — but it is not a thing to run against a stack someone is relying on.
|
||||
- CHORE/INFRA: the soak harness's engine kill only catches a couple of items unacknowledged, because a cascade finishes in about four milliseconds. Redelivery is proven but barely stressed; a fixture node with a deliberate sleep would widen the window enough to test it properly.
|
||||
|
||||
## Deferred
|
||||
|
||||
|
||||
Reference in New Issue
Block a user