Trim rule and result char budgets after compaction via new
postCompactMaxRuleChars/postCompactMaxResultChars config, applied
through withPostCompactBudget. Extract codex-hook helpers into
dynamic-target-fingerprints, hook-output, path-utils,
rules-engine-factory, and transcript-rule-filter modules.
The 12000-char per-rule cap exists to guard against absurd user-authored
AGENTS.md files. For PLUGIN_BUNDLED rules the plugin author already
controls the body size, and silent mid-section truncation breaks the
contract that bundled discipline lands in full.
The current bundled Hephaestus baseline is 16k chars: everything from
`# AGENTS.md` onward (Output, Success Criteria, Stop Rules, Task
Tracking) was being dropped from every Codex session without warning.
Skip truncateRule when the source is plugin-bundled; the maxResultChars
budget (40000 default) via truncateBudget still caps total injection.
Locks the behavior with two regression tests in bundled-rules.test.ts:
bundled body > maxRuleChars lands intact, project body > maxRuleChars
still truncates with the standard notice.