iter design-md-rolesplit.1 (DONE 9/9): DESIGN.md -> design/ ledger role-split
The 3020-line docs/DESIGN.md is replaced by the design/ ledger:
design/INDEX.md (sole addressable spine, typed Contracts+Models tables,
polymorphic links — prose file OR authoritative source //!), 14
design/contracts/*.md test-linked invariants + 3 source-link-only
contracts (mangling/env-construction/qualified-xref, no prose file —
code is SoT), 5 design/models/*.md whitepapers, and
docs/journals/2026-05-19-design-decision-records.md (the
relitigation-guard archive — every why/rejected/does-not-do/rollback/
empirical ### moved out at ###-granularity). Clean cut: git rm
docs/DESIGN.md, no stub.
RED-first crates/ailang-core/tests/design_index_pin.rs — the 4-clause
anti-regrowth spine (DESIGN.md-gone / every-INDEX-link-resolves /
every-contract-names-a-resolvable-ratifier /
contracts-carry-no-decision-record-prose) — demonstrably RED before,
GREEN after. Build-atomic by task ordering: design_schema_drift.rs's
include_str! (the only compile-time consumer) retargeted to
design/contracts/data-model.md BEFORE the deletion; its
## Data model/## Pipeline slicer dropped (a simplification the split
enables). 2 NoInstance diagnostics + 2 lockstep E2Es retargeted to
design/contracts/{float-semantics,typeclasses}.md. ~12 agent reading
lists + 5 SKILL bodies + CLAUDE.md + skills/README.md + ~25
code/C/.ail/spec comment xrefs retargeted; OQ7 dangling 'Iter 13b'
cite deleted (no forward target — a pointer would be fiction).
honesty-rule.md rewritten so the rule names the new home
(rationale->journals), resolving the recon-found internal
contradiction; the two docs_honesty_pin.rs:70,72 pinned phrases kept
verbatim+contiguous.
Boss-verified independently: cargo test --workspace 646 passed /
0 failed; design_index_pin 4/4; acceptance grep CLEAN of live
DESIGN.md refs (residuals = only the spec-mandated clause-4
deletion-enforcer). 2 DONE_WITH_CONCERNS routed to the mandatory
milestone-close audit: (a) str-abi.md:23 '(iter str-concat,
2026-05-13)' provenance stamp trips advisory architect_sweeps Sweep-1
— Boss-confirmed byte-identical to DESIGN.md@deeffb1:2062-2065, a
faithfully-migrated PRE-EXISTING anchor (regexes verbatim, only path
retargeted), NOT split-introduced — RATIFY-or-tidy at audit; (b) a
now stale-direction intra-prose 'see Str ABI below' cross-ref in
float-semantics.md — audit-adjudication candidate. Plan defect noted:
Task 9 Step 4's verbatim acceptance grep used a ^./ anchor not
matching the system's grep -rIn output; substance re-verified CLEAN.
Spec grounding-check PASS x2. Journals INDEX + decision-records
pointer appended (Boss-only).
This commit is contained in:
@@ -1390,7 +1390,8 @@ fn load_workspace_human(
|
||||
///
|
||||
/// Cross-module references (`<prefix>.<def>`) are always kept — a local
|
||||
/// binding can never shadow a dotted name (the typechecker rejects defs
|
||||
/// with a dot, see DESIGN.md "qualified cross-module references").
|
||||
/// with a dot; qualified cross-module references are code-SoT — see
|
||||
/// the `qualified-xref` row in design/INDEX.md).
|
||||
fn collect_refs(def: &ailang_core::Def) -> std::collections::BTreeSet<String> {
|
||||
let mut out = std::collections::BTreeSet::new();
|
||||
let builtins: std::collections::HashSet<&'static str> =
|
||||
@@ -1569,7 +1570,7 @@ fn walk_term(
|
||||
/// Adds the variable bindings introduced by a pattern to `scope` and
|
||||
/// returns the names that were freshly inserted (so the caller can roll
|
||||
/// them back). MVP-restricted: nested ctor patterns only contain
|
||||
/// `Var`/`Wild` — see DESIGN.md.
|
||||
/// `Var`/`Wild` — see design/contracts/data-model.md.
|
||||
fn bind_pattern(
|
||||
p: &ailang_core::ast::Pattern,
|
||||
scope: &mut std::collections::HashSet<String>,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! Pin for the iter-24.3 codegen `import_map`-fallback path
|
||||
//! (DESIGN.md §"Cross-module references in synthesised bodies"
|
||||
//! invariant 2).
|
||||
//! (design/contracts/typeclasses.md, "Cross-module references in
|
||||
//! synthesised bodies" invariant 2).
|
||||
//!
|
||||
//! Property protected: post-mono synthesised body cross-module
|
||||
//! references resolve at codegen via the fallback to
|
||||
|
||||
@@ -2840,9 +2840,9 @@ fn str_clone_drop_balances_rc_stats() {
|
||||
/// static-Str input (literal `"abc"`). Both clones print their
|
||||
/// input bytes; RC stats account for three heap-Str slabs (one
|
||||
/// from int_to_str, two from str_clone) and three matching frees.
|
||||
/// Pins the "uniform consumer ABI" claim from DESIGN.md §"Str
|
||||
/// ABI" — str_clone only reads len + bytes + NUL, never the
|
||||
/// rc_header.
|
||||
/// Pins the "uniform consumer ABI" claim from
|
||||
/// design/contracts/str-abi.md — str_clone only reads len + bytes +
|
||||
/// NUL, never the rc_header.
|
||||
#[test]
|
||||
fn str_clone_cross_realisation_uniform_abi() {
|
||||
let (stdout, allocs, frees, live) =
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Embedding-ABI M3 record round-trip C host (own + borrow via a
|
||||
* compile-time -DBORROW switch). Frozen value layout (DESIGN.md
|
||||
* §"Embedding ABI" > "Frozen value layout"):
|
||||
* compile-time -DBORROW switch). Frozen value layout
|
||||
* (design/contracts/frozen-value-layout.md):
|
||||
* p - 8 .. p uint64_t refcount header (set to 1 by ailang_rc_alloc)
|
||||
* p + 0 int64_t constructor tag (single ctor → 0)
|
||||
* p + 8 IEEE-754 double field 0 = Float acc
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* only ever push a *scalar* per-tick sample; this host pushes a
|
||||
* single-ctor all-scalar *record* `Tick` as the per-call payload —
|
||||
* the actual minimal data-server binding shape. Frozen value layout
|
||||
* (DESIGN.md §"Embedding ABI" > "Frozen value layout"):
|
||||
* (design/contracts/frozen-value-layout.md):
|
||||
*
|
||||
* State (24-byte payload):
|
||||
* p - 8 .. p uint64_t refcount header (set to 1 by ailang_rc_alloc)
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
//!
|
||||
//! Property protected: a polymorphic Eq/Ord helper invoked at Float
|
||||
//! fires `no-instance` (since Float has neither Eq nor Ord instance
|
||||
//! per DESIGN.md §"Float semantics") AND the diagnostic message
|
||||
//! cross-references the canonical Float-semantics section so the
|
||||
//! per design/contracts/float-semantics.md) AND the diagnostic message
|
||||
//! cross-references the canonical float-semantics contract so the
|
||||
//! LLM author immediately learns the partial-Float story rather
|
||||
//! than seeing a bare "no instance" message.
|
||||
|
||||
@@ -35,11 +35,11 @@ fn eq_at_float_fires_float_aware_noinstance() {
|
||||
no_inst.message
|
||||
);
|
||||
|
||||
// Cross-ref to DESIGN.md §Float semantics — the LLM author should be
|
||||
// pointed at the canonical explanation of partial Float orderability.
|
||||
// Cross-ref to the float-semantics contract — the LLM author should
|
||||
// be pointed at the canonical explanation of partial Float orderability.
|
||||
assert!(
|
||||
no_inst.message.contains("Float semantics") || no_inst.message.contains("DESIGN"),
|
||||
"expected NoInstance message to cross-reference DESIGN.md §Float semantics, got: {:?}",
|
||||
no_inst.message.contains("design/contracts/float-semantics.md"),
|
||||
"expected NoInstance message to cross-reference the float-semantics contract, got: {:?}",
|
||||
no_inst.message
|
||||
);
|
||||
}
|
||||
|
||||
@@ -86,8 +86,10 @@ fn eq_ord_user_adt_eq_intbox_hash_stable() {
|
||||
let mono = monomorphise_workspace(&ws).expect("mono");
|
||||
|
||||
// The mono symbol for `eq` at a user-defined ADT uses the
|
||||
// `<method>__<8-hex-prefix>` mangling per DESIGN.md
|
||||
// §"Mangling scheme" (primitives use the bare type name; compound
|
||||
// `<method>__<8-hex-prefix>` mangling (mangling is code-SoT —
|
||||
// see the `mangling` row in design/INDEX.md / the
|
||||
// crates/ailang-codegen/src/lib.rs //! header) (primitives use
|
||||
// the bare type name; compound
|
||||
// / user-defined types use the 8-hex BLAKE3 prefix of the
|
||||
// canonical type bytes). We look up the single `eq__` symbol
|
||||
// synthesised at `IntBox` — there is only one user instance,
|
||||
@@ -107,8 +109,9 @@ fn eq_ord_user_adt_eq_intbox_hash_stable() {
|
||||
.expect("eq__<IntBox-hash> not synthesised");
|
||||
|
||||
// The 8-hex-prefix in the mono-symbol name is the BLAKE3 prefix
|
||||
// of the canonical IntBox type bytes (DESIGN.md §"Mangling
|
||||
// scheme"). Drift here means either the canonical-form encoding
|
||||
// of the canonical IntBox type bytes (mangling is code-SoT — see
|
||||
// the `mangling` row in design/INDEX.md). Drift here means either
|
||||
// the canonical-form encoding
|
||||
// changed or the type's canonical bytes changed — both warrant
|
||||
// investigation before re-pinning.
|
||||
assert_eq!(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! Pin for the iter-24.3 FreeFnCall constraint-residual-push
|
||||
//! invariant (DESIGN.md §"Cross-module references in synthesised
|
||||
//! bodies" invariant 3).
|
||||
//! invariant (design/contracts/typeclasses.md, "Cross-module
|
||||
//! references in synthesised bodies" invariant 3).
|
||||
//!
|
||||
//! Property protected: bare-name references to polymorphic free fns
|
||||
//! that resolve through the auto-injected-prelude path AT THE
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//!
|
||||
//! Property protected: calling `print` on a function type fires the
|
||||
//! `no-instance` diagnostic with a Show-aware message that
|
||||
//! cross-references DESIGN.md §"Prelude (built-in) classes", so the
|
||||
//! cross-references design/contracts/typeclasses.md, so the
|
||||
//! LLM author immediately learns which types ship with built-in Show
|
||||
//! and how to declare their own instance for a user type.
|
||||
|
||||
@@ -40,12 +40,11 @@ fn print_on_fn_type_fires_show_aware_no_instance() {
|
||||
no_inst.message
|
||||
);
|
||||
|
||||
// Must cross-reference DESIGN.md §"Prelude (built-in) classes"
|
||||
// verbatim — that's the canonical anchor naming which types
|
||||
// ship with Show.
|
||||
// Must cross-reference design/contracts/typeclasses.md — that's
|
||||
// the canonical contract naming which types ship with Show.
|
||||
assert!(
|
||||
no_inst.message.contains("Prelude (built-in) classes"),
|
||||
"expected DESIGN.md §Prelude (built-in) classes cross-reference, got message: {:?}",
|
||||
no_inst.message.contains("design/contracts/typeclasses.md"),
|
||||
"expected design/contracts/typeclasses.md cross-reference, got message: {:?}",
|
||||
no_inst.message
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user