conformance/FLOWS.md defines setup, steps, captures and expectations, all observable at the contract boundary. flows.json carries setups (peer ids), fixed test keys, statute, scenario and explicit assign steps; scenarios.json holds the callback scenarios (the stub loads them). CONTRACT.md defines the case.assign response. Runner reads only the bundle and rejects undefined keys; new flow s-006 (held over cap). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 5787@bnt-lap001 Assistant-Session: 5db26b82-138b-40cc-9856-4d5eb0f752fd
3.1 KiB
| id | type | title | domain | repo | status | owner | topic_slug | created | updated | origin | origin_ref | state_hub_workstream_id |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MAS-WP-0013 | workplan | Mode contract flows independent of the Python harness | communication | mail-address-semantics | finished | claude | coulomb-social | 2026-10-19 | 2026-10-19 | residual | MAS-WP-0010 | 6d1d30c3-4373-59db-a6f6-d8a8ceb5fad9 |
Mode contract flows independent of the Python harness
Risk A in history/2026-10-19T090725Z-scope-vs-intent.md.
mas-modes-v0.1-spec/conformance/flows.json is language-neutral in
format, but it relies on harness details: the stub master assigns
EXT-100, EXT-101, ...; the role configuration is implied; and
expectation keys mirror mas_modes.runner. A second implementation could
not run the flows from the bundle alone.
Make flows self-describing
id: MAS-WP-0013-T01
status: done
priority: medium
state_hub_task_id: "95fe186c-d0af-5755-a78f-065e7da7afd1"
Write the inputs into each flow: role configuration, assigned ids, and
the stub scenarios. Define every expectation key in CONTRACT.md §7 or a
conformance/FLOWS.md, in terms of contract messages and sent mail only.
Remove any expectation that only the Python harness can observe.
Runner follows the bundle
id: MAS-WP-0013-T02
status: done
priority: medium
state_hub_task_id: "2e71569f-739a-513a-970f-0a0c867604d6"
Update mas_modes.runner and the stubs to read everything from the flow.
Keep mas test green. Add a fixture-level check that the bundle's flows
do not use undefined keys.
Outcome
conformance/FLOWS.mddefines the format: how to set up a run (email side, callback stubcallback-1, master stubcms-1, controllable clock, optional send cap), the five step types, captures and the 14 expectation keys. All of it is observable at the contract boundary: messages the stubs receive, command responses, and sent mail.flows.jsoncarries everything a run needs:setupswith role configs by peer id (no URLs;<mode:ID>for a primed webhook);- fixed public test keys in
peers, plusstatute; - per flow, a
scenarioand an optionalmax_sent; - explicit
assignsteps withEXT-100instead of the stub's auto-numbering.
- Removed harness-only observables: the ticket service's response
strings (now
event_accepted, the 2xx) andtick()'s return value (nowmode_received,mode_received_lastandmails_sent). conformance/scenarios.json: the callback scenarios as data. The Python stub loads them from there.- CONTRACT.md §5 now defines the
case.assignresponse, which flows capture from. - New flow
s-006(a held send over the cap): 21 flows in all. - Runner (
mas_modes.runner) reads only the bundle and rejects undefined keys.tests/test_modes_conformance.pychecks that every flow uses defined keys, existing setups and scenarios, and that every key is documented in FLOWS.md. The drift test now also covers the vendored FLOWS.md. - Checks. A mutation check over 5 expectations, plus an undefined key,
was detected every time.
mas test: mode corpus 195/195.