Skip to content

chore(phase-2.1): delete root Mustfile and Dustfile - #814

Merged
hyperpolymath merged 1 commit into
mainfrom
phase-2.1-delete-root-contractiles
Sep 17, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
phase-2.1-delete-root-contractiles

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Phase 2.1 of the reorg plan — the first of the four deletions. Taken first because it is two files and trivially reversible, so it proves the CI story before anything larger moves.

The plan says of this step: "Trivially reversible; two files; clears a naming-convention contradiction. Do it first to prove the CI story." That is what this is.

What and why

Root Mustfile (15 lines, YAML checks: list) and Dustfile (32 lines, recovery:/generated:/templates: handlers) are extension-less contractiles at the repository root, superseded by .machine_readable/contractiles/{must,dust}/.

This is the map entry being carried out, not a new decision. standards-map.toml already declared it:

from   = "Mustfile"
target = "DELETE"
kind   = "superseded-contractile"
note   = "extension-less contractiles at root, superseded by
          machine-readable/contractiles/. Two naming conventions in one tree."

That note is the naming-convention contradiction Phase 2.1 was scheduled to clear.

Neither file was load-bearing

Both CI consumers read the dotted copies, and neither reads the root ones:

script default path
scripts/check-mustfile-structure.sh .machine_readable/contractiles/must/Mustfile.a2ml
scripts/run-mustfile.sh .machine_readable/contractiles/must/Mustfile.a2ml

Both dotted files exist and are untouched. The remaining grep hits for "Mustfile"/"Dustfile" are prose about the convention (.claude/CLAUDE.md, .githooks/pre-commit, the Makefile blocker, validate-a2ml.sh); no document links to the root files and no script sources them.

tasks/Mustfile, contractiles/must/Mustfile and the ~20 others elsewhere in the tree are out of scope and untouched — this deletes the root pair only.

The map moves with the files

Gate D is bidirectional — assertion 1 requires every from to exist, assertion 2 requires every top-level entry to be mapped — so deleting the files without deleting their map entries would have failed assertion 1. Both [[entry]] blocks are removed and entry_count goes 120 → 118 in the same commit. That bidirectionality is precisely what lets Gate D police a deletion at all.

Witnesses

Gate D   [1] all 118 mapped paths exist
         [2] all 118 top-level entries are mapped
         [3] ok    [4] ok
         [5] entry_count = 118
         GATE D PASSED

Gate A   passed 8   failed 0   skipped 2   GATE A PASSED

Gate A is unaffected by design: standards-map.toml, Mustfile and Dustfile are not named in canon.lock [canon.artifacts] (criteria, gates, applicability, lifecycle, constitution), so this is not a canon change and no version bump is required or made.

Next

Phase 2.2 — extract rhodium-standard-repositories/spec/ (11 files) to 0-canon/rsr/, then delete the surrounding directory (−1,138 files, 43% of the repo). That is the single highest-value change in the plan and is deliberately left to its own PR so this one stays reviewable.

Phase 2.3 (the machine-readable/ rename) remains blocked on ruling R-A, and I've flagged a conflict in that ruling for your attention separately.

Phase 2.1 of the reorg plan — the first of the four deletions, taken first
because it is two files and trivially reversible, so it proves the CI story
before anything larger moves.

WHAT AND WHY

Root `Mustfile` (15 lines, YAML `checks:` list) and `Dustfile` (32 lines,
`recovery:`/`generated:`/`templates:` handlers) are extension-less contractiles
sitting at the repository root, superseded by
`.machine_readable/contractiles/{must,dust}/`. The map entry already said so:

    from   = "Mustfile"
    target = "DELETE"
    kind   = "superseded-contractile"
    note   = "extension-less contractiles at root, superseded by
              machine-readable/contractiles/. Two naming conventions in one tree."

This commit is that map entry being carried out, not a new decision. That note
IS the naming-convention contradiction Phase 2.1 was scheduled to clear.

NEITHER FILE WAS LOAD-BEARING

Both CI consumers of these contractiles already read the dotted copies, and
neither reads the root ones:

    scripts/check-mustfile-structure.sh   default: .machine_readable/contractiles/must/Mustfile.a2ml
    scripts/run-mustfile.sh               default: .machine_readable/contractiles/must/Mustfile.a2ml

Both dotted files exist and are untouched. The remaining grep hits for
"Mustfile"/"Dustfile" are prose about the *convention* (`.claude/CLAUDE.md`,
`.githooks/pre-commit`, the Makefile blocker, `validate-a2ml.sh`); no document
links to the root files and no script sources them. `tasks/Mustfile`,
`contractiles/must/Mustfile` and the ~20 others elsewhere in the tree are out of
scope and untouched — this deletes the root pair only.

THE MAP MOVES WITH THE FILES

Gate D is bidirectional (assertion 1: every `from` exists; assertion 2: every
top-level entry is mapped), so deleting the files without deleting their map
entries would have failed assertion 1. Both `[[entry]]` blocks are removed and
`entry_count` goes 120 -> 118 in the same commit — the property that makes Gate D
able to police a deletion at all.

WITNESSES

  Gate D   [1] all 118 mapped paths exist
           [2] all 118 top-level entries are mapped
           [3] ok   [4] ok
           [5] entry_count = 118
           GATE D PASSED
  Gate A   passed 8   failed 0   skipped 2   GATE A PASSED

Gate A is unaffected by design: `standards-map.toml`, `Mustfile` and `Dustfile`
are not named in canon.lock [canon.artifacts] (criteria, gates, applicability,
lifecycle, constitution), so this is not a canon change and no version bump is
required or made.
@coderabbitai

coderabbitai Bot commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 6d238e3f-a128-4e85-8daf-6478c12394c4

📥 Commits

Reviewing files that changed from the base of the PR and between 33ec4a7 and d119d9d.

📒 Files selected for processing (3)
  • Dustfile
  • Mustfile
  • standards-map.toml
💤 Files with no reviewable changes (2)
  • Mustfile
  • Dustfile

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Hypatia
  • GitHub Check: scan / Hypatia Neurosymbolic Analysis
⚠️ CI failures not shown inline (6)

GitHub Actions: Actions Lockfile Gate / 0_uses ⊆ actions.lock.txt: chore(phase-2.1): delete root Mustfile and Dustfile

Conclusion: failure

View job details

##[group]Run bash .githooks/validate-actions-lock.sh
 �[36;1mbash .githooks/validate-actions-lock.sh�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 �[0;31m[validate-actions-lock] ERROR: not in actions.lock: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02�[0m
     normalised to: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
 �[0;31m[validate-actions-lock] 1 ref(s) missing from the lockfile�[0m
     Regenerate with the LOCKFILE ONLY, and verify the *.yml diff is empty:
       gh actions-lock <workflow paths> --no-migrate-local-actions --no-narrow
       git diff --stat -- '.github/workflows/*.yml'   # MUST be empty
 ##[error]Process completed with exit code 1.

GitHub Actions: Registry Verify / 0_Registry + topology in sync.txt: chore(phase-2.1): delete root Mustfile and Dustfile

Conclusion: failure

View job details

##[group]Run if ! bash scripts/build-registry.sh --check; then
 �[36;1mif ! bash scripts/build-registry.sh --check; then�[0m
 �[36;1m  {�[0m
 �[36;1m    echo "### Registry drift detected"�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo "A tracked file under a spec home (or STATE.a2ml) changed without"�[0m
 �[36;1m    echo "regenerating the derived registry/topology. Fix locally:"�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo '```sh'�[0m
 �[36;1m    echo "just registry        # or: bash scripts/build-registry.sh"�[0m
 �[36;1m    echo "git add .machine_readable/REGISTRY.a2ml TOPOLOGY.adoc"�[0m
 �[36;1m    echo '```'�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo "Install the pre-commit guard so this is caught before push:"�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo '```sh'�[0m
 �[36;1m    echo "just hooks-install"�[0m
 �[36;1m    echo '```'�[0m
 �[36;1m  } >> "$GITHUB_STEP_SUMMARY"�[0m
 �[36;1m  exit 1�[0m
 �[36;1mfi�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 DRIFT: .machine_readable/REGISTRY.a2ml is stale — run 'just registry'
 ##[error]Process completed with exit code 1.

GitHub Actions: Self Test / 0_Repo self-tests.txt: chore(phase-2.1): delete root Mustfile and Dustfile

Conclusion: failure

View job details

##[group]scripts/tests/build-registry-test.sh
 == the committed artefacts are in sync with the committed tree ==
   ❌ --check on a clean checkout (rc=1)
        | DRIFT: .machine_readable/REGISTRY.a2ml is stale — run 'just registry'
 == --check detects a mutated artefact ==
   ✅ a mutated REGISTRY.a2ml is reported as DRIFT
   ✅ a mutated TOPOLOGY.adoc is reported as DRIFT
 == --check detects a tree change the artefacts do not yet record ==
   ✅ a newly-tracked file under a spec home makes the artefacts stale
 == the gate's scope is the spec homes, not the whole tree ==
   ❌ a file outside every spec home unexpectedly drifted the registry (rc=1)
        | DRIFT: .machine_readable/REGISTRY.a2ml is stale — run 'just registry'
 == regenerating clears the drift ==
   ✅ a regenerated registry is back in sync
 == the generator is deterministic ==
   ✅ two REGISTRY.a2ml generations are byte-identical
   ✅ two TOPOLOGY.adoc generations are byte-identical
   ✅ REGISTRY.a2ml carries no generation timestamp
 build-registry regression: 7 passed, 2 failed
 ##[error]scripts/tests/build-registry-test.sh failed (exit 1)

GitHub Actions: Actions Lockfile Gate / uses ⊆ actions.lock: chore(phase-2.1): delete root Mustfile and Dustfile

Conclusion: failure

View job details

##[group]Run bash .githooks/validate-actions-lock.sh
 �[36;1mbash .githooks/validate-actions-lock.sh�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 �[0;31m[validate-actions-lock] ERROR: not in actions.lock: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02�[0m
     normalised to: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
 �[0;31m[validate-actions-lock] 1 ref(s) missing from the lockfile�[0m
     Regenerate with the LOCKFILE ONLY, and verify the *.yml diff is empty:
       gh actions-lock <workflow paths> --no-migrate-local-actions --no-narrow
       git diff --stat -- '.github/workflows/*.yml'   # MUST be empty
 ##[error]Process completed with exit code 1.

GitHub Actions: Registry Verify / Registry + topology in sync: chore(phase-2.1): delete root Mustfile and Dustfile

Conclusion: failure

View job details

##[group]Run if ! bash scripts/build-registry.sh --check; then
 �[36;1mif ! bash scripts/build-registry.sh --check; then�[0m
 �[36;1m  {�[0m
 �[36;1m    echo "### Registry drift detected"�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo "A tracked file under a spec home (or STATE.a2ml) changed without"�[0m
 �[36;1m    echo "regenerating the derived registry/topology. Fix locally:"�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo '```sh'�[0m
 �[36;1m    echo "just registry        # or: bash scripts/build-registry.sh"�[0m
 �[36;1m    echo "git add .machine_readable/REGISTRY.a2ml TOPOLOGY.adoc"�[0m
 �[36;1m    echo '```'�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo "Install the pre-commit guard so this is caught before push:"�[0m
 �[36;1m    echo ""�[0m
 �[36;1m    echo '```sh'�[0m
 �[36;1m    echo "just hooks-install"�[0m
 �[36;1m    echo '```'�[0m
 �[36;1m  } >> "$GITHUB_STEP_SUMMARY"�[0m
 �[36;1m  exit 1�[0m
 �[36;1mfi�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 DRIFT: .machine_readable/REGISTRY.a2ml is stale — run 'just registry'
 ##[error]Process completed with exit code 1.

GitHub Actions: Self Test / Repo self-tests: chore(phase-2.1): delete root Mustfile and Dustfile

Conclusion: failure

View job details

##[group]scripts/tests/build-registry-test.sh
 == the committed artefacts are in sync with the committed tree ==
   ❌ --check on a clean checkout (rc=1)
        | DRIFT: .machine_readable/REGISTRY.a2ml is stale — run 'just registry'
 == --check detects a mutated artefact ==
   ✅ a mutated REGISTRY.a2ml is reported as DRIFT
   ✅ a mutated TOPOLOGY.adoc is reported as DRIFT
 == --check detects a tree change the artefacts do not yet record ==
   ✅ a newly-tracked file under a spec home makes the artefacts stale
 == the gate's scope is the spec homes, not the whole tree ==
   ❌ a file outside every spec home unexpectedly drifted the registry (rc=1)
        | DRIFT: .machine_readable/REGISTRY.a2ml is stale — run 'just registry'
 == regenerating clears the drift ==
   ✅ a regenerated registry is back in sync
 == the generator is deterministic ==
   ✅ two REGISTRY.a2ml generations are byte-identical
   ✅ two TOPOLOGY.adoc generations are byte-identical
   ✅ REGISTRY.a2ml carries no generation timestamp
 build-registry regression: 7 passed, 2 failed
 ##[error]scripts/tests/build-registry-test.sh failed (exit 1)
🔇 Additional comments (1)
standards-map.toml (1)

35-35: LGTM!


📝 Summary

Summary by CodeRabbit

  • Chores
    • Removed obsolete recovery and deprecation configuration.
    • Removed the superseded mandatory-check configuration.
    • Updated the standards map to exclude these retired configuration entries.

Walkthrough

The pull request deletes the obsolete Dustfile and Mustfile. It removes their entries from standards-map.toml and changes the declared entry count from 120 to 118.

Changes

Obsolete contractile cleanup

Layer / File(s) Summary
Remove obsolete configuration files
Dustfile, Mustfile
Deletes the recovery and deprecation definitions from Dustfile. Deletes the four mandatory checks from Mustfile.
Reconcile the standards map
standards-map.toml
Removes the Dustfile and Mustfile entries. Changes entry_count from 120 to 118.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Other

Suggested reviewers: joshuajewell

Merge Risk: ⚪ Minimal · up to d119d

CI continues to use the replacement contractiles, and the standards map is consistent with the two deletions. No merge-blocking behavior remains.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the deletion of the root Mustfile and Dustfile. It matches the main change in the pull request.
Description check ✅ Passed The description directly explains the deletion, its purpose, scope, map update, and validation results. It is related to the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit reads each line,
The patch grows clear beneath the moon,
Small changes hop in place,
Tests guard the garden path,
Reviews bloom before the dawn.

Comment @coderabbitai help to get the list of available commands.

@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath merged commit 4ef3f49 into main Sep 17, 2026
29 of 33 checks passed
@hyperpolymath
hyperpolymath deleted the phase-2.1-delete-root-contractiles branch September 17, 2026 18:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant