Skip to content

proposal: rewrite CLAUDE.md with project-specific principles - #8

Open
Tardisyuan wants to merge 1 commit into
mainfrom
propose/claude-md-rewrite
Open

Tardisyuan wants to merge 1 commit into
mainfrom
propose/claude-md-rewrite

Conversation

@Tardisyuan

Copy link
Copy Markdown
Owner

Summary

Replaces current CLAUDE.md (Ruflo agent configuration) with project-specific development principles.

Current HEAD CLAUDE.md (175 lines)

Content: Ruflo/claude-flow agent configuration

  • Agent routing tables (researcher → architect → coder → tester → reviewer)
  • Swarm topology (hierarchical-mesh, max 15 agents)
  • MCP tools (memory_store, swarm_init, hooks_route)
  • CLI commands (@claude-flow/cli)
  • Build test: npm run build && npm test (frontend only)

Problems:

  • References @claude-flow/cli not installed in this project
  • Agent routing doesn't match available agent types
  • No backend coverage (Django/pytest)
  • No verification policy, no completion criteria
  • No root cause rule, no change impact analysis

Proposed CLAUDE.md (249 lines)

Content: Project development principles

  • Core principle: implement first, verify second
  • Completion criteria with evidence requirements
  • Verification policy matching CI (pytest + npm)
  • Root cause rule: symptom → root cause → fix
  • Change impact analysis before editing
  • Technical debt prioritization (P0/P1/P2)
  • Review and report rules
  • Self Improvement workflow for CLAUDE.md changes

Comparison

Aspect Current Proposed
Focus Agent routing & swarm config Project principles & verification
Backend None pytest command, verification policy
Frontend npm build && test lint, build, test, tsc
CI alignment None Matches ci.yml exactly
Evidence None Completion criteria, truthfulness rule
External deps @claude-flow/cli, ruflo MCP None

Discussion Questions

  1. Is the Ruflo agent config still needed? (ruflo not actively used)
  2. Should both contents coexist? (e.g. separate RUFLO.md)
  3. What sections from current HEAD should be preserved?

Testing

  • CLAUDE.md is not code — no tests needed
  • Changes are to project guidance only

Closes # (if applicable)

Replaces Ruflo agent configuration (swarm routing, MCP tools, agent
spawning) with project-specific development principles:

- Core principle: implement first, verify second
- Completion criteria with evidence requirements
- Verification policy matching CI pipeline
- Root cause rule and change impact analysis
- Technical debt prioritization (P0/P1/P2)
- Review and report rules
- Self Improvement workflow for CLAUDE.md changes

Discussion: Is this content worth adopting over the current Ruflo config?
Tardisyuan added a commit that referenced this pull request Aug 14, 2026
The list in populate_egyptian_actors.py called itself the forty-two
assessors, held 33 names, and none of them were assessors. They were major
deities (Shu, Tefnut, Geb, Nut, Hathor, Ptah, Sekhmet, Bastet), the four
sons of Horus, and personified concepts. The source is traceable: a World
History Encyclopedia article names "nine great judges: Ra … Shu … Tefnut …
Geb … Nut … Isis … Nephthys … Horus … Hathor" in prose above its actual
list, and that prose is what got copied. No papyrus seats Geb or Hathor
among the forty-two. Two of them, Ra and Maat, collided with real actors
and manufactured the duplicates fix_actor_civilization exists to clean up.

The real roster comes from Budge reading the Papyrus of Nebseni (BM EA
9900, sheet 30): the 1904 Gods of the Egyptians for the names, the
1898/1901 Book of the Dead for the home towns and confessions, both public
domain. The order is cross-checked against UCL's transcription of the
Papyrus of Maiherperi — a different papyrus, century and scholar — and
matches 42 for 42, with the only four disagreements falling on place names,
two of them exactly where Budge had already printed a question mark.

Budge is the right source for exactly this and not for much else. What is
needed here is the transcription of names and places, which is his solid
half; his interpretations are not used. Faulkner and Allen render these as
descriptions rather than names — "Far-strider", lowercase "far-strider" —
which cannot sit beside Ma'at, Anubis and Osiris in a UI.

No migration: powers_json is an existing JSONField that neither seeder had
ever written. It carries assessor_index, home_place, negative_confession,
source_edition and papyrus. assessor_index is load-bearing rather than
decorative — Actor.Meta.ordering is (civilization, role, name), so without
it the bench sorts alphabetically, which is simply wrong.

Doubt is carried, not resolved. Fifteen rows keep a source_notes caveat:
#8 has no home town because the text gives a phrase and not a place, so
the empty string is the correct value and a guess would not be; #32's
confession is half-unreadable in the scan and stays half; #37, #38 and #39
keep Budge's own question marks; #21, #22 and #23 record where the second
witness disagrees rather than quietly picking one. The empty key never
appears, so its absence cannot be misread as "checked".

name_zh is left blank throughout. These forty-two have no established
Chinese names, and get_localized_name() already falls back. Inventing
forty-two plausible ones is the exact failure this commit is correcting.

The guard on Nefer-Tem (#34) and Basti (#26) covers something nastier than
the old bug: the seeder matches on (civilization, name), so seeding
Nefertem or Bastet under those spellings would not create a duplicate — it
would silently overwrite an assessor, leaving nothing for
fix_actor_civilization to find. Ra and Maat at least left evidence.

Twelve tests, expectations hand-written rather than imported from the seed
table — the same convention as the rest of this file, and the reason the
old fake roster survived so long was that nothing asserted it independently.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Tardisyuan added a commit that referenced this pull request Aug 23, 2026
Design review §4: culpa and the Greek road counts rendered through
character-identical markup — one a sum of severity weights, the other a
row count. 22 beside 4 reads as "this soul is worse" at a glance, and they
are not on one scale. The fork removing colour from the Greek side made
them stop matching by accident; the distinction itself still did not
exist.

Four kinds, not the two proposed. Every numeric field in all four readings
was enumerated, and repayment_multiple and the Egyptian heart-to-feather
figure are dimensionless ratios while circuit_years and elapsed_years are
durations. Forcing those into "magnitude" or "count" would have
manufactured the next pair that look alike and are not. Fields that live
inside a sentence keep living there — counterweight, culpa_record_count,
the multiple, the circuit — because the words already say what they are,
and a second figure at the same size is the defect. `poena` gets no kind
at all: its type is null, not number | null, and classifying it would
assert a quantity that does not exist.

Only magnitudes lacked a unit, and none was invented. 分 is the 功過格's
own unit — 不善門#8 glosses 一過去功一分 — so borrowing it for Purgatory's
culpa or the heart weighing is netting under a new name, and "points"
reads as a score. The scale gets named instead of unitised: `weight`,
which is honest precisely because it sounds like the implementation's
field rather than any source's unit. It says 22 of this system's
significance weights and nothing more.

The classification lives in the payload type as a Record over the numeric
fields, so a new number that is not classified fails tsc, an entry for a
field that does not exist fails tsc, and a fifth kind fails tsc — all
three measured. The DOM assertions list the figures by hand rather than
deriving them from the same table, since a test generated from the
classification would endorse any classification.

Fixed while measuring: threshold_hint rendered {{weight}} — heart_weight,
a magnitude — in the slot that says "N times the feather", correct only
because MAAT_FEATHER_WEIGHT is 1. Set the feather to 2 and the headline
reads 11× while the sentence says 22, with nothing going red. The sentence
now states the two magnitudes and names the scale; the ratio is the
headline.

Also fixed: two page tests replaced @/lib/api/ledger wholesale with
jest.mock, which silently deletes every other export from the module. One
went red on this change; the other stayed green only because it never
reaches the panel — the double that is wrong where nobody looks. Both use
requireActual now and stub the one call.

Verified: frontend tsc 0, lint 0, 1072 passed / 67 suites, playwright
chromium 38 passed; backend untouched and re-run at 2575 passed / 91.25%.
Bundles 1235 -> 1236, all three identical. Ten mutations proven red.

Two copy choices are the owner's and are flagged rather than settled: the
English scale word, and whether `Aha` is the right term in the constructed
Egyptian locale.

Reported: an unrelated pre-existing stash was popped by mistake during
this work and fully rolled back — HEAD, the index, the stash itself and
every live file verified byte-identical afterwards, and the suites re-run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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