ADR-0002: protoWorkstacean ↔ protoMaker integration boundary
Status: Superseded (2026-07-03). protoMaker was decommissioned from the fleet; the org→execution board integration described here no longer exists. Retained as historical record.
- Status: Accepted — 2026-05-27
- Deciders: Josh (operator)
- Related: ADR-0001, protoMaker#3975
Context
protoMaker advertises an A2A agent card, so protoWorkstacean's SkillBroker auto-discovered its skills and registered A2A executors for them. But protoMaker serves no /a2a JSON-RPC endpoint — /a2a returns 404, and the card's advertised URL (ava:3008/a2a) resolves to the protoWorkstacean container itself. So every workstacean→protoMaker A2A dispatch failed silently:
- the
board.healthceremony failed every 30 min (since retired), - the Linear→protoMaker
manage_featurebridge never delivered, - a dead
bug_triageA2A executor shadowed Quinn's working in-process one via health-weighted resolution.
We need a durable contract for how the two systems talk, before building the ADR-0001 intakes on top of it.
Decision
protoWorkstacean ↔ protoMaker communicate over HTTP + GitHub webhooks + bus POST /publish. Never A2A. There is no skill-dispatch chain from protoWorkstacean into protoMaker's agents.
- protoWorkstacean → protoMaker:
- Create-project intake — Ava calls a protoMaker HTTP endpoint to start the create-project → decompose flow (ADR-0001, initiative-level).
- GitHub issues — protoMaker ingests issues via GitHub's native webhooks (ADR-0001, issue-level; protoMaker#3975).
- protoMaker → protoWorkstacean:
- Lifecycle events via
POST /publish(feature.completed/feature.failed), consumed byfeature-notifier+ the Linear bridge.
- Lifecycle events via
- Reads: protoWorkstacean polls protoMaker
GET /api/settings/globalfor the project registry (the source of truth for projects). - protoMaker owns its own execution — Roxy and proto run inside protoMaker. protoWorkstacean does not dispatch into them.
Retirements that follow from this:
- Remove the dead
protomakerA2A entry fromworkspace/agents.yaml(stops the dead-executor pollution + thebug_triageshadow). - Retire the
linear-protomaker-bridgemanage_featureA2A dispatch — superseded by issue ingestion + the create-project intake. Keep the reversefeature.completed/feature.failedconsumer.
Consequences
- No more dead A2A pollution; contracts are explicit and each side is self-contained (protoMaker resolves its own repo→project routing from its own
.automaker/settings.json, not from a protoWorkstacean file). - This decides the open question on the bridge: retire it, do not rebuild
manage_featureover HTTP — the two ADR-0001 intakes replace it. - Aligns with the broader "no dispatch chain to protoMaker" direction. If multi-node messaging is ever needed, that's a bus-bridge concern, not a reason to revive A2A here.