Development record
Contributions are inbound = outbound MIT, and the trust boundary is the organisation's role ladder
Context
The repository is public, holds outside collaborators, and moved from a
personal account to an organisation on 2026-08-19. Until that move there was no
role between "no access" and "can publish": on a personal repository a
collaborator holds write — push, merge, and (because the release pipeline fires
on a push to the default branch, and the plugin marketplace serves the repo
root) effectively publish. Every artefact governing contribution still
described a private solo project, including a deferred decision — "a human-only
Signed-off-by: (DCO) is deferred until the repo is public or takes its first
outside contribution" — whose trigger had already fired.
This record holds only what is settled and hard to reverse. The forward-looking
ladder above the entry rung is rfc-2;
the operative contributor-facing text is CONTRIBUTING.md, which this record
cites rather than restates (the adr-41 property).
Decision
- Inbound = outbound. A contribution is accepted under the repository's
MIT licence, exactly as it goes out. No CLA, and no DCO: for a small MIT
project a plain inbound = outbound statement carries the same assurance as a
Signed-off-by:ritual without the ceremony, and the kernel's own position — only a human may ever sign one — is preserved trivially by having none. The deferral is closed by this decision, not by silence. - The trust boundary is the organisation's role ladder. Access decisions
are expressed as organisation/repository roles, not ad-hoc grants: Triage is
the entry rung for new collaborators (issues and pull requests, no push),
and higher rungs are individual maintainer decisions about people, recorded
by the role itself. The publish surface behind the ladder is fenced
server-side — required checks and merge queue without bypass, code-owner
review over the paths that ship behaviour (
.github/CODEOWNERS), a required-reviewer environment between merge and release — and the applied rulesets are mirrored in-tree under.abcd/work/rulesets/(the live-vs-tree drift check is itd-92's remit). The required-reviewer clause alone is superseded by ADR-2610281718537125 (2026-10-28): Thereleaseenvironment carries no required reviewer, and the rest of this point stands.
Alternatives Considered
- DCO via
Signed-off-by:. The kernel's mechanism, and the original deferred plan. Rejected: it adds a per-commit ritual whose whole content — "I may submit this under the licence" — the inbound = outbound statement already carries at the project scale this repository has. Revisit if the project ever needs provenance stronger than the licence statement (e.g. relicensing). - A CLA. Assigns copyright and needs legal infrastructure; out of scale for a two-maintainer MIT project, and hostile to casual contribution.
- Trust by ad-hoc collaborator grants (the personal-repo shape). Rejected by the move itself: it has no rung between stranger and publisher, which is what made the migration urgent once invitations went out.
Consequences
CONTRIBUTING.mdstates the licence position and the intake rules; this record is why they are settled.- New collaborators enter at Triage. A rung above Triage is a maintainer decision about a person, never an automatic graduation — the ladder's shape and thresholds stay in rfc-2 until experience settles them.
- The DCO deferral text retires from every surface that carried it; work no
human signs off is still disclosed under the attribution convention
(
Assisted-by:), which is unchanged by this record.
Frontmatter
| id | adr-43 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-08-19 |
.abcd/development/decisions/adrs/0043-inbound-equals-outbound-and-the-org-role.md
open on GitHub ↗ · commit history ↗
References3
- adr-41Documents and ledgers never leave the user tier; a public citation requires both gatesrelated
- adr-2610281718537125A release publishes with no approval steprelated
- itd-92abcd tells every repo the truth about its fencerelated
Referenced by2
mentions7
- dcn-26082100000000012026-08-21 — Bug-hunt round 4, branch bughunt-b/round-4. Baseline (make preflight
- iss-296The hand-maintained ADR index table (.abcd/development/decisions/adrs/README.md) ends at adr-42 and omits committed records adr-43 and adr-44; the record-lint index_drift rule registers four indexes but not the ADR index, so this largest hand index is ungated. Same file: .abcd/work/rulesets/README.md says 'seven required status checks' where main-protection.json now lists eight (external-review added)
- iss-2608211145448208adr-43 (accepted 2026-08-19) decided 'No CLA, and no DCO' and named as its own consequence 'the DCO deferral text retires from every surface that carried it', but the deferral survived in two live surfaces the ADR's landing commit did not touch: AGENTS.md (symlinked as CLAUDE.md/GEMINI.md, injected into every agent session) said 'A human-only Signed-off-by: (DCO) is deferred to the public flip or the first outside contribution', and scripts/check-attribution.sh carried it twice — a comment and the runtime error text shown to a contributor whose commit trips COAUTHOR_RE — stating the false premise that the repo defers DCO until it goes public (it is already public). CONTRIBUTING.md already says 'no CLA and no Signed-off-by requirement', so the surfaces contradicted each other.
- iss-2608211147403129The ADR-RFC pairing contract disagreed across three surfaces. adrs/README.md declared RFCs carry 'related_adrs: [adr-N, ...]', but rfcs/README.md (the RFC frontmatter spec and its bidirectional table) defined no such field; and rfc-2 carried 'spawned_from: adr-43' — a field rfcs/README.md documented as itd-N only — while omitting spawned_intents/related_intents/authors/related_adrs, so adr-43's declared pair (related_rfcs: [rfc-2]) was one-sided. The RFC store is ungated (record_schema registers adr/itd/spc/iss only). rfc-2 was the sole outlier in the two-file store; landed with adr-43 (2026-08-19) with no recorded follow-up. Structurally identical to resolved iss-360 (adr-7 outlier).
- iss-2608211432482363rfc-1 declares related_intents itd-26 but itd-26 has no reciprocal related_rfcs, a one-sided pair the RFC bidirectional convention expects (last unswept half after round-4 rfc-2/adr-43 fix)
- itd-114Two Agents Can Mint At The Same Instant And Never Collide
- itd-185One ingest verb validates every cold-reading output — including what the reading was licensed to produce, not only what it saw