BDR-004 documents the decision to adopt auto permission mode as default with classifier safety net, alternatives, and feature-gate caveats. LRN-003 captures the gotcha that Claude Code's disable* settings use the literal sentinel string "disable" rather than a boolean — required context for any future permission-mode change. Journal entry added for 2026-04-27. Co-Authored-By: Claude <noreply@anthropic.com>
4.6 KiB
4.6 KiB
| type | entry_prefix | schema | rules | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| learnings_registry | LRN |
|
|
Learnings registry (LRN)
Index
| ID | Date | Pattern | Applies to |
|---|---|---|---|
| LRN-001 | 2026-04-22 | rtk shape-compression breaks pipes |
any pipeline chaining rtk curl/cat/read into jq, python -c, awk |
| LRN-002 | 2026-04-23 | Moving report-file paths requires grepping bash READS, not just WRITES | any refactor that moves a generated file used by a dispatcher |
| LRN-003 | 2026-04-27 | Claude Code disable* settings use sentinel string "disable", not boolean |
any change to permissions.defaultMode or related blocker keys |
LRN-001 — rtk shape-compression silently breaks downstream parsers
- Date: 2026-04-22
- Pattern: when a tracking tool (
rtk) intercepts stdout and returns a schematized/compressed representation instead of the raw payload, every downstream parser breaks silently — because the user (or the LLM) never seesrtk's output, only the parser error. - Context:
rtk curlreplaces raw JSON output with a tokenized version, regardless of TTY vs pipe. Claude Code hooks auto-rewritecurl→rtk curl, so the behavior is impossible to anticipate without knowing the hook. - Future application: for any tool that auto-rewrites standard commands, explicitly verify pipe behavior. Documented workaround:
exclude_commands=["curl"]in~/.config/rtk/config.toml, orrtk proxy. SeeBLK-001.
LRN-002 — Moving report-file paths requires grepping bash READS, not just WRITES
- Date: 2026-04-23
- Pattern: when moving the write path of a generated file (report, artifact, cache), you must also grep the places that READ that file — not only those that write it. Dispatchers (orchestrator skills that dispatch to an agent and then parse the result) typically contain bash commands like
test -s X.md,grep ... X.md,wc -l X.md— these refs are invisible if you only grep for "write" or "output path". - Context:
.claude/audits/refactor (commit5c5e82c). First pass: I updated write paths across 5 skills (seo/geo/harden/validate/code-clean) and 3 agents. The user asked for a verify-gate. They re-grepped and found 10+ bare bash refs (e.g.test -s HARDEN.md,grep -oE ... VALIDATE.md) I had missed — the dispatchers were broken (looking at project root while the agent was writing to.claude/audits/). Fixed in commit5c5e82c(bundled with the same commit). - Future application:
- Before declaring a file-path migration "complete", grep the basename (
grep -rn "HARDEN\.md") in addition to the full path — to catch bare bash usages. - If the file is used in pipelines (
test,grep,wc,cat,head), search for those verbs explicitly. - Verify-gates save work: one extra round asked by the user forced exhaustive re-grepping. Without it, two dispatchers would have shipped broken.
- Before declaring a file-path migration "complete", grep the basename (
LRN-003 — Claude Code disable* settings use the sentinel string "disable", not a boolean
- Date: 2026-04-27
- Pattern: Claude Code blocker-style settings (
disableAutoMode,disableBypassPermissionsMode) use the literal string"disable"as a sentinel. The key being absent means the feature is available; the value"disable"is what turns the blocker on. Any other value (includingfalse,true,null) has no effect — the doc explicitly states this. - Context: switching
permissions.defaultModeto"auto"whiledisableAutoMode: "disable"was still present would have failed at startup ("auto mode unavailable"). The namingdisable<Foo>: "disable"reads ambiguously — easy to assume it's a boolean toggle and leave the key in place. - Future application:
- Before changing
defaultMode, audit the matchingdisable*key in the samepermissionsblock. If present with value"disable", remove it. - Same logic for
bypassPermissionsmode anddisableBypassPermissionsMode. - Don't trust the doc's naming — read the value semantics. Sentinel strings beat booleans here because the harness can distinguish "unset" from "explicitly off" (admin policy).
- Before changing
- Reference: commit
1421578, dochttps://code.claude.com/docs/en/settings.