MAS-WP-0014 T01: independent JS email side for mode contract v0.1; MCP-1..6; flow a-008

impl/js/src/email.mjs (written from CONTRACT.md + FLOWS.md): both roles,
case store, handoffs, timeouts, one-cap outbox with holding, authorization.
Passes all 22 flows from the bundle; with the JS master all 12 slave
flows (no Python contract party). Writing it found six contract gaps,
folded into the draft as MCP-1..6 (acknowledgement, details convention,
resume names the outcome, opaque case key, error table, transfer
reporting); flows now check outcome tokens, not reference prose. A
mutation check found a missing flow: a-008 (per-type master check).

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
This commit is contained in:
tegwick 2026-10-19 13:56:53 +02:00
parent a5310dd63c
commit 71c17fb5f9
14 changed files with 844 additions and 44 deletions

View file

@ -21,4 +21,21 @@ def test_js_outside_master_passes_the_slave_flows():
from mas_modes.runner import run_mode_corpus
rep = run_mode_corpus(master_factory=ExternalMaster.js, roles=("slave",))
assert rep.ok, rep.failures
assert rep.passed == 11
assert rep.passed == 12
def test_js_email_side_passes_every_flow():
from mas_modes.external import ExternalEmail
from mas_modes.runner import run_mode_corpus
rep = run_mode_corpus(email_factory=ExternalEmail.js)
assert rep.ok, rep.failures
assert rep.passed == 22
def test_js_email_and_js_master_together():
# Neither contract party is Python: only the gateway and the callback stub are.
from mas_modes.external import ExternalEmail, ExternalMaster
from mas_modes.runner import run_mode_corpus
rep = run_mode_corpus(email_factory=ExternalEmail.js, master_factory=ExternalMaster.js, roles=("slave",))
assert rep.ok, rep.failures
assert rep.passed == 12