Skip to content

EP-NNNN: <a class="headerlink" href="#ep-nnnn" title="Permanent link">¶</a></h1> <p>Status: proposal Type: standards-track</p> <!-- AUTHORING TEMPLATE — copy this file to `EP-NNNN-<slug>.md`, fill it in, and delete every HTML comment (including this one) before opening the PR. This template is the skeleton for a new Enhancement Proposal. The process it encodes is normative in [EP-0009](EP-0009-the-ep-process.md) (an `active` process EP); this file is only the convenience scaffold. Where this template and EP-0009 ever differ, EP-0009 governs. The template is NOT itself an EP: it has no number, carries no decision, and is deliberately named `EP-template.md` so the status-sync guard (`scripts/check_ep_status_sync.py`) — which only matches `EP-NNNN-<slug>.md` — skips it. Do not assign it a number or add it to the README index. ==== Status: a controlled lifecycle, NOT free text ==== `Status:` is machine-readable and its value MUST be exactly one of: proposal · accepted · final · active rejected · withdrawn · deferred · superseded-by EP-NNNN A new EP opens at `proposal`. The lifecycle (EP-0009 §Statuses) is: proposal ──► accepted ──► final (standards-track) │ └─────► active (process) ├──► rejected (ruled no — kept as the record of why not) ├──► withdrawn (author retracted — kept) └──► deferred (parked with a stated revisit trigger) any non-terminal EP may become: superseded-by EP-NNNN (kept) EPs are never deleted and numbers are never reused; the terminal states are kept because recording why something was NOT done is half the corpus's value. ==== Type: standards-track OR process ==== `Type:` MUST be exactly `standards-track` or `process` (EP-0006 and later require the header; the gate enforces it). * standards-track — changes the framework's public contracts or runtime behaviour. Terminal success status `final`. On graduation it moves into `spec/` + implementation beads; `spec/` is then the authoritative contract and **where the final EP and the spec differ, the spec governs**. The EP is the design record behind the spec, never a second normative home. * process — rules about how the project itself works (conventions, lifecycle, review posture). Terminal success status `active`. On acceptance it NAMES its normative home — either an existing spec doc (e.g. EP-0007 names `Conventions.md` §Namespacing) or the active EP itself (the PEP-8 precedent — EP-0009's home is EP-0009). Name exactly one. ==== Not every EP graduates into spec/ ==== Graduation is per-type, and graduation is not the only outcome. A process EP may graduate into the active EP itself rather than `spec/`; any EP may end at `rejected` / `withdrawn` / `deferred` / `superseded` and is kept as the record. `final`/`active` asserts the DECISIONS are settled — it does not, on its own, assert the implementation is build-complete (a `final` EP may carry an implementation-errata ledger; the EP-0005 pattern). ==== Is an EP even warranted? ==== An EP is for feature-level / public-contract decisions with unresolved alternatives, or process/convention rules worth a durable rationale record. Settled mechanical material — a rename with no alternatives, a doc fix, a bug — goes straight to beads + `spec/` edits. The test: *if the design conversation fits in a bead description, it is a bead.* When in doubt, the operator decides; EPs are cheap to reject and rejection is itself a valuable record. ==== Sections ==== Keep the sections below that apply and delete the rest; the set is the EP-0009 §Document conventions list. State the positive principle first — subtractive framing is migration mechanics, not the rule. --> <blockquote> <p>One-paragraph orientation: what this EP decides and what its normative home is. A <code>process</code> EP states its named normative home here explicitly.</p> </blockquote> <h2 id="abstract">Abstract<a class="headerlink" href="#abstract" title="Permanent link">¶</a></h2> <!-- Two or three sentences: the decision, in plain language. --> <h2 id="motivation">Motivation<a class="headerlink" href="#motivation" title="Permanent link">¶</a></h2> <!-- The problem. Why a bead is not enough — the unresolved alternatives or the durable rationale that warrants an EP. --> <h2 id="goals--non-goals">Goals / Non-Goals<a class="headerlink" href="#goals--non-goals" title="Permanent link">¶</a></h2> <!-- What is in scope for this decision surface, and what is explicitly out. One EP, one decision surface — bundling independent decisions invites all-or-nothing rulings. --> <h2 id="relationships">Relationships<a class="headerlink" href="#relationships" title="Permanent link">¶</a></h2> <!-- Dependencies and cross-references live HERE (not scattered in prose): the EPs and specs this builds on, supersedes, or is constrained by. The README index row carries only status + a one-line summary. --> <h2 id="specification">Specification<a class="headerlink" href="#specification" title="Permanent link">¶</a></h2> <!-- The normative content. For a standards-track EP this is the design that will graduate into `spec/`; for a process EP it is the rule (and, if the home is this EP, this section IS the rule and the rest of the document is rationale). Normative-voiced text is permitted at `proposal` — it makes graduation a move, not a rewrite — but it binds nothing until accepted. --> <h2 id="rationale">Rationale<a class="headerlink" href="#rationale" title="Permanent link">¶</a></h2> <!-- Why this shape over the alternatives considered. --> <h2 id="backwards-compatibility">Backwards Compatibility<a class="headerlink" href="#backwards-compatibility" title="Permanent link">¶</a></h2> <!-- Pre-alpha: there is usually no compatibility surface to preserve. State the migration mechanics, if any, here — not as the headline rule. --> <h2 id="bead-plan--reference-implementation">Bead Plan / Reference Implementation<a class="headerlink" href="#bead-plan--reference-implementation" title="Permanent link">¶</a></h2> <!-- The waves that carry this EP into its normative home + implementation. Each graduation wave includes a guide-impact assessment: name which `docs/guide` chapters change and which payoffs become newly teachable, or record "no human-facing guide change yet" and why. Ledger rows cite live bead ids and are struck as they close. --> <h2 id="open-issues">Open Issues<a class="headerlink" href="#open-issues" title="Permanent link">¶</a></h2> <!-- Questions awaiting an operator ruling. An EP MUST NOT go `final`/`active` with open issues silently unresolved — record the disposition of each in a `Resolved Decisions` section as rulings land (the EP-0001/0002 pattern). --> <h2 id="recommendation">Recommendation<a class="headerlink" href="#recommendation" title="Permanent link">¶</a></h2> <!-- The author's recommended disposition for the operator to rule on. --> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> </div> <div class="md-social"> <a href="https://github.com/day8" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1M480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2m-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3m-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.indexes", "navigation.instant", "navigation.instant.prefetch", "navigation.top", "navigation.footer", "toc.follow", "search.suggest", "search.highlight", "search.share", "content.code.annotate", "content.code.copy"], "search": "../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src="../../assets/javascripts/bundle.83f73b43.min.js"></script> <script src="../../cljs/playground.js"></script> </body> </html>