From a131f45f00db0e15a69546a2b8f2ec64b44dbbd4 Mon Sep 17 00:00:00 2001 From: Bastien Chanot Date: Mon, 29 Jun 2026 18:27:34 +0200 Subject: [PATCH 1/2] fix(init-project): remove speculative GSD auto-bootstrap (BLK-011) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit STEP 12 ran `gsd init` AFTER FINISH, creating ROADMAP.md + .gsd/ in the working tree once the merge had already integrated committed history only — so the artifacts stranded outside the merge/PR (BLK-011, 3rd post-FINISH artifact after memory + docs). Resolved by REMOVAL, not by plumbing a commit: STEP 12 speculatively bootstrapped a heavy multi-session engine (state machine / crash recovery / cost tracking / parallel workers) that is opt-in and rarely used. Deleting the producer means the orphan is never created — a negative diff beats building a gsd-commit helper for an artifact nobody commits to using. Deliberate GSD use is untouched: initializable on-demand (`/onboard add gsd`, or `gsd init` in a terminal), still recommended by plugin-advisor, still read by /status. init-project is now an 11-step pipeline. Coherence sweep (the "test" for a removal): zero dangling STEP-12 refs — header 12->11-step, the STEP 10c note, and 4 USAGE.md worked-example references all updated to on-demand init. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj --- CHANGELOG.md | 1 + USAGE.md | 20 ++++++++++---------- skills/init-project/SKILL.md | 19 +++---------------- 3 files changed, 14 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36067f5..7268b4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). - Default model / effort settings updated ### Removed +- `/init-project`: STEP 12 (speculative GSD v2 auto-bootstrap at project creation) removed — it ran `gsd init` AFTER FINISH, creating `ROADMAP.md` + `.gsd/` stranded outside the merge/PR (BLK-011), to bootstrap a multi-session engine that is opt-in and rarely used. Resolved by removal, not by plumbing a commit: GSD stays initializable on-demand (`/onboard add gsd`, or `gsd init` in a terminal), `/status` still reads `.gsd/`, and plugin-advisor still recommends it for multi-session work. init-project is now an 11-step pipeline - `disable-model-invocation` frontmatter removed repo-wide (aligns skills with CLAUDE.md routing) - Caveman plugin always-on integration purged — plugin disabled + uninstalled; SessionStart/UserPromptSubmit hooks, standalone hook files, `install-plugins.sh` STEP 5.5, `update-all.sh` refresh step, `plugins.lock.json` entry, `doctor.sh` checks, and docs removed. On a subscription plan its ~75% output-token compression has no cost benefit, and the always-on hooks added friction on validation gates + client deliverables. The unrelated memory-registry terse-format convention is kept. diff --git a/USAGE.md b/USAGE.md index a01b74d..fa1a20f 100644 --- a/USAGE.md +++ b/USAGE.md @@ -195,7 +195,6 @@ Hotfix/quick fix → tout OFF sauf superpowers # → STEP 8-10 : implémentation TDD + review # → STEP 10b-c: capitalize mémoire + sync README (avant finish) # → STEP 11 : finish (merge / commit initial) -# → STEP 12 : propose GSD v2 si multi-session détecté # 3. Features suivantes /ship-feature "description de la feature" @@ -204,16 +203,16 @@ Hotfix/quick fix → tout OFF sauf superpowers ### Pattern B — Projet long (multi-session, plusieurs jours) · ~1500-2500t/session CC ``` -# Même départ que Pattern A, mais au STEP 12 : -# → Répondre "yes" à "Initialize GSD v2?" -# → ROADMAP.md est créé avec les milestones +# Même départ que Pattern A. GSD v2 n'est PAS bootstrappé à la création +# (init-project ne propose plus gsd) — on l'initialise À LA DEMANDE, dans un +# terminal, quand on décide de passer en multi-session. # À chaque reprise de session (dans Claude Code) : /status # snapshot : plugins + git + milestone GSD en cours -# Ensuite dans un terminal (depuis le dossier projet) : +# Dans un terminal (depuis le dossier projet) : gsd # démarrer une session -/gsd init # si pas encore fait +/gsd init # initialise .gsd/ + ROADMAP (une fois, à la demande) /gsd auto # mode autonome, walk away # Pour suivre : @@ -400,9 +399,9 @@ Verify : npx expo export --platform web --output-dir /tmp/expo-check --clear **Si le projet devient long (plusieurs features sur semaines) :** ``` -# STEP 12 propose GSD v2 : répondre "yes" -# Puis dans terminal : +# Pour passer en multi-session, initialise GSD à la demande dans un terminal : gsd +/gsd init /gsd auto # → GSD gère deck-building, sharing backend, etc. milestone par milestone ``` @@ -501,8 +500,8 @@ Convention: snake_case Python, camelCase TypeScript." **Workflow long avec GSD v2 :** ``` -# Après /init-project (STEP 12 → "yes") -# Le ROADMAP.md généré contient : +# Après /init-project, on initialise GSD à la demande (plus auto-bootstrappé). +# Le ROADMAP.md généré par `gsd init` contiendra : # Milestone 1: Boutique in-app + Stripe # Milestone 2: PvP + matchmaking # Milestone 3: Leaderboard + saisons @@ -510,6 +509,7 @@ Convention: snake_case Python, camelCase TypeScript." # Dans un terminal : cd cardforge/ gsd # démarre session GSD +/gsd init # crée .gsd/ + ROADMAP (à la demande — plus auto à l'init) /gsd auto # GSD travaille sur Milestone 1 de façon autonome # → research Stripe API + docs # → plan décomposé en tâches diff --git a/skills/init-project/SKILL.md b/skills/init-project/SKILL.md index f626457..5611a91 100644 --- a/skills/init-project/SKILL.md +++ b/skills/init-project/SKILL.md @@ -15,10 +15,10 @@ $ARGUMENTS ## PROGRESS PROTOCOL Every STEP must announce itself with a header BEFORE its work block, so the -user always sees where they are in the 12-step pipeline: +user always sees where they are in the 11-step pipeline: ``` -━━━ STEP /12 — ━━━ (~<estimated minutes>) +━━━ STEP <N>/11 — <TITLE> ━━━ (~<estimated minutes>) why: <one sentence — what's at risk if this step is skipped> ``` @@ -248,8 +248,7 @@ patched. Report per its rc table — rc 4 = a LOUD upstream BDR-022 anomaly, not > **Scaffold commit owner = STEP 5f `gitflow init`** (root commit embeds scaffold + README + > `.gitignore` socle + hook, tree clean — BLK-010 closed). This doc-sync commit lands the -> patched docs on the MVP feature branch so they reach the merge. GSD STEP 12 still creates -> ROADMAP.md post-FINISH (BLK-011) — separate. +> patched docs on the MVP feature branch so they reach the merge. ## STEP 11 — FINISH Tests pass, build clean, no placeholders. Integrate the MVP feature into develop @@ -258,18 +257,6 @@ Tests pass, build clean, no placeholders. Integrate the MVP feature into develop bash "$HOME/.claude/lib/gitflow.sh" finish # feature/mvp → develop ``` -## STEP 12 — GSD v2 INIT (optional) -If `multi-session` signal was detected in STEP 0 OR the project has >3 planned milestones: -Ask: "Initialize GSD v2 for multi-session management? (yes / skip)" -- `yes` → - 1. First check: `command -v gsd` — if not found: - Print: "⚠️ GSD v2 not installed. Run `npm install -g gsd-pi` then re-run `/onboard add gsd` or `/ship-feature` to initialize later." - Do NOT attempt `gsd init`. Skip to RULES. - 2. If `gsd` is in PATH: run `gsd init` in the project directory to create `.gsd/` and `ROADMAP.md`. - Populate ROADMAP.md with milestones from BRIEF (v1 features + any beyond-v1 items). - Print: "✅ GSD v2 initialized — run `gsd` in terminal then `/gsd auto` to work autonomously." -- `skip` → print: "GSD v2 skipped — use `/ship-feature` for individual features." - --- ## RULES From 52d4a66daa7e68c967bdb3a9ff5e29d56c44b3b9 Mon Sep 17 00:00:00 2001 From: Bastien Chanot <git@bchanot.fr> Date: Mon, 29 Jun 2026 18:27:34 +0200 Subject: [PATCH 2/2] =?UTF-8?q?chore(memory):=20BLK-011=20resolved=20+=20L?= =?UTF-8?q?RN-072=20=E2=80=94=20fix-by-removal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BLK-011 → resolved by REMOVAL (not by committing the orphan), with the TRUE reason engraved: speculatively auto-bootstrapping an unused multi-session engine at project creation is bad on its own terms. The initial "redundant with TODO" framing is explicitly marked WRONG (gsd >> roadmap; TODO != gsd ROADMAP) — a false reason that won't mislead a future reader. Reasoning trace kept: both premises refuted on read, conclusion held for the stronger reason. - LRN-072 — a stranded-artifact bug can be fixed by NOT creating the artifact (negative diff), not by plumbing its commit; before building machinery, ask if the PRODUCING step is wanted. Speculative-at-creation -> remove; deliberate-on- demand -> keep. Family: BLK-010, BLK-011, BDR-036. - journal 2026-06-29 (cont. 2) + TODO: BLK-011 line flipped, chantier section, MINOR-gate FINISH marked merged. Index rows updated (blockers + learnings). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj --- .claude/memory/blockers.md | 7 ++++--- .claude/memory/journal.md | 7 ++++++- .claude/memory/learnings.md | 6 ++++++ .claude/tasks/TODO.md | 14 ++++++++++++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/.claude/memory/blockers.md b/.claude/memory/blockers.md index 6d9739e..e9a1e56 100644 --- a/.claude/memory/blockers.md +++ b/.claude/memory/blockers.md @@ -28,7 +28,7 @@ rules: | BLK-006 | 2026-05-21 | `profile.sh current` false-negative via `~/.claude` symlink (`cd` not `cd -P`) | resolved | | BLK-007 | 2026-06-02 | 6 gstack source skills (ios-*, spec) unlinked post-bump — invisible to profiles + `gstack on` | resolved | | BLK-010 | 2026-06-27 | init-project: scaffold (STEP 5) + bootstrap README (5b) have no deterministic commit owner; worktree `add -b` on unborn HEAD | resolved (uncommitted) | -| BLK-011 | 2026-06-27 | init-project STEP 13 GSD post-FINISH creates ROADMAP.md → stranded doc (3rd post-FINISH artifact) | open | +| BLK-011 | 2026-06-27 | init-project STEP 13 GSD post-FINISH creates ROADMAP.md → stranded doc (3rd post-FINISH artifact) | resolved (STEP 12 removed) | | BLK-012 | 2026-06-29 | gitflow_init half-applied: socle-commit failure swallowed → hook activated on partial run → re-run self-blocks | resolved | --- @@ -139,8 +139,9 @@ rules: - **Date**: 2026-06-27 - **Friction**: init-project STEP 13 (GSD v2 init) runs post-FINISH (STEP 11). `gsd init` creates `.gsd/` + `ROADMAP.md` (a public doc). Created AFTER FINISH integrates → ROADMAP never in the merge/PR. Same PR-stranding class as the doc-sync twin, 3rd post-FINISH artifact. - **Real cause**: artifact-producing step ordered after FINISH (= BDR-034 class). `gsd init` is a CLI mechanism distinct from doc-syncer; ROADMAP is sync-only for doc-syncer (never created by it, BDR-022 rules), so the doc-sync coupled chantier does not touch it. -- **Solution**: open — separate thread. Candidate: reorder GSD before FINISH, or commit ROADMAP after `gsd init`. Out of scope for doc-sync coupled (different mechanism). -- **Status**: open +- **Solution**: open — separate thread. Candidate: reorder GSD before FINISH, or commit ROADMAP after `gsd init`. Out of scope for doc-sync coupled (different mechanism). [historical candidates — NOT the route taken] +- **Resolution**: RESOLVED 2026-06-29 — by REMOVAL, not by committing the orphan. init-project STEP 12 (speculative gsd auto-bootstrap) DELETED → ROADMAP/.gsd never created post-FINISH → orphan dissolves, no commit helper built. TRUE reason: auto-bootstrapping a heavy multi-session ENGINE the sole user doesn't use, AT project-creation, is bad on its own terms. NOT the initial framing "ROADMAP redundant with TODO" — that was wrong and would have aged badly: gsd ≫ roadmap (state machine / crash-recovery / cost / parallel / worktree), and TODO ≠ gsd ROADMAP (different altitude + consumer). Reasoning trace: BOTH initial premises (gsd=only-roadmap; TODO-redundant) REFUTED on read, yet conclusion A (remove STEP 12) held for the STRONGER reason — right answer, reason corrected before engraving. Deliberate gsd use KEPT (onboarder PHASE 6 `/onboard add gsd`, plugin-advisor reco, status-reporter `.gsd/` read, USAGE `gsd init`). Removed STEP 12 + header 12→11-step + 10c note + 4 USAGE refs; coherence sweep = zero dangling refs. [[LRN-072]] +- **Status**: resolved (init-project STEP 12 removed — `skills/init-project/SKILL.md`; branch bugfix/blk-011-gsd-roadmap). Title says "STEP 13" — stale (was STEP 12 at removal per BDR-036 renumber); left per append-only. - **Reference**: discovered in doc-sync-coupled analysis (2026-06-27). Sibling [[BLK-010]] + twin [[BDR-034]]. ## BLK-012 — gitflow_init non-transactional: socle-commit failure swallowed → hook activated on partial run → re-run self-blocks diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index 6ee9bed..deef675 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -229,4 +229,9 @@ rules: - Scope tranché ①+②, ② first, never B, ③ deferred. Built test-first (Iron Law RED→GREEN, RED shown before each GREEN). - ② masked-commit fix ([[LRN-071]]) — 3rd occurrence of the swallowed-commit pattern ([[LRN-066]], [[LRN-068]]/[[BLK-012]]). `doc-commit.sh` exit 5 fail-loud. RED T8 proved the masking (rc 0 + stale hash + false "committed"), GREEN 32/32. - ① MINOR-shape oracle ([[BDR-040]], `lib/doc-shape.sh`) — 19/19 + behavioral Scenario D. Engraved limit: structural floor, NOT semantic (reduction of RISK-1's gross cases, not elimination). -- Branch `feature/minor-gate-strengthening`; committed code + memory; no finish yet (awaiting signal). +- Branch `feature/minor-gate-strengthening`; committed code + memory; FINISHED → develop (`0f0bd7f`) on explicit signal. Held the merge until the explicit go — the "avis-en-question" wasn't it. + +## 2026-06-29 (cont. 2) — BLK-011 resolved by REMOVAL (init-project GSD bootstrap) +- User challenge reframed the chantier: don't plumb a commit for the stranded ROADMAP — ask if gsd belongs at init AT ALL. Read REFUTED both my option-premises (gsd ≫ roadmap; TODO ≠ gsd ROADMAP) but conclusion A (remove STEP 12) held for a STRONGER reason: speculative auto-bootstrap of an unused multi-session engine at creation is bad per se. Best fix = NEGATIVE diff ([[LRN-072]]). +- Removed init-project STEP 12 (+ header 12→11-step, 10c note, 4 USAGE coherence fixes). Coherence sweep = zero dangling STEP-12 refs (the "test" for a removal). Deliberate gsd use KEPT (onboarder PHASE 6, plugin-advisor, status-reporter). [[BLK-011]] → resolved. +- Branch `bugfix/blk-011-gsd-roadmap`; no finish yet (awaiting signal). diff --git a/.claude/memory/learnings.md b/.claude/memory/learnings.md index 63c10f3..60b911f 100644 --- a/.claude/memory/learnings.md +++ b/.claude/memory/learnings.md @@ -70,6 +70,7 @@ rules: | LRN-069 | 2026-06-29 | token-authed remote writes under CC perms: inline-env (never `export`), token in header not argv, keep `git push` on ASK as the gate | scripting git/curl writes to a private remote from tool calls | | LRN-070 | 2026-06-29 | clean-tree-gated migration blocked by a dirty submodule → diagnose pointer-vs-content; for a local edit use `submodule.<name>.ignore=dirty`, never blind reset | migrating/releasing a superproject whose submodule carries intentional local edits | | LRN-071 | 2026-06-29 | fail-loud must cover the helper's OWN commit, not just its inputs — 3rd occurrence of the swallowed-commit pattern (a failed op masked by a later returning-0 statement) | any helper whose return value gates a downstream "success" — audit every fallible internal op propagates, esp. the commit | +| LRN-072 | 2026-06-29 | a stranded-artifact bug can be fixed by NOT creating the artifact (negative diff), not by plumbing its commit — if the producing step is speculative/unused, delete it | a stranded/duplicated/uncommitted-artifact bug — before building machinery, ask if the PRODUCING step is wanted; speculative-at-creation → remove, deliberate-on-demand → keep | --- @@ -801,3 +802,8 @@ rules: - **RECURRENT (3×) — audit systematically, not an isolated bug**: same fail-silent-where-it-must-fail-loud class in the surgical-commit family — [[LRN-066]] (`deploy-commit.sh`: porcelain hides a git-ignored path → silent no-op; fix = loud rc 5) + [[LRN-068]]/[[BLK-012]] (`gitflow_init`: socle-commit failure swallowed by `||` then `git branch` returned 0 → init continued past the dead commit) + this. The common mechanism: a fallible op (esp. a commit) whose failure isn't propagated, MASKED by a later returning-0 statement. The motif RETURNS; treat it as a known smell. - **fix**: guard the commit — `if ! git commit …; then LOUD + return 5; fi`. rc 5 = "tried, git refused" (distinct from rc 3 = "could not start"). Empty stdout (no stale hash), loud stderr. Proven by T8: RED showed the masking (rc 0 + stale hash + false "committed"), GREEN rc 5 + empty + REJECTED, 32/32. - **future application**: any helper whose RETURN VALUE gates a downstream "success" — audit that EVERY fallible internal op propagates its failure, ESPECIALLY the load-bearing commit. `set -uo pipefail` without `-e` does NOT abort mid-function; an unchecked failing command followed by a returning-0 line exits 0 and lies. Check `cmd || other` forms, no-`-e` blocks, every "report success after the op" line. Test the partial-failure path (commit-blocked repo) → must fail loud, empty, non-zero. + +## LRN-072 — a stranded-artifact bug can be fixed by NOT creating the artifact (negative diff), not by plumbing its commit +- **pattern**: 3rd member of the post-FINISH-artifact class (memory, docs, GSD ROADMAP) — but UNLIKE the first two (real artifacts ALWAYS produced → couple a commit), the GSD artifact came from a SPECULATIVE, opt-in, rarely-used producer (init-project auto-bootstrapping a multi-session engine at project creation). The reflex fix (reorder + build `gsd-commit.sh` + tests) would have added machinery to faithfully commit an artifact nobody uses. The right fix was a NEGATIVE diff: delete the producer → orphan never created → bug dissolves, zero new code (BLK-011). +- **the refutation that got there**: the framing "ROADMAP redundant with TODO" was WRONG (gsd ≫ roadmap = state machine/crash-recovery/cost/parallel/worktree; TODO ≠ gsd ROADMAP = different altitude + consumer). Reading REFUTED both premises, yet the CONCLUSION (remove the step) held for a STRONGER reason: speculatively scaffolding a heavy engine the sole user doesn't use, at creation, is bad per se. Right answer, reason corrected before engraving — change the QUESTION before changing the code. +- **future application**: a stranded / duplicated / uncommitted-artifact bug → BEFORE building machinery to handle the artifact, ask whether the step that PRODUCES it is actually used / wanted / non-speculative. Speculative or unused (esp. a personal/single-user repo) → DELETE the producer; the cleanest fix is the absent one. Distinguish speculative-at-creation (REMOVE) from deliberate-on-demand (KEEP). Family: [[BLK-010]], [[BLK-011]], [[BDR-036]]. diff --git a/.claude/tasks/TODO.md b/.claude/tasks/TODO.md index 491bf4d..f2089f8 100644 --- a/.claude/tasks/TODO.md +++ b/.claude/tasks/TODO.md @@ -262,7 +262,7 @@ reorder + CREATE doc-commit.sh/.md (mirror memory-commit, 4 deltas). Surface-don - [x] Task 6b — wire doc-commit into feat/bugfix/hotfix DOC SYNC — 1b01b95. commit-change exempt (no DOC SYNC); hotfix wired (include no-ops on empty). - [x] Task 7 — close: `run-doc-behavioral.md` + shellcheck clean + 28/28 + CHANGELOG + BDR-036 / LRN-058-060 / EVAL-008. surface-replaces-gate + partial-init + scope-expansion engraved honestly. - [x] RESOLVED 2026-06-29 — [[BLK-010]] closed by `gitflow_init` root commit (init-project STEP 5f): scaffold/README get a deterministic commit owner + HEAD born before the worktree step. Verified (mechanism + STEP 5f wiring + T2 test); blockers.md index+body updated. -- [ ] flagged separate — [[BLK-011]] GSD ROADMAP.md post-FINISH (now STEP 12 after Task 5 renumber; BLK-011 record itself left at STEP 13 — append-only) +- [x] RESOLVED 2026-06-29 — [[BLK-011]] closed by REMOVAL: init-project STEP 12 (speculative gsd auto-bootstrap) deleted → orphan never created. Negative diff, not commit-plumbing ([[LRN-072]]). See chantier below. - [x] DONE 2026-06-29 — doc-sync MINOR gate strengthened: ① shape-oracle [[BDR-040]] + ② masked-commit fix [[LRN-071]] (③ branch-guard deferred). See chantier below. ## 2026-06-29 — gitflow universal model + 6-repo migration (DONE) @@ -285,5 +285,15 @@ the literal one (blocking gate on MINOR) contradicts engraved [[BDR-036]]. Scope - [x] ① MINOR-shape oracle — `lib/doc-shape.sh` ([[BDR-040]]) + `run-doc-shape.sh` 19/19 (boundary + env-override). Wired doc-syncer STEP A4 (escalate whole set → existing SIGNIFICANT gate; no=revert all, select=keep subset) + `doc-commit.md` ACKNOWLEDGMENTS coherence + behavioral Scenario C/D - [x] shellcheck clean (doc-commit.sh, doc-shape.sh, both test harnesses); coherence ref-sweep clean - [x] Capitalize — BDR-040 + LRN-071 + CHANGELOG (Added/Fixed) + journal 2026-06-29 (cont.) -- [ ] FINISH — merge feature/minor-gate-strengthening → develop (awaiting explicit human signal) +- [x] FINISH — merged feature/minor-gate-strengthening → develop (`0f0bd7f`) on explicit signal - [~] ③ branch-guard in doc-commit DEFERRED — duplicates protected-base predicate 3rd time (lib + hook + here); all migrated repos have the hook. Reconsider only for repos outside `gitflow init` + +## 2026-06-29 — BLK-011 GSD ROADMAP post-FINISH [branch bugfix/blk-011-gsd-roadmap] +User reframed: don't plumb a commit for the stranded ROADMAP — ask if gsd belongs at init at all. +Read refuted both option-premises (gsd ≫ roadmap; TODO ≠ gsd ROADMAP) but conclusion A held for a +stronger reason: speculative auto-bootstrap of an unused engine at creation is bad per se ([[LRN-072]]). +- [x] Resolve by REMOVAL — deleted init-project STEP 12 (negative diff −26/+13), not a commit helper +- [x] Ref-coherence sweep ("test" for a removal) — header 12→11-step, 10c note, 4 USAGE refs; zero dangling STEP-12 refs repo-wide +- [x] Scope guardrails — deliberate gsd use KEPT (onboarder PHASE 6, plugin-advisor, status-reporter) +- [x] Capitalize — [[BLK-011]] resolved (true reason + premise trace) + [[LRN-072]] + CHANGELOG Removed + journal 2026-06-29 (cont. 2) +- [ ] FINISH — merge bugfix/blk-011-gsd-roadmap → develop (awaiting explicit human signal)