Commit Graph
785 Commits
Author SHA1 Message Date
Bastien Chanot 543b0c811a feat(tour): multi-project parallel fan-out — one runner per repo
Two or more project paths dispatch one general-purpose runner per repo,
all in a single message, instead of processing repos one by one. The
runner inherits the session model — no pin, it carries tour's reflection
(fix decisions, convergence) — and every agent inside keeps its defined
tier (security-auditor sonnet, Phase B opus, doc-syncer sonnet). A dead
or mute runner becomes an explicit RUNNER FAILED summary row; the gated
capitalize offer stays in the main loop, never in a runner.

Bounded LRN-083 derogation recorded in BDR-084: the per-project fix loop
moves into its runner, but nothing a runner decides touches shared state
— independent repos, per-repo chore branches, branches left unmerged for
human review exactly as inline. Mechanics proven before building: nested
probe, 3 sub-agent windows all overlapping, 9.1s vs ~18s sequential.

Census §12: 6 locks, flip-tested. Single-project path unchanged.
2026-08-24 14:18:59 +02:00
Bastien Chanot 4ededc75ab chore(memory): TODO — plan tour-parallel (T1-T4) 2026-08-24 14:17:25 +02:00
Bastien Chanot ecbdbc7230 Merge feature/contract-gates into develop 2026-08-24 13:44:06 +02:00
Bastien Chanot 763d0022bf chore(memory): TODO — W9 human merge signal + Palier 3 trigger (won't-build-now) 2026-08-24 13:44:01 +02:00
Bastien Chanot 33f5356c82 feat(gates): wire GATE 0 into the four orchestrator skill restatements
The include is authoritative, but feat/bugfix/ship-feature/init-project
each restate the verify loop inline — an orchestrator following the
restatement alone would have skipped the floor. Each now carries the
GATE 0 bullet ahead of GATE 1 (4 new structure locks, flip-tested).
The contract-interview weight table stops promising a hotfix oracle
nothing executes: hotfix runs no floor, the hotfixer runs the suite
itself. CHANGELOG extended with the wiring + the RED result.
2026-08-24 13:36:32 +02:00
Bastien Chanot abb4ea7650 chore(memory): EVAL-027 — contract-gates behavioral RED 16/16 conformant 2026-08-24 13:26:39 +02:00
Bastien Chanot bfac4d4522 chore(memory): BDR-083 + LRN-141/142 + journal + CHANGELOG + TODO W0-W8
BDR-083 records what was taken from unlazy and, more usefully, what was
refused and why. LRN-141: an external skill's machinery encodes its threat
model, not yours — take the invariants, refuse the machinery. LRN-142:
structure locks are fixed-string, so reflowing a doctrine paragraph reds
them; fix the doc, not the lock.
2026-08-24 13:12:38 +02:00
Bastien Chanot 63310467ca feat(gates): deterministic floor (GATE 0) under the fresh verifier
GATE 1 is an LLM dispatch and the verifier's mandatory PROOF: line is a line
the verifier writes — nothing structurally stops it being produced without
anything being executed. Nothing deterministic sat between the executor and
that dispatch.

An acceptance criterion can now carry an oracle: indented CHECK: (command),
EXPECT: (success-only marker), EVIDENCE: (slot). lib/gates.sh runs them
fail-closed — MET requires exit 0 AND the marker, so a nonzero process never
passes on its error text carrying the token — and writes the outcome back
into the contract, so the fresh verifier reads evidence as fact rather than
trusting the executor's report.

GATE 0 runs that floor before any verifier is dispatched; a red build sends
the executor back for free, on its own iteration budget. ABANDON: <id>
<reason> turns an impossible criterion into a visible handoff that blocks
CONFORME and routes to the human gate, via the new ABANDONED(n) verdict —
a distinct token because it routes distinctly, never a dev loop. feater and
bugfixer gain a four-pass completion discipline, scoped so a pass can never
widen the contract.

The runner's parse fails closed on partial oracles, duplicate ids,
unindented attributes and runnable criteria with no EVIDENCE: line, and
executes nothing at all when the ledger is malformed. status never executes
and never writes; run always re-executes, since trusting written evidence is
the failure being closed.

Adapted from the unlazy skill (Leonxlnx/unlazy, MIT). Its Stop hook,
approval store, .unlazy/ tree, depth-tree arithmetic and Node checker were
deliberately refused — BDR-083 records each reason.

64 assertions in lib/tests/gates.test.sh, non-execution proved by sentinel
with its own positive control asserted first.
2026-08-24 13:12:38 +02:00
Bastien Chanot 5488c4870f Merge feature/seo-geo-deprescription into develop 2026-08-24 12:19:10 +02:00
Bastien Chanot ae1339d656 chore(config): untrack emil-design-eng skill (machine-owned curl copy)
skills-external/emil-design-eng/SKILL.md is curl'd from emilkowalski/skill
by install-plugins.sh when absent and re-fetched unconditionally by every
update-all.sh run, so tracking it produced a repo diff on each upstream edit
(latest: Radix vars dropped for Base UI). Same category as frontend-design/
and impeccable/, already ignored on that rationale — a fresh clone re-fetches
it, so no offline copy is needed and nothing was pinned here anyway.

design-motion-principles/ has the same overwrite-on-update behaviour but NOT
the same bootstrap: install-plugins.sh only warns instead of cloning it, so it
stays tracked until that gap is closed.
2026-08-24 12:17:17 +02:00
Bastien Chanot 325962e080 chore(memory): BDR-082 + LRN-140 + journal + CHANGELOG + TODO C1 done (seo/geo de-prescription) 2026-08-02 17:28:07 +02:00
Bastien Chanot c7646a9c8a feat(agents): de-prescribe geo-analyzer for Opus 5 (C1 P3)
Same invariant as adafa35. Census 71/0 green; contract surface
byte-identical; 1106→1107 lines (single-shot scoping line).

- MANDATORY/MUST caps on AI-index submission → plain content rule
- 'Print the plan before STEP 13' → single-shot-scoped (conf#1);
  tier-mapping kept in BOTH judge and template ranges (rob#1/#9,
  PERMISSIVE :873 named survivor kept)
- vestigial ':1106 Transparency §14' reworded to truth: change log is
  dispatcher's SEO.md §15 (folded into 'Dispatcher verifies')
- 'copy these patterns' → reporting-shape-to-match; FAQ '20-50'
  quantity → 'typically dozens'; 'EVERY finding' → outcome bar
- dedup after inspection: ZERO merges (PERMISSIVE ×3 cross-range;
  never-apply ×4 distinct obligations; content_quality pair =
  spec rule vs emitted-artifact caveat — annex counts corrected)
- FROZEN untouched: guard-first :273, NAP direction rule, cite-sources,
  WebSearch-freshness (already when-shaped, rob#6), all STEP headers
- deltas: MANDATORY 1→0, MUST 4→3, NEVER 9→8
2026-08-02 01:30:12 +02:00
Bastien Chanot adafa350da feat(agents): de-prescribe seo-analyzer for Opus 5 (C1 P2)
Choreography → when-guidance under the audience×mode-range invariant
(plan §4b Q3). Census 71/0 + model-routing 133/0 + seo-data 221/0 green
throughout; contract surface (§2a/2b) byte-identical; 1528→1503 lines.

- self-output verification: ':970 run it twice' → deterministic-engine
  integrity guard (conf#8); ':1217 do not proceed' → single-shot-scoped
  (conf#1); grouping sanity-check → when-guidance detector (rob#8)
- vestigial pre-BDR-061 'Transparency' line deleted; §15 ownership
  folded into 'Dispatcher verifies'
- dedup (inspection-corrected: most annex 'twins' are distinct
  obligations — kept): only true same-range dups removed ('Handoff to
  dispatcher' ≈ sentinel note; 'Landing page rule' block ≈ payload
  instance + RULES line)
- completeness checklist reshaped to routing map, rows verbatim (rob#3)
- caps softened: 'P0 rule' MUST/ALWAYS → plain content rules (CMS
  plugin-first folded with STEP 2 twin, corr#3); First-action/ordering
  emphasis dropped; C1a + sampling essays compressed (rules + LRN
  citations kept); WebSearch → drifting-externals when-guidance (rob#6)
- FROZEN untouched: guard-first orderings :287, denominator-before-
  sampling :550, R2 refuse, COVERAGE obligations, all STEP headers
- deltas: 'P0 rule' 2→0, ALWAYS 1→0, MUST 5→4; NEVER 9→9 (class-B
  named bans, kept by design LRN-105)
2026-08-02 01:30:02 +02:00
Bastien Chanot 9681b468e1 test(census): seo/geo agent⇄dispatcher contract locks (C1 P1, pre-reword)
71 locks, flip-proven (7 scratch mutations → 7 FAILs): judge verdict
grammar, FIX BUNDLE + READY-TO-APPLY sentinel, signals handoff, ALL
STEP headers (interiors included, conf#5), collect report, bundle item
fields parsed by L1 appliers, score labels (BDR-010/LRN-011), scoring
blocks, trajectory, envelope keys. Locks existing state — reword
commits must keep this green.

+ plan v3 (challenged 3 lenses FATAL/FATAL/CONCERNS + 1 confirmation
pass FATAL(9), every BLOCKER closed by a named change, §5bis record)
+ directive-language inventory annex (analyzer report).
2026-08-02 01:10:47 +02:00
Bastien Chanot 7047adfe77 chore(memory): reconcile TODO — opus5 branch merged (709cf9b), add Claude 5 follow-on chantiers C1-C4 2026-07-30 13:41:37 +02:00
Bastien Chanot 709cf9bf0b Merge feature/opus5-config-tuning into develop 2026-07-30 13:28:36 +02:00
Bastien Chanot 550b39043e chore(memory): BDR-081 + LRN-139 + journal + CHANGELOG + plan (opus5 tuning)
Capitalizes the Claude-5-family config recalibration: decision record,
trait-inversion learning (LRN-030 superseded premise, #80988 injections,
no-effort-hold trap), journal line, CHANGELOG Unreleased entries, and the
challenged plan (3 blind Opus 5 lenses, synthesis in §5bis).
2026-07-30 13:02:55 +02:00
Bastien Chanot c3d3f4d465 feat(agents): plan-challenger — route grounded doubts to [MINOR]
Opus 5 follows conservative-reporting clauses literally; 'a manufactured
concern is a failure' risked suppressing real low-confidence findings.
In-place reword: ungrounded stays noise, grounded-but-uncertain files as
[MINOR] with the uncertainty in WHY:. OUTPUT grammar byte-identical;
census row added.
2026-07-30 12:58:29 +02:00
Bastien Chanot 0f7b565bb0 feat(global): recalibrate instruction layer for Claude 5 family
- Delegation block: model-neutral when-guidance replaces the Opus 4.8
  under-delegation counter (LRN-030 trait inverted on Opus 5; Claude
  Code injects its own anti-delegation prompt there, #80988). Gates
  carve-out keeps verifier/security/challenge dispatch mandatory.
- Drop the 'staff engineer' self-check bar (Opus 5 over-verification
  trigger per official migration guide); honest-reporting steps stay.
- Deviations bullet: finish-whole-task clause (Opus 5 scope-expansion
  counter), scoped so 'gone wrong → STOP' still wins.
- Written-deliverable length rule (Opus 5 writes ~30-40% longer).
2026-07-30 12:58:06 +02:00
Bastien Chanot eab2a10cd5 fix(hooks): drop \bux\b from design-toolchain pattern (FR prose FPs)
3rd tightening pass (series LRN-1005/1007): bare "ux" matched inside
French prose (2 logged FPs, both FR — latest "changement ux vu").
\bui\b kept: zero logged FP, one logged true positive, now locked by a
must-fire test row. Flip-tested: quiet row fired pre-change.
2026-07-30 12:57:38 +02:00
Bastien Chanot f05ca86ef2 Merge release/1.4.0 into develop 2026-07-22 15:48:42 +02:00
Bastien Chanot 817a866b7c chore(release): 1.4.0 — version.txt + CHANGELOG 2026-07-22 15:26:34 +02:00
Bastien Chanot 2940134c86 Merge feature/gitflow-auto-purge-transient into develop 2026-07-22 15:12:50 +02:00
Bastien Chanot 78a25aeb5e chore(memory): BDR-065 amendment (auto-purge coded) + LRN-138 + journal
BDR-065 delete-side now automated (lib/gitflow.sh _gitflow_purge_transient).
LRN-138: gitignore != delete for run-time artifacts read from disk — use
commit-during-run + auto-delete at the integration boundary. TODO checked,
journal line.
2026-07-22 15:12:28 +02:00
Bastien Chanot 9b89da29be feat(gitflow): auto-purge transient superpowers artifacts at finish (BDR-065)
_gitflow_purge_transient removes docs/superpowers/{specs,plans} on the
feature/bugfix branch just before the directed merge, so develop's tip
lands clean while the feature commits stay reachable as the archive
(git show <sha>:...). Best-effort: never aborts a finish (no-op when
absent, skip on dirty paths, restore index+tree on commit failure).
Opt-out GITFLOW_PURGE_TRANSIENT=0; purge-transient CLI verb. Automates
the manual post-merge cleanup BDR-065 left as doctrine (slipped once,
655e364). Universal via the ~/.claude/lib symlink. gitflow-test T17 a-d;
shellcheck clean; make test exit 0.
2026-07-22 15:12:22 +02:00
Bastien Chanot 95ddd28992 Merge chore/skill-routing-bugfix into develop 2026-07-21 16:16:24 +02:00
Bastien Chanot 1ef6e6e694 chore(memory): BDR-080 bug routing inversion + journal line 2026-07-21 01:15:06 +02:00
Bastien Chanot 6c489ebcfb chore(routing): invert bug routing — bugfix primary, investigate explicit-only
investigate (gstack ON default) bypassed the whole quality pipeline:
gitflow aiguillage, contract, fresh verifier + security gates, doc-sync,
memory registries. bugfix now primary; investigate reserved for explicit
gstack-ecosystem asks (cross-project learnings, /freeze scope lock,
no-commit investigation). BDR-080.
2026-07-21 01:15:01 +02:00
Bastien Chanot 33f9529b9e chore(memory): BLK-018 classifier-blocked finish span + v1.3.1 journal line 2026-07-21 00:27:39 +02:00
Bastien Chanot f82ea1e4f8 Merge release/1.3.1 into develop 2026-07-20 22:23:47 +02:00
Bastien Chanot 75c81f3f9c chore(release): 1.3.1 — version.txt + CHANGELOG 2026-07-20 22:20:29 +02:00
Bastien Chanot 533fcc841e chore(memory): journal — README rebuild session 2026-07-20 22:17:48 +02:00
Bastien Chanot db6f476685 Merge chore/readme-v2 into develop 2026-07-20 22:09:02 +02:00
Bastien Chanot 90850096ef docs: README rebuilt — short pitch (what/how/why) on top, old content demoted to reference manual 2026-07-20 22:08:58 +02:00
Bastien Chanot 0a8ecf6c34 Merge release/1.3.0 into develop 2026-07-20 19:40:23 +02:00
Bastien Chanot 711eacd900 chore(release): 1.3.0 — version.txt + CHANGELOG 2026-07-20 19:39:35 +02:00
Bastien Chanot ce5b7fb3f4 Merge chore/readme-seo-env into develop 2026-07-20 19:25:07 +02:00
Bastien Chanot 10589d484b docs: README polish — real clone URL + make targets, magic example simplified, SEO env vars section
- Fresh-install block: clone URL → github.com/bchanot/claude, bash
  install.sh/doctor.sh → make install / make doctor (user pass)
- magic MCP example: placeholder key line instead of WRONG/RIGHT contrast
- new subsection: SEO data layer needs GOOGLE_OAUTH_CLIENT_ID/SECRET +
  CRUX_API_KEY in ~/.claude/.env (GCP steps, make seo-connect, graceful
  degradation) — mirrors .env.example
2026-07-20 19:25:07 +02:00
Bastien Chanot dc90aae9bd Merge chore/purge-transient-docs into develop
# Conflicts:
#	.claude/tasks/TODO.md
2026-07-20 17:07:11 +02:00
Bastien Chanot 37c79f0524 Merge feature/profile-managed-externals into develop 2026-07-20 17:04:53 +02:00
Bastien Chanot e75ea79ae6 chore(tasks): reconcile 2026-07-20 — 4 stale claims corrected + pending-gates section
- seo/geo STATUS: H1+C1 were done (url-guard, sitemap verb) and the branch
  merged (92301fe) + shipped v1.2.0 — 'NEXT'/'nothing merged' lines stale
- ctx7 + opus-pin sections: 'NO merge' notes stale (8ee7d19, 17fbe51 both
  shipped v1.2.0)
- f1c9c474 transcript decision moot: auto-rotated (cleanupPeriodDays=7)
- new open items: 2 unmerged branches + Makefile help-text fix
2026-07-20 16:46:42 +02:00
Bastien Chanot 655e364e80 chore(docs): purge transient plan/spec artifacts missed by post-merge cleanup
- docs/plans + docs/specs (deploy-skill 2026-06-27): predate the BDR-065
  lifecycle codification, never swept
- docs/superpowers/{plans,specs} (model-routing 2026-07-15): 6-wave
  chantier — final W6 merge closed it without the purge step
Git history at the feature commits is the archive (BDR-065).
2026-07-20 16:40:58 +02:00
Bastien Chanot ecbe8abde7 docs: profile list ×3 + test glob + BDR-ID strip + layout tree → ARCHITECTURE.md — /doc clean pass 2026-07-20 16:29:31 +02:00
Bastien Chanot 8008d8233c feat(profile): set symmetric on managed externals + MCPs (BDR-079)
- MANAGED_EXTERNALS (emil-design-eng, frontend-design,
  design-motion-principles, impeccable) + MANAGED_MCPS (magic):
  cmd_set now trims both when the profile does not list them —
  design leftovers no longer survive a 'set backend'
- cmd_set refactored to 4 symmetric trim helpers; nothing outside
  the MANAGED_* allowlists is ever auto-toggled (darwin-skill manual)
- enable_skill external: from-source fallback (ln -sf
  skills-external/<name>), mirrors toggle-external.sh
- stale usage() NOTE + SKILL.md updated to the both-ways reality
- hermetic test: 16 checks, fixture repo + fake claude shim (gstack
  on-demand, from-source, park/restore, magic add/remove, non-managed
  untouched); shellcheck + full make test green
2026-07-20 14:47:53 +02:00
Bastien Chanot 3166c1161e Merge release/1.2.1 into develop 2026-07-20 14:34:09 +02:00
Bastien Chanot e5a62cc049 chore(release): 1.2.1 — version.txt + CHANGELOG 2026-07-20 14:32:50 +02:00
Bastien Chanot b3a03fd974 chore(memory): journal — v1.2.0 cut + doc pass 2026-07-20 14:24:39 +02:00
Bastien Chanot aeb7bc05d8 Merge chore/doc-sync-v1.2.0 into develop 2026-07-20 14:24:11 +02:00
Bastien Chanot 45e679ac23 docs: README model-routing v2 table (BDR-076/077) + ctx7 surfaces (BDR-078) + STEP 2b — post-release 1.2.0 doc pass 2026-07-20 14:21:24 +02:00
Bastien Chanot 2d38ffd843 Merge release/1.2.0 into develop 2026-07-20 14:07:28 +02:00