a-provider-carries-the-contract-natively — Each agent client carries the contract through its own extension points, generated once and checked for drift
One generated Claude plugin, the edit guard wired and then refusing, a Stop-time owed report, extension provenance in doctor, bounded hooks and MCP listing, Codex hook parity where Codex offers the hook, Zed schema associations.
PLANNED 0 of 11 issues done
- ready
- 6
- blocked
- 5
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
The Claude integration is four mechanisms installed three ways; Codex has no hook adapter; nothing checks an installed extension against what was generated; the stop of a session owes nothing. Proposed in ADR 0214 (A provider's native extension points carry the contract as generated projections; Majordomus neither embeds nor patches the worker's runtime) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c174#18, chatgpt-majordomus:c194#3, chatgpt-majordomus:c236#4, chatgpt-majordomus:c261#7, chatgpt-majordomus:c193#1, chatgpt-majordomus:c109#3, chatgpt-majordomus:c222#2.
Outcome
One generated Claude plugin, the edit guard wired and then refusing, a Stop-time owed report, extension provenance in doctor, bounded hooks and MCP listing, Codex hook parity where Codex offers the hook, Zed schema associations.
Current state
Verified on master 707a04c: ADR 0146/0165 accepted, .claude/skills generated per domain; .claude/hooks/majordomus-edit-guard exists and case 3069 pipes payloads into it, but .claude/settings.json wires only UserPromptSubmit, SessionStart, SessionEnd and PreCompact, so Claude Code never calls it; share/mods/claude-code/{majordomus-brief,majordomus-handover} (ADR 0136); editors/{claude,zed,antigravity}.rs (ADR 0140); codex `unadapted` in share/providers.yaml.
Desired state
As the outcome, with every artefact stamped and drift-gated.
Scope
- apps/majordomus-cli/src/editors
- share/mods
- lib/capture.sh
- .claude/hooks
- share/providers.yaml
Out of scope
- Patching a client
- Projecting permission modes
Acceptance criteria
- Intent a-provider-carries-the-contract-natively criteria
Validation
- majordomus plan validate
Risks
- Client versions move monthly; every claim cites the version verified
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I3300 | BLOCKED | 1 | I3322 | Majordomus installs into Claude Code as one generated plugin carrying its skills, hooks, mods and MCP server |
| I3301 | BLOCKED | 1 | I3304 | A Claude Code session that stops with an active task is told what the task still owes |
| I3302 | BLOCKED | 2 | I3300 | An installed plugin or mod that differs from what the repository generated is a doctor finding |
| I3303 | READY | 1 | I2734 | Codex's hooks draw its episodes and refuse an edit no claim covers, as Claude Code's do |
| I3304 | READY | 0 | — | A prompt reaches the model within a declared capture budget, and no captured record is lost |
| I3307 | READY | 0 | — | The default MCP tools/list stays within a declared byte budget, and a full schema is fetched per tool |
| I3308 | READY | 0 | — | Zed validates and completes .ai files against the repository's own schemas |
| I3322 | READY | 0 | — | capture install wires the edit guard into Claude Code's PreToolUse, first in an advisory mode, and doctor reports it unwired |
| I3323 | BLOCKED | 1 | I3322 | An unclaimed edit is refused in Claude Code once no live peer edits without a claim |
| I3410 | BLOCKED | 2 | I3303, I3406 | A Codex prompt is captured through Codex's own UserPromptSubmit hook, and capture status stops calling Codex prompts unadapted |
| I3829 | READY | 0 | — | A provider declares whether its client drives a browser beside the server, and preflight says when this machine's bridge is missing |
The graph
flowchart LR
I3300["I3300<br/>Majordomus installs into Claude Code as one generated plugin carrying its skills, hooks, mods and MCP server"]:::blocked
I3301["I3301<br/>A Claude Code session that stops with an active task is told what the task still owes"]:::blocked
I3302["I3302<br/>An installed plugin or mod that differs from what the repository generated is a doctor finding"]:::blocked
I3303["I3303<br/>Codex's hooks draw its episodes and refuse an edit no claim covers, as Claude Code's do"]:::ready
I3304["I3304<br/>A prompt reaches the model within a declared capture budget, and no captured record is lost"]:::ready
I3307["I3307<br/>The default MCP tools/list stays within a declared byte budget, and a full schema is fetched per tool"]:::ready
I3308["I3308<br/>Zed validates and completes .ai files against the repository's own schemas"]:::ready
I3322["I3322<br/>capture install wires the edit guard into Claude Code's PreToolUse, first in an advisory mode, and doctor reports it unwired"]:::ready
I3323["I3323<br/>An unclaimed edit is refused in Claude Code once no live peer edits without a claim"]:::blocked
I3410["I3410<br/>A Codex prompt is captured through Codex's own UserPromptSubmit hook, and capture status stops calling Codex prompts unadapted"]:::blocked
I3829["I3829<br/>A provider declares whether its client drives a browser beside the server, and preflight says when this machine's bridge is missing"]:::ready
I3300 --> I3302
I3303 --> I3410
I3304 --> I3301
I3322 --> I3300
I3322 --> I3323
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (11)
- I3300 Majordomus installs into Claude Code as one generated plugin carrying its skills, hooks, mods and MCP server
- I3301 A Claude Code session that stops with an active task is told what the task still owes
- I3302 An installed plugin or mod that differs from what the repository generated is a doctor finding
- I3303 Codex's hooks draw its episodes and refuse an edit no claim covers, as Claude Code's do
- I3304 A prompt reaches the model within a declared capture budget, and no captured record is lost
- I3307 The default MCP tools/list stays within a declared byte budget, and a full schema is fetched per tool
- I3308 Zed validates and completes .ai files against the repository's own schemas
- I3322 capture install wires the edit guard into Claude Code's PreToolUse, first in an advisory mode, and doctor reports it unwired
- I3323 An unclaimed edit is refused in Claude Code once no live peer edits without a claim
- I3410 A Codex prompt is captured through Codex's own UserPromptSubmit hook, and capture status stops calling Codex prompts unadapted
- I3829 A provider declares whether its client drives a browser beside the server, and preflight says when this machine's bridge is missing
Canonical record: .ai/repo/project/milestones/a-provider-carries-the-contract-natively.yaml. Read it back with majordomus plan show a-provider-carries-the-contract-natively.