merging-and-referencing-are-enforced — Merging and referencing are enforced: every pull request carries its metadata, every reference resolves, every number is taken once
Merging and referencing are projections, typed commands and gates: every pull request carries its metadata from the records, every reference resolves on master, every number is taken once.
PLANNED 0 of 10 issues done
- ready
- 3
- blocked
- 7
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
A pull request carries only what its author typed, and the repository labels hold, collision:accepted and ci:yielded are named in code but declared nowhere. plan next offers work that already sits in an open pull request. A milestone dependency holds every issue of the milestone, 26 of them at 355a0cee79a with no unfinished dependency of their own, and nothing names them. Issue ids have no allocator. A GitHub issue created by hand with a record title is adopted by github-sync. A commit need not name its issue. The landing duties of a train member are a table in docs/INTEGRATION.md.
Outcome
Merging and referencing are projections, typed commands and gates: every pull request carries its metadata from the records, every reference resolves on master, every number is taken once.
Current state
scripts/github-sync projects issues, milestones and four label families (majordomus, priority, status, execution) from the trunk only and never touches a pull request; plan.next ranks READY by stamps alone (plan.rs:567-580); the milestone gate blocks every issue of a blocked milestone (plan.rs:1110-1130); scripts/case-numbers and lib/adr.sh each survey tree, worktrees, refs and board for one identifier; commit.validate has no rule about naming an issue; nothing declares the label vocabulary.
Desired state
Every criterion of the intent is carried by an issue here and proven by its test.
Scope
- scripts/github-sync
- scripts/ci/github-check
- scripts/ci/collision-gate
- scripts/case-numbers
- lib/adr.sh
- apps/majordomus-cli/src/plan.rs
- apps/majordomus-cli/src/commit
- apps/majordomus-cli/src/convergence
- docs/INTEGRATION.md
- CONTRIBUTING.md
Acceptance criteria
- Every open pull request carries labels, the GitHub milestone of the issue it serves, an assignee and a managed body region of Refs links, projected from the records, with no closing keyword
- An issue whose work sits in an open pull request or under a live branch claim is never the answer of plan next or plan ready
- plan validate names every issue held only by its milestone gate, and an issue may declare that it needs nothing from its milestone dependencies
- A pull request naming a record id that resolves neither on master nor in itself is refused, and convergence reports stranded records
- Issue ids, ADR numbers and case numbers come from one survey, and two branches adding one number under different names are refused
- A GitHub issue is created only by github-sync, an issue nobody projected is reported on GitHub, and an issue without a record marker is never adopted
- A commit naming no issue or carrying a closing keyword is refused outside the narrow exemptions, judged after a recorded boundary
- Every served page names only versions of the release model
- Each train member is judged on its merged tree, and a fix member carries a test and its coverage
- Every label and convention is declared once, projected and checked
Validation
- bin/majordomus plan validate
- bin/majordomus intent validate
Evidence required
- pr_metadata_projected
- work_in_review_is_not_next
- milestone_gate_is_explained
- references_resolve_on_master
- one_allocator
- issues_come_from_the_projection
- every_commit_names_its_issue
- one_version_everywhere
- merged_result_is_judged
- conventions_declared_once
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 |
|---|---|---|---|---|
| I3970 | BLOCKED | 1 | I3979 | Every pull request carries its metadata, projected from the trunk's records: labels, milestone, assignee and Refs links, never a closing keyword |
| I3971 | BLOCKED | 4 | I3754 | Work in an open pull request or under a live branch claim is reported taken and is never the next issue |
| I3972 | BLOCKED | 1 | I3757 | plan validate names every issue held only by its milestone gate, and an issue may declare it needs nothing from the milestone's dependencies |
| I3973 | READY | 0 | — | A record is referenced only once it is on master: a pull request naming an unlanded id is refused, and convergence reports stranded records |
| I3974 | READY | 0 | — | One allocator surveys every number (issue ids, ADR numbers, case numbers), and two branches adding one number under different names are refused |
| I3975 | BLOCKED | 2 | I3970, I3979 | GitHub issues are created only by github-sync: an agent's raw create is refused, an issue nobody projected is reported on GitHub, and an unmarked issue is never adopted |
| I3976 | BLOCKED | 2 | I3973, I3915 | Every commit names the issue it serves, outside narrow machine-verifiable exemptions, with the earlier history as a baseline |
| I3977 | BLOCKED | 1 | I3449 | Every page a deployment serves names only versions of the release model, checked after the deploy |
| I3978 | BLOCKED | 2 | I3915 | Each train member is judged on its merged tree, and a fix member joins only with a test and its changed-code coverage |
| I3979 | READY | 0 | — | Every label, branch prefix and commit type is declared once, projected to GitHub, described in CONTRIBUTING and checked |
The graph
flowchart LR
I3970["I3970<br/>Every pull request carries its metadata, projected from the trunk's records: labels, milestone, assignee and Refs links, never a closing keyword"]:::blocked
I3971["I3971<br/>Work in an open pull request or under a live branch claim is reported taken and is never the next issue"]:::blocked
I3972["I3972<br/>plan validate names every issue held only by its milestone gate, and an issue may declare it needs nothing from the milestone's dependencies"]:::blocked
I3973["I3973<br/>A record is referenced only once it is on master: a pull request naming an unlanded id is refused, and convergence reports stranded records"]:::ready
I3974["I3974<br/>One allocator surveys every number (issue ids, ADR numbers, case numbers), and two branches adding one number under different names are refused"]:::ready
I3975["I3975<br/>GitHub issues are created only by github-sync: an agent's raw create is refused, an issue nobody projected is reported on GitHub, and an unmarked issue is never adopted"]:::blocked
I3976["I3976<br/>Every commit names the issue it serves, outside narrow machine-verifiable exemptions, with the earlier history as a baseline"]:::blocked
I3977["I3977<br/>Every page a deployment serves names only versions of the release model, checked after the deploy"]:::blocked
I3978["I3978<br/>Each train member is judged on its merged tree, and a fix member joins only with a test and its changed-code coverage"]:::blocked
I3979["I3979<br/>Every label, branch prefix and commit type is declared once, projected to GitHub, described in CONTRIBUTING and checked"]:::ready
I3970 --> I3975
I3973 --> I3976
I3979 --> I3970
I3979 --> I3975
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 (10)
- I3970 Every pull request carries its metadata, projected from the trunk's records: labels, milestone, assignee and Refs links, never a closing keyword
- I3971 Work in an open pull request or under a live branch claim is reported taken and is never the next issue
- I3972 plan validate names every issue held only by its milestone gate, and an issue may declare it needs nothing from the milestone's dependencies
- I3973 A record is referenced only once it is on master: a pull request naming an unlanded id is refused, and convergence reports stranded records
- I3974 One allocator surveys every number (issue ids, ADR numbers, case numbers), and two branches adding one number under different names are refused
- I3975 GitHub issues are created only by github-sync: an agent's raw create is refused, an issue nobody projected is reported on GitHub, and an unmarked issue is never adopted
- I3976 Every commit names the issue it serves, outside narrow machine-verifiable exemptions, with the earlier history as a baseline
- I3977 Every page a deployment serves names only versions of the release model, checked after the deploy
- I3978 Each train member is judged on its merged tree, and a fix member joins only with a test and its changed-code coverage
- I3979 Every label, branch prefix and commit type is declared once, projected to GitHub, described in CONTRIBUTING and checked
Canonical record: .ai/repo/project/milestones/merging-and-referencing-are-enforced.yaml. Read it back with majordomus plan show merging-and-referencing-are-enforced.