Debt may go down.
Never silently up.
pnpm check:ui
+# raw buttons
+# swallowed catches
+# pages without h1
+# hardcoded coloursRead the checker →.agents/skills/, distilled from mistakes, commands, and architectural decisions that kept recurring.', skillGate: 'prove green is real', skillParallel: 'worktree per task', skillRepo: 'query before crawling', skillDebt: 'separate line of work', skillWriter: 'repeat twice, encode once', skillArea: 'stack-specific traps',
+ examplesLabel: 'Concrete examples', examplesMeta: 'open the source, then adapt', ratchetLabel: 'CLI RATCHET', ratchetTitle: 'Debt may go down..agents/skills/, extraídos de erros, comandos e decisões arquiteturais recorrentes.', skillGate: 'prove que o verde é real', skillParallel: 'um worktree por tarefa', skillRepo: 'consulte antes de explorar', skillDebt: 'linha de trabalho separada', skillWriter: 'repita duas vezes, codifique uma', skillArea: 'armadilhas da stack',
+ examplesLabel: 'Exemplos concretos', examplesMeta: 'abra a fonte, depois adapte', ratchetLabel: 'CATRACA CLI', ratchetTitle: 'A dívida pode cair.${item.text[language]}
${language === 'pt' ? 'ABRIR FONTE ↗' : 'OPEN SOURCE ↗'}${item.code}`;
+ select('[data-stage]', id, 'stage');
+}
+
+function renderSkill(id) {
+ const item = skills[id];
+ document.querySelector('#skill-detail').innerHTML = `${item.lesson[language]}
${item.example}${language === 'pt' ? 'LER SKILL ↗' : 'READ SKILL ↗'}`;
+ select('[data-skill]', id, 'skill');
+}
+
+function renderLanguage(next) {
+ language = next;
+ document.documentElement.lang = language === 'pt' ? 'pt-BR' : 'en';
+ document.querySelectorAll('[data-copy]').forEach((node) => { node.innerHTML = languageCopy[language][node.dataset.copy]; });
+ document.querySelector('#explore-prompt').textContent = prompts[language];
+ document.querySelectorAll('[data-lang]').forEach((button) => { const active = button.dataset.lang === language; button.classList.toggle('active', active); button.setAttribute('aria-pressed', String(active)); });
+ renderStage(document.querySelector('[data-stage].active')?.dataset.stage || 'context');
+ renderSkill(document.querySelector('[data-skill].active')?.dataset.skill || 'gate');
+ localStorage.setItem('rules-language', language);
+}
+
+async function copyPrompt() {
+ const value = prompts[language];
+ try {
+ await navigator.clipboard.writeText(value);
+ document.querySelector('#copy-status').textContent = language === 'pt' ? 'Prompt copiado.' : 'Prompt copied.';
+ } catch {
+ document.querySelector('#copy-status').textContent = language === 'pt' ? 'Selecione o texto manualmente.' : 'Select the text manually.';
+ }
+}
+
+document.querySelectorAll('[data-stage]').forEach((button) => button.addEventListener('click', () => renderStage(button.dataset.stage)));
+document.querySelectorAll('[data-skill]').forEach((button) => button.addEventListener('click', () => renderSkill(button.dataset.skill)));
+document.querySelectorAll('[data-lang]').forEach((button) => button.addEventListener('click', () => renderLanguage(button.dataset.lang)));
+document.querySelector('[data-copy-prompt]').addEventListener('click', copyPrompt);
+window.addEventListener('scroll', () => { const height = document.documentElement.scrollHeight - innerHeight; document.querySelector('.progress span').style.width = `${height > 0 ? scrollY / height * 100 : 0}%`; }, { passive: true });
+renderLanguage(language);
diff --git a/rules/index.html b/rules/index.html
new file mode 100644
index 0000000..4249452
--- /dev/null
+++ b/rules/index.html
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+ A real repository case study
+Prompts ask for behavior. Repositories preserve it. The interview project combines written context, reusable skills, executable checks, commit hooks, and independent review so the rule is still present when the conversation is gone.
+ +From intent to evidence
Not every rule belongs in a hook. Put guidance where an agent can discover it, deterministic policy in a command, cheap checks at commit time, and independent judgment at review.
Small instruction packages
These skills are not downloaded magic. They are repository-specific procedures under .agents/skills/, distilled from mistakes, commands, and architectural decisions that kept recurring.
pnpm check:ui
+# raw buttons
+# swallowed catches
+# pages without h1
+# hardcoded coloursRead the checker →pnpm exec lint-staged
+node scripts/check-ui-contract.mjsRead the hook →pnpm exec commitlint --edit $1
+
+feat: add interview timer
+fix(api): scope session queryRead commitlint config →.pr-review.json
+├── focus
+├── exclude_paths
+├── languages
+└── instructionsRead review policy →Use this in the interview repository or adapt the path names to another project.