| description | Debounced 3-layer refresh of SUMR.md (LLM refactor snapshot) |
|---|
Wzorzec odświeżania SUMR.md (LLM-readable refactor descriptor
generowany przez sumr .) — rzadko, automatycznie, bezpiecznie.
SUMR.md jest drogi do wygenerowania (~30-90s, wywołuje code2llm,
redup, doql sync) i driftuje powoli, więc nie chcemy regenerować go
po każdym commicie. Zamiast tego trzy warstwy, wszystkie używające tej
samej debounced logiki:
┌─────────────────┬────────────────────────────┬────────────────────┐
│ Warstwa │ Trigger │ Częstotliwość │
├─────────────────┼────────────────────────────┼────────────────────┤
│ 1. Manual │ `task quality:sumr:refresh`│ ad-hoc (force) │
│ 2. Lokalny hook │ git post-merge on main │ po `git pull` │
│ 3. Global CI │ GitHub Actions weekly cron │ Monday 04:00 UTC │
└─────────────────┴────────────────────────────┴────────────────────┘
↓ ↓ ↓
└──── wspólny: scripts/sumr-refresh.sh ─────────┘
(debounce + refresh)
Debounce triggery (każdy jako OR):
SUMR.mdnie istnieje- ≥
SUMR_MAX_COMMITS=25commitów na HEAD od czasu ostatniego dotknięciaSUMR.md - ≥
SUMR_MAX_DAYS=7dni odmtime SUMR.md --force/SUMR_FORCE=1
Wykonaj od góry do dołu. Każdy krok jest idempotentny (można uruchomić wielokrotnie bez efektów ubocznych).
Dla repo zewnętrznego (np. ~/github/myproject):
# Ustaw ścieżkę do koru (gdzie są templates/) i przejdź do swojego repo
KORU=/home/you/github/semcod/koru
cd ~/github/myproject
# Krok 1 — sumd binary
bash "$KORU/docs/llm-tools/sumd/install.sh"
# Kroki 3+5+6+7 — skopiuj wszystkie templates w jednym ruchu
mkdir -p scripts/git-hooks .github/workflows
cp "$KORU/templates/sumr-refresh.sh.template" scripts/sumr-refresh.sh
cp "$KORU/templates/git-hooks/post-merge.template" scripts/git-hooks/post-merge
cp "$KORU/templates/git-hooks/post-commit.template" scripts/git-hooks/post-commit
cp "$KORU/templates/git-hooks/install.sh.template" scripts/git-hooks/install.sh
cp "$KORU/templates/sumr-weekly.yml.template" .github/workflows/sumr-weekly.yml
chmod +x scripts/sumr-refresh.sh scripts/git-hooks/*
grep -qxF '.sumr/' .gitignore 2>/dev/null || echo '.sumr/' >> .gitignore
# Krok 4 — wklej quality:sumr:* tasks do Taskfile.yml (zobacz sekcję Krok 4)
# Krok 2 — pierwszy SUMR.md + Krok 5 — hook
scripts/sumr-refresh.sh --force
bash scripts/git-hooks/install.sh post-merge
# Zatwierdzenie
git add SUMR.md scripts .github .gitignore Taskfile.yml
git commit -m "feat(sumr): bootstrap 3-layer SUMR.md refresh"Dla wdrożenia w samym koru (dogfood): użyj task template:install:sumr,
który wykonuje kroki 3+5+6+7 jednym taskiem (templates są już w miejscu).
Każdy krok poniżej objaśnia dlaczego i co weryfikować dla manual użytkowników.
bash docs/llm-tools/sumd/install.sh
# albo ręcznie:
pip install --user --upgrade sumdWeryfikacja:
sumd --version
sumr --help | head -5sumr .
git add SUMR.md
git commit -m "chore(sumr): initial SUMR.md snapshot"To daje debounce'owi baseline do porównania.
Uwaga — side-effects sumr: oprócz SUMR.md, narzędzie może
wygenerować w repo:
app.doql.less— DOQL boilerplate (plusapp.doql.cssdla frontendów)project/— raportycode2llm(TOON-format)testql-scenarios/— wygenerowane scenariuszetestql
sumr-weekly.yml commituje tylko SUMR.md + app.doql.*. Pozostałe
pliki sam zdecyduj czy commitować. Jeśli project/ i testql-scenarios/
chcesz ignorować lokalnie:
grep -qxF 'project/' .gitignore 2>/dev/null || echo 'project/' >> .gitignore
grep -qxF 'testql-scenarios/' .gitignore 2>/dev/null || echo 'testql-scenarios/' >> .gitignoremkdir -p scripts
cp templates/sumr-refresh.sh.template scripts/sumr-refresh.sh
chmod +x scripts/sumr-refresh.shSmoke test:
scripts/sumr-refresh.sh --status
# Oczekiwane: [sumr-refresh] SUMR.md state: fresh:commits=0/25,days=0/7
# Exit code: 0Dodaj do swojego Taskfile.yml:
quality:sumr:status:
desc: "Show SUMR.md staleness vs HEAD (LLM-free; exit 1 if stale)"
cmds:
- scripts/sumr-refresh.sh --status
quality:sumr:auto:
desc: "Refresh SUMR.md only if stale (debounced; safe for hooks/cron)"
cmds:
- scripts/sumr-refresh.sh
quality:sumr:refresh:
desc: "Force-refresh SUMR.md (bumps sumd/code2llm/redup/doql + regenerates)"
cmds:
- scripts/sumr-refresh.sh --force
quality:sumr:install-hook:
desc: "Install git post-merge hook (HOOK=post-commit|both for alt)"
cmds:
- bash scripts/git-hooks/install.sh {{.HOOK | default "post-merge"}}
quality:sumr:uninstall-hook:
desc: "Remove c2004 sumr-refresh git hooks (leaves foreign hooks intact)"
cmds:
- bash scripts/git-hooks/install.sh --uninstallmkdir -p scripts/git-hooks
cp templates/git-hooks/post-merge.template scripts/git-hooks/post-merge
cp templates/git-hooks/post-commit.template scripts/git-hooks/post-commit
cp templates/git-hooks/install.sh.template scripts/git-hooks/install.sh
chmod +x scripts/git-hooks/*
task quality:sumr:install-hook # default: post-merge
# lub:
task quality:sumr:install-hook HOOK=bothWeryfikacja:
ls -la .git/hooks/post-merge
# Oczekiwane: executable, zawiera "c2004 sumr-refresh" markermkdir -p .github/workflows
cp templates/sumr-weekly.yml.template .github/workflows/sumr-weekly.ymlNastępnie:
-
Edit
.github/workflows/sumr-weekly.yml:- Opcjonalnie dostosuj cron (
0 4 * * 1→ inny dzień/godzina) - Opcjonalnie dostosuj
add-paths(jeślisumrgeneruje u Ciebie teżapp.doql.csslub inne pliki)
- Opcjonalnie dostosuj cron (
-
(Opcjonalnie) Dodaj
SUMR_PATsecret do repo:- GH → Settings → Secrets and variables → Actions → New secret
- Bez PAT: workflow działa z domyślnym
GITHUB_TOKEN(PRs nie trigger-ują downstream workflows, co jest OK bo nic nie keyuje się na SUMR.md).
-
Commit i push:
git add .github/workflows/sumr-weekly.yml git commit -m "ci(sumr): add weekly SUMR.md refresh workflow" git push
Idempotentnie (grep zapobiega duplikatom):
grep -qxF '.sumr/' .gitignore 2>/dev/null || echo '.sumr/' >> .gitignore
git add .gitignore
git commit -m "chore(gitignore): ignore .sumr/ state dir".sumr/ zawiera lokalny state debounce'a (state.json,
post-merge.log, post-merge.lock) — nie commit-ować.
Jeśli używasz task template:install:sumr — ten krok wykonuje się
automatycznie (.gitignore jest aktualizowany przez zadanie).
Jeśli masz install:tools task w Taskfile:
install:tools:
desc: Install all underlying LLM tools
cmds:
- pip install planfile regix redup vallm prefact pfix sumd # ← dodaj sumd# sumd binary dostępny
sumd --version || echo "FAIL: sumd missing (Krok 1)"
sumr --help >/dev/null && echo "OK: sumr help works"
# SUMR.md jest w repo
test -s SUMR.md && echo "OK: SUMR.md $(wc -c < SUMR.md) bytes"
# Warstwa 1 — debounced wrapper
task quality:sumr:status
# Oczekiwane: fresh:commits=0/25,days=0/7 → exit 0
# Warstwa 2 — hook aktywny (jeśli zainstalowany)
test -x .git/hooks/post-merge && \
grep -q 'c2004 sumr-refresh' .git/hooks/post-merge && \
echo "OK: post-merge hook installed and ours"
# Warstwa 3 — workflow YAML valid (jeśli zainstalowany)
test -f .github/workflows/sumr-weekly.yml && \
python3 -c "import yaml; yaml.safe_load(open('.github/workflows/sumr-weekly.yml'))" && \
echo "OK: weekly workflow YAML valid"
# .gitignore has .sumr/
grep -qxF '.sumr/' .gitignore && echo "OK: .sumr/ is gitignored"| Problem | Rozwiązanie |
|---|---|
sumr: command not found po install.sh |
Sprawdź $PATH — pip install --user daje ~/.local/bin. Dodaj do PATH lub użyj SUMD_PIP_SCOPE=venv w install.sh |
scripts/sumr-refresh.sh --status daje błąd git: not a repo |
Skrypt MUSI być w repo — sprawdź git rev-parse --show-toplevel |
| Hook odpala się na feature branch mimo filtra | Sprawdź git rev-parse --abbrev-ref HEAD — filtr pattern matching main|master, jeśli masz inny default branch → edytuj hook |
| Weekly CI workflow timeouts | Default timeout-minutes: 15 — zwiększ jeśli sumr . u Ciebie trwa dłużej (duży monorepo) |
| Concurrent pulls race-ują hooks | by design: flock zapewnia queueing. Sprawdź .sumr/post-merge.lock |
# Wyłącz local hook:
task quality:sumr:uninstall-hook
# Wyłącz weekly CI:
rm .github/workflows/sumr-weekly.yml
git commit -am "chore: disable sumr weekly refresh"
# Zostaw manual-only:
# (nic nie trzeba robić — `task quality:sumr:refresh` zawsze dostępny)- Manual (1) — dla ad-hoc regeneracji po dużym refaktorze przed PR.
- Lokalny hook (2) — refresh u tych, którzy pull-ują main często; daje team'owi kontrybutorskiemu świeży snapshot bez czekania na CI.
- Global CI (3) — safety net: jeśli nikt lokalnie nie trigger-uje, weekly cron dogaduje PR z bezpiecznym review window.
Debounce w scripts/sumr-refresh.sh łączy te warstwy: jeśli lokalny
hook niedawno regenerował i commitował, CI widzi fresh state i
grace-skipuje. Brak deduplikacji pracy.
Wszystkie templates w tym folderze są kopiami z
maskservice/c2004, gdzie
pattern działa produkcyjnie od 2026-05-10. Metryki:
- 702kB SUMR.md, ~30s regeneracja bez
--analyze - Hook cost przy fresh state: ~28ms (git rev-parse + fs stat)
- Hook cost przy stale: ~10ms (spawn bg setsid + return)
- Weekly CI: ~2 min total (setup-python cache + sumr + diff + PR)