Skip to content

Claudinite growth: conversation extract - #766

Merged
missingbulb merged 1 commit into
mainfrom
claudinite/conversation-extract-d2026-07-27
Jul 27, 2026
Merged

Claudinite growth: conversation extract#766
missingbulb merged 1 commit into
mainfrom
claudinite/conversation-extract-d2026-07-27

Conversation

@missingbulb

Copy link
Copy Markdown
Owner

Scheduled grow_with_claudinite/conversation-extract run (dispatch #764).

Queue: 4 logs on conversation-logs. The issue-717 log was already mined twice (#732, #746/#747) and re-read this pass with nothing new. The three 2026-07-26 logs (issue-734, issue-753, issue-760) are fresh — never extracted.

Landed: 2 rules, both as bullets in .claudinite/local/packs/gcec/RULES.md → Working rules. Prose is the strongest available mechanism for each: neither condition is observable from a working tree, so no local check can carry them, and neither is an activity-scoped procedure that a skill would gate.

1. A silent SessionStart-hook miss (from the issue-760 log)

That session's context held only CLAUDE.md, the date, and the owner's email — the Claudinite injection (owner preferences + pack prose) never landed, and no Stop-hook feedback arrived between turns either, so the whole hook config was inert. Consequence: the preference making "LGTM" the merge-to-main command was absent, so at 13:25:47Z the session answered lgtm with "say the word if you'd like me to merge it" instead of merging. The owner had to ask "did you load my preferences?" at 13:26:22Z; recovery, merge included, ran to 13:27:51Z.

The rule that would have prevented it was already written down — it just wasn't in context. So the durable fix isn't the rule, it's the detection + one-call recovery: the tell (only CLAUDE.md present; no Stop-hook feedback) and bash .claudinite/shared/engine/hooks/session-start-command.sh, which is exactly what that session used to recover.

Routing caveat, for the reviewer / the promote stage: this bullet lives in prose that the very hook it describes is responsible for injecting, so it is unreadable in precisely the session that needs it. The genuinely strongest placements — hook reliability upstream, or a line in CLAUDE.md (the one surface confirmed to survive the miss) — are both outside this task's write surface (.claudinite/local/packs/ only). Captured here so it is recorded and promotable, flagged rather than silently mis-placed.

2. git checkout <old-branch> -- <paths> destroys the uncommitted edits it was meant to carry (from the issue-734 log)

At 06:39:31Z the run tried to relocate finished-but-uncommitted work onto a fresh branch in one chain:

git fetch origin main --quiet && git checkout -b claude/growth-dedup/734-a1f3c2 origin/main --quiet \
  && git checkout claude/charming-einstein-rmaeom -- <two paths>

The third clause restores the paths' committed content from the old branch — i.e. the pre-edit version — so it wiped the three edits it was added to preserve. Detected at 06:39:39Z, re-applied by 06:39:54Z. The larger cost is downstream: check_the_world.mjs + npm run test:offline (308 tests) had gone green at 06:38:57Z against the now-destroyed tree, so the whole verification pass was invalidated and re-run at 06:39:55Z before the 06:40:12Z commit.

git checkout -b <new> origin/main already carries a clean working tree; the "carry the paths across" clause is the trap.

Dedupe

Both were greped against the mounted canon (.claudinite/shared/, stamp 61b90ee) and the gcec pack:

  • No canon or local coverage of a silently-inert SessionStart hook, or of verifying that injection landed — the canon's inject-preferences.sh is deliberately fail-soft on a miss, and nothing tells a session how to notice.
  • git-github-advanced covers adjacent-but-different ground (don't commit environment drift a stop-hook nags about; give scheduled runs unique branch names). Nothing covers the destroy-your-own-edits path-checkout. This one is portable — captured locally per the method, for promote to lift.

Considered and rejected (below the bar / already covered)

Verification

check_the_world.mjs: 0 blocking, 11 advisory (all pre-existing, unchanged by this run). Docs-only change — no code or test surface touched. Nothing under .claudinite/shared/ (the read-only canon) was edited; the diff is one file.

Refs #764

🤖 Generated with Claude Code

https://claude.ai/code/session_01FaX36U1zAVmLqLNXLdAPWb


Generated by Claude Code

Two rules from the 2026-07-26 conversation logs, both into the gcec pack's
Working rules (prose is the strongest available mechanism — neither condition
is observable from a working tree at Stop time):

- A silent SessionStart-hook miss, from the issue-760 log: the session had
  only CLAUDE.md in context, so "LGTM" read as approval rather than the
  merge command, costing an owner round-trip. Names the tell and the
  one-call recovery.
- `git checkout <old-branch> -- <paths>` destroys the uncommitted edits it
  was meant to carry to a new branch, from the issue-734 log: three finished
  edits wiped and a green check + offline-suite pass invalidated.

Refs #764
@missingbulb
missingbulb merged commit 8bfa43d into main Jul 27, 2026
1 check passed
@missingbulb
missingbulb deleted the claudinite/conversation-extract-d2026-07-27 branch July 27, 2026 05:07
missingbulb added a commit that referenced this pull request Jul 28, 2026
One rule from the 2026-07-24/26 conversation logs, landed at two rungs of
the local ladder: the routing surface (the skill's own description) plus a
terse RULES.md bullet.

The owner preference maps "LGTM" to the canon `merge-to-main` skill, but
`git-github` is not among this repo's declared packs, so that skill is not
mounted and `Skill(merge-to-main)` returns *Unknown skill*. Every session in
the captured corpus that was told to merge made that call first:

- issue-717 log @4346s -> Unknown skill, then find + hand-read the SKILL.md.
- issue-734 log @93089s -> Unknown skill, then find + read + grep before
  finally reaching `Skill(merge-and-ci)` at 93109s (~20s, 3 wasted calls).
- issue-753 log @5284s -> Unknown skill, then find + read (~12s, 2 calls).

The gap is in the routing surface: gcec's `merge-and-ci` description never
claimed the trigger phrases the preference routes on, so the model followed
the preference to the skill it names. Fixed by having `merge-and-ci` claim
"LGTM"/"merge to main" explicitly and state that `merge-to-main` is not
mounted here, plus one RULES.md bullet for the always-injected path.

Retention is unset, so nothing was pruned and the `conversation-logs` branch
was not touched. The issue-760 log yielded nothing new (its SessionStart-hook
miss is already captured by #766).

Refs #770

Co-authored-by: Claude <noreply@anthropic.com>
missingbulb pushed a commit that referenced this pull request Jul 28, 2026
Reverts c4d6c7a (#771). The lesson it landed encoded the owner's personal
merge trigger phrase into this repo's pack, and explained why a canon skill
was not mounted here. Neither belongs in a project pack: the trigger phrase
is the owner's, injected per-session and changed without this repo hearing
about it, and pack mounting is engine plumbing rather than knowledge about
this codebase.

Also removes the two pre-existing references the same mistake left behind:

- The "SessionStart hook never fired" working rule (#766) — a Claudinite
  loading issue explained in a pack, justified by the same preference. Its
  own tracker note already flagged it as unreadable in exactly the session
  that needs it.
- The narrative "typed lgtm" in the merge-and-ci skill's auto-merge
  evidence (#746), now neutral. That rule stands; only the phrase is gone.

Records the general filter in the capture policy so the next extract run
does not re-derive any of this: personal preferences, Claudinite loading
mechanics, and anything derived from product requirements never land in a
pack, however strong the evidence. Packs carry development-process lessons
only. Each turns on what a lesson is about rather than anything observable
in a working tree, so they are prose and deliberately not checks.

Refs #770

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EDqNSQCQBiGXSaE3TmMxDL
missingbulb added a commit that referenced this pull request Jul 28, 2026
Reverts c4d6c7a (#771). The lesson it landed encoded the owner's personal
merge trigger phrase into this repo's pack, and explained why a canon skill
was not mounted here. Neither belongs in a project pack: the phrase is the
owner's, injected per-session and changed without this repo hearing about
it, and pack mounting is engine plumbing rather than knowledge about this
codebase.

Also removes two pre-existing instances of the same mistake:

- The "SessionStart hook never fired" working rule (#766) — a Claudinite
  loading issue explained in a pack, justified by the same preference. Its
  own tracker note already flagged it as unreadable in exactly the session
  that needs it.
- The narrative use of the phrase in the merge-and-ci skill's auto-merge
  evidence (#746), now neutral. That rule stands; only the phrase is gone.

Records the general filter in the capture policy so future extract runs do
not re-derive any of this: personal preferences, Claudinite loading
mechanics, and anything derived from product requirements never land in a
pack, however strong the evidence. Packs carry development-process lessons
only. Each turns on what a lesson is about rather than anything observable
in a working tree, so they are prose and deliberately not checks.

Rebased onto #775, which pruned this same capture-policy paragraph while
this change was in flight; its dedup is preserved and the exclusions were
rewritten in its tighter voice.

Refs #770
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.

2 participants