No description
Find a file
farmall856 7470c0bd84 fix: refuse to write through a symlinked agent file
nested pass: reconciled 0 of 5 relatedly CLAUDE.md files, by design now.
             AGENTS.md, .claude/rules/ and .gitignore were written in all
             five; CLAUDE.md is refused pending a structure decision.
excluded:    ralph2 (nested .git sharing its parent's remote, parent tracks
             its contents) — docs/inventory.md
untouched:   relatedly-poc, at the user's direction — 15 MB of Go source with
             no version control, recorded in docs/known-tasks.md

All five nested repos track CLAUDE.md as mode 120000 -> ../CLAUDE.md, a
symlink whose target sits OUTSIDE the repo, in the unversioned relatedly/
container. reconcile.sh followed those links, so five writes all landed in one
container file and the block reached none of the five repos. discover.sh
compounded it by reporting them "current": reading resolved through the link
to a target that did carry a block.

Reverted: relatedly/CLAUDE.md is restored byte-exact — 247 lines,
sha256 a6fd29f0ecdc5e72, zero sentinels — by inverting the injector's own
layout (line 1, then everything after the blank following the END sentinel).
Two earlier reconstruction attempts produced the right line count with the
wrong bytes; nothing was written until the hash matched.

Fixes:
- reconcile.sh exits 6 on a symlinked target, naming the link and its target.
  --check reports drift rather than erroring.
- reconcile-all.sh reports `symlink` status, records a failure with a note,
  and never writes.
- discover.sh reports `symlink` instead of resolving through, so a block that
  lives outside the repo can no longer read as current.

Also corrects a claim in docs/known-tasks.md that the document was "duplicated
six times and will drift". It is one file with five symlinks and cannot drift.
The error came from `stat` not dereferencing by default, so an inode comparison
compared the links' inodes rather than their target's.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 15:20:15 -05:00
.claude/rules reconcile: propagate canonical v2 to 16 targets 2026-08-05 14:21:15 -05:00
canonical canonical: v2 — distilled base + svelte stack rule 2026-08-05 13:41:48 -05:00
docs fix: refuse to write through a symlinked agent file 2026-08-05 15:20:15 -05:00
plans reconcile: propagate canonical v2 to 16 targets 2026-08-05 14:21:15 -05:00
rules/stacks canonical: v2 — distilled base + svelte stack rule 2026-08-05 13:41:48 -05:00
tools fix: refuse to write through a symlinked agent file 2026-08-05 15:20:15 -05:00
.gitignore reconcile: propagate canonical v2 to 16 targets 2026-08-05 14:21:15 -05:00
AGENTS.md reconcile: propagate canonical v2 to 16 targets 2026-08-05 14:21:15 -05:00
CLAUDE.md reconcile: propagate canonical v2 to 16 targets 2026-08-05 14:21:15 -05:00
README.md Initial devEnvChecker: canonical base, stack rules, reconcile/scaffold tools 2026-08-05 10:32:14 -05:00

devEnvChecker

Single source of truth for agent-configuration conventions across ~/Development/.

Run Claude Code inside this repo and say "check my projects." Claude follows CLAUDE.md -> docs/procedure.md, runs tools/discover.sh to report drift, and (on your confirmation) runs tools/reconcile.sh per file to repair it. Stack rules in rules/stacks/ propagate into each project's .claude/rules/ only where the stack matches — a Go repo never gets TypeScript rules.

Layout

  • canonical/base.md + canonical/VERSION — the shared block, hash-stamped.
  • rules/stacks/*.md — path-scoped, per-stack rules.
  • tools/ — deterministic helpers (find-based, no fd). Documented in docs/tools.md.
  • docs/ — procedure, inventory (lineage pairs + exclusions), tool catalog, changelog.

Quick start

./tools/discover.sh ~/Development          # read-only drift report
./tools/reconcile.sh ~/Development/c2sync/CLAUDE.md   # repair one file

Adding a rule/tool

Tell Claude in this repo. It edits the right file, bumps canonical/VERSION, logs docs/changelog.md, and re-runs reconciliation to propagate.