The file /Users/marcus.hinz/claude-projects/ai-control/memory/ai-control-pool-setup.md has been updated successfully. (file state is current in your context — no need to Read it back)

Frische Pools zeigen Promo-/Upsell-Banner („Werbung": fable-5-promo, Passes-Upsell): gesteuert über Zähler in der Pool-`.claude.json` (`tipsHistory`, `passesUpsellSeenCount`, `fullscreenUpsellSeenCount` — zeigen je 3×, dann Ruhe). Kein Settings-Switch vorhanden (verifiziert 2026-07-04 per Snapshot-Diff misc auf privateDefault vs. Test3); privateDefault ist ausgereizt, deshalb dort aufgeräumte UI.

**Why:** Getrennte Zugänge pro Pool, [[multi-account-keychain]].

---
name: ai-control-pool-setup
description: "Stand des Pool-Setups seit 2026-07-03 — Layout, Starter, was gelöscht wurde, offene Punkte"
metadata:
  node_type: memory
  type: project
  originSessionId: e108ad75-f176-43b6-901d-c3ec19ec3961
---

Seit 2026-07-03 produktiv:

- Pools: `~/.config/ai-control/pools/<pool>/` = CLAUDE_CONFIG_DIR. `pool.json` (name, credentialType), oauth: `.credentials.json`, apikey: `apikey` + `apiKeyHelper` in pool-`settings.json`. Pools (umbenannt 2026-07-03 abends): privateDefault (vorher Mx9Privat; oauth), apiDefault (vorher TestWürth; apikey — 2026-07-03 kurz auf oauth, am selben Tag zurück auf apikey via `apiKeyHelper` in Pool-settings.json; model claude-sonnet-5). Alle 7 Projekte → privateDefault; apiDefault derzeit ohne Projekt. Pool-Wechsel eines Projekts = nur noch `ai-control.json` ändern (einzige Quelle; zieht beim nächsten Start). Pool-Umbenennung ändert den Pfad und damit den Keychain-Suffix — alte Einträge greifen dann nicht mehr.
- `CLAUDE.md`, `commands/`, `settings.json` liegen als physische Kopien in jedem Pool — bewusst poolspezifisch, keine Symlinks.
- Zuordnung: `~/claude-projects/<projekt>/ai-control.json` `{ "pool": ... }`.
- Starter: `~/Applications/Ghostty-<projekt>.app`, `LSEnvironment` setzt nur noch XDG_CONFIG_HOME (stabil, nie poolabhängig). Alle Ghostty-Configs starten `command = ~/.local/bin/claude-sync` (ggf. mit `--add-dir`-Args). `claude-sync` löst seit 2026-07-04 den Pool selbst auf (liest `./ai-control.json` im CWD, exportiert `CLAUDE_CONFIG_DIR`, laut scheiternd ohne Pool), macht git pull davor und commit+push danach. `claude-start` ist gelöscht — in `claude-sync` integriert. Env/plist tragen keinen Pool mehr.
- Pool-Guard (seit 2026-07-04): `claude-sync` schreibt Sentinel `.ai-control-running` in den Projekt-Root (Inhalt pool=CLAUDE_CONFIG_DIR, pid; FD offen gehalten, nach claude-Ende gelöscht, in .gitignore). Vorab-Check (Endstand 2026-07-03 spät): Fensterzahl statt Prozesszustand, ohne Apple-Events — `ghostty-wincount <app-pid>` (Swift-Helfer, CGWindowListCopyWindowInfo onScreenOnly + Layer 0; Binary `~/.local/bin/ghostty-wincount`, Quelle `~/claude-projects/robotunits/bin/ghostty-wincount.swift`; App-pid via ps+grep auf den App-Pfad). Das Skript läuft selbst in Fenster 1; ≥2 → Arbeitsfenster existiert → `open -a` (Launch Services, kein Prompt) + 4 s + Exit 0; sonst → Sentinel-pid und FD-Holder kill -9, Sentinel kommentarlos löschen, normal starten. Gescheiterte Vorstufen: tty-Heuristik (Zombie behält totes tty), Schreiber-PID-Check (claude-sync-Bash überlebt Ghosttys X-Close manchmal kopflos), osascript count/activate (Automation-Prompt „App X will App Y steuern" = NOGO). Bekannte Grenze: minimierte/Space-fremde Fenster zählen als unsichtbar. Traps in claude-sync: EXIT löscht Sentinel, HUP/TERM killt claude (claude läuft als Hintergrund-Kind mit `<&0` — sonst stdin=/dev/null! — und `wait`), INT no-op; greifen aber bei Ghostty-X/Quit oft nicht (hartes Kill), Rest-Aufräumen beim nächsten Start ist der Normalfall. Alle 7 Ghostty-Configs (`~/.config-ghostty/<projekt>/ghostty/config`): `wait-after-command = false`; claude-sync zeigt Schlussmeldungen per sleep (2 s aktivieren, 3 s Ende, 5 s Fehler), dann schließt das Fenster selbst. SessionStart-Hook `~/claude-projects/robotunits/bin/pool-guard` in allen 7 Projekt-settings.json: Sentinel fehlt / Pool-Mismatch / Schreiber-PID tot → rot blinkender Banner auf /dev/tty + kill des claude-Elternprozesses. RAW-Nutzung außerhalb der Projekte bleibt frei; RAW-Start IM Projekt wird beendet. Achtung: greift auch bei /clear in Sessions, die noch ohne Sentinel gestartet wurden.
- Gelöscht: `~/.claude` (komplett), Keychain-Eintrag `Claude Code-credentials`, `~/claude-pools`. Unterhaltungen (90 MB) + `history.jsonl` nach Mx9Privat umgezogen — `/resume` pro Pool.
- App-Code (`~/projects/ai-control`, Tauri): Kernlogik mit injizierbarem Home, 22 Tests (`./build.sh`-Toolchain: CARGO_HOME=~/tools/.cargo; node via fnm, nur in interaktiver zsh). Commands unassign_pool/create_project/delete_project, seit 2026-07-04 restart_project (osascript-Quit → warten → open) + Modal in ProjectList: nach Umhängen eines laufenden Projekts Restart-Angebot inkl. Hinweis, dass der claude-sync-Push beim Abschießen entfällt.
- Eingebautes Terminal (2026-07-04, Prototyp, funktioniert laut Marcus): `src-tauri/src/terminal.rs` (portable-pty, Commands open_terminal/term_start/term_write/term_resize) + `terminal.html`/`src/terminal.ts` (xterm.js, Output base64-Events, Capability `term-*`). „Terminal"-Button in ProjectList öffnet pro Klick ein eigenes Fenster; PTY startet `zsh -ic claude-sync` im Projektordner — Pool/Sentinel/git-Sync unverändert bei claude-sync, App setzt kein CLAUDE_CONFIG_DIR. Fenster-X killt Kind + schließt PTY (HUP wie Ghostty-X, Abschluss-Push entfällt). Damit Weg frei, die Ghostty-Starter abzulösen ("wir haben alles in der Hand"). Offen: Scrollback-Restore, Fensterposition merken.
- Stand 2026-07-04 abends, alles committed+gepusht (bis inkl. Todo-Feature): UI komplett auf Catppuccin-Mocha-Token + JetBrains Mono (frontend-design-Skill; Plugin `frontend-design` war kaputt — installPaths in installed_plugins.json zeigten nach Pool-Umbenennung noch auf Mx9Privat, gefixt), i18n de/en (vue-i18n, Umschalter im Header). Pools: löschbar mit Zuordnungs-Auflösung, „Neu anmelden" löscht vorher den suffixierten Keychain-Eintrag (nur bei ungenutztem Pool, Warn-Dialog), Renew entfernt (Datei-Refresh-Token tot, Keychain hat Vorrang), hasCredentials (apikey-Dateicheck) mit Start-Blockierung. Verbrauch-Tab: usage_stats parst <pool>/projects/*/*.jsonl (Dedup message.id+requestId, Preistabelle Fable 10/50 Opus 5/25 Sonnet 3/15 Haiku 1/5, Cache 1.25x/0.1x), Pool-Zeilen aggregiert + Projekte aufklappbar; apiDefault hat keinerlei Transcripts (Marcus' apiKey-Abfragen vom 04.07. liefen nachweislich nicht über claude-code auf diesem Rechner — Console zeigt die Wahrheit). Projekt-Wizard (create_project_full: Scaffold nach 08-07-Muster inkl. pool-guard-Hook, Arbeitsordner anlegen/verknüpfen) + Löschen (Guard bei laufender Session, optional Arbeitsordner aus additionalDirectories mit). Todo-Feature nur Projektebene (robotunits-Muster: OFFENE-PUNKTE.md + jq-SessionStart-Hook, zuschaltbar in Wizard+Zahnrad; Pool-Ebene bewusst nicht). App heißt ai-control (Cargo-Paket umbenannt), Hand-Icon (Tray per include_bytes + Template-Icon; Dock-Icon der Terminals via NSApplication nur in RunEvent::Ready). 38 Rust-Tests. Offen/geplant: Baustein-Bibliothek (CLAUDE.md-Marker-Mechanismus, Konzept steht: ~/.config/ai-control/blocks/, verwaltete Abschnitte zwischen ai-control:block-Markern), weitere Wizard-Optionen, Split privates Repo / offizielles GitHub-Repo (Ist-Stand als Initial-Commit ohne History; OAuth-Login-Teil wegen ToS-Grauzone fürs öffentliche Repo rausnehmen — apiKey-Teil unkritisch), Vitest für UI-Tests (Vorschlag steht), Dock-Name macOS/Wayland „später überlegen".
- Alter Zwischenstand (Commit f747379 = Terminal + Start/Beenden-Button): (a) ProjectList: ein Button pro Zeile — grün „Starten" (open_terminal) / rot „Beenden" (neues Command stop_project: SIGTERM auf exakte PIDs per `pgrep -f -- "--terminal <projekt>$"`, sonst Ghostty-Quit; NIE Quit über die App-Bundle-ID — träfe die Haupt-App); is_running = Ghostty ODER --terminal-Prozess; Status-Kreis ohne Prozess unsichtbar. (b) Terminal-Config-Dialog (Zahnrad): `terminal: { theme, icon, title }` in projekt-`ai-control.json` (pool-Feld jetzt Option, Datei bleibt bei unassign wenn terminal gesetzt); 5 Themes (mocha/dracula/solarized-dark/gruvbox/one-dark, Paletten in terminal.ts, Fenster-BG gespiegelt in terminal.rs theme_background — muss synchron bleiben); Icon = PNG/ICNS-Pfad via tauri-plugin-dialog-Picker, gesetzt per NSApplication.applicationIconImage (objc2, nur in RunEvent::Ready — in setup() überschreibt macOS es wieder); Titel: Fenstertitel + Header, leer → Projektname. `tauri::generate_context!` darf nur 1× expandieren (_EMBED_INFO_PLIST, fällt nur im Release-Build auf).
- Dock-Grenze macOS: Hover-Label im Dock = Bundle-Name, zur Laufzeit nicht öffentlich änderbar; Wrapper-Bundle pro Projekt von Marcus abgelehnt („verlieren zu viel"). Windows/X11: Titel+Icon greifen fensterbasiert; Wayland-Docks bräuchten .desktop pro Projekt (xdg-toplevel-icon nur KDE). → „da müssen wir was überlegen, nicht jetzt".

**Why:** Getrennte Zugänge pro Pool, [[multi-account-keychain]].

**Agenda 2026-07-04:** Start/Stopp-Architektur grundsätzlich besprechen — Stand vom 2026-07-03 spät (wincount/kill-9/Sentinel-Reste) funktioniert im Test, ist aber Flickwerk um Ghosttys unzuverlässiges Kill-Verhalten herum; Marcus will eine saubere Lösung statt Workarounds. Außerdem: Pool-Guard + Kaltstart über Starter testen; App: UI aufräumen, Projekte managen, Defaults/Standardverhalten (z. B. Todolist); Linux gesondert; Open-Source-Frage („works for my workflow") entschieden nach Feinschliff; außerdem Ghostty und Zed besprechen. Stand App: beta-0.8 gepusht (Tray statt Dock, Autostart-Schalter, Fenster startet unsichtbar, Restart-Dialog).

**How to apply — offen (Stand 2026-07-03):** (1) Sync-Konzept für `~/.config/ai-control` inkl. Unterhaltungen, Secrets-Frage (git). (2) UI kennt die drei neuen Commands nicht. (3) Erledigt durch Integration in `claude-sync` (2026-07-04): der „Flicker" betraf das gelöschte `claude-start`; `claude-sync` läuft in den Ghostty-Wrappern nachweislich interaktiv.

+Frische Pools zeigen Promo-/Upsell-Banner („Werbung": fable-5-promo, Passes-Upsell): gesteuert über Zähler in der Pool-`.claude.json` (`tipsHistory`, `passesUpsellSeenCount`, `fullscreenUpsellSeenCount` — zeigen je 3×, dann Ruhe). Kein Settings-Switch vorhanden (verifiziert 2026-07-04 per Snapshot-Diff misc auf privateDefault vs. Test3); privateDefault ist ausgereizt, deshalb dort aufgeräumte UI.


Im Pool-Setup-Memory festgehalten: Banner hängen an den Zählern in der Pool-`.claude.json` (je 3× anzeigen, dann Ruhe), kein Settings-Switch.


kannst du die counts mal - aus neugier - hochsetzen?


Bash

f=/Users/marcus.hinz/.config/ai-control/pools/Test3/.claude.json
jq '.passesUpsellSeenCount = 3 | .tipsHistory["fable-5-promo-2"] = 99' "$f" > "$f.tmp" && mv "$f.tmp" "$f" && chmod 600 "$f"
jq '{passesUpsellSeenCount, tips: .tipsHistory["fable-5-promo-2"], fullscreenUpsellSeenCount}' "$f"

Upsell-Zähler in Test3 .claude.json hochsetzen


Gesetzt in `Test3/.claude.json`: `passesUpsellSeenCount: 3`, `tipsHistory.fable-5-promo-2: 99` (`fullscreenUpsellSeenCount` stand schon auf 3). Falls die misc-Session auf Test3 noch läuft, schreibt sie beim Beenden ihren eigenen Stand zurück und überschreibt das.


hilft auch nicht


jq '{passesUpsellSeenCount, fullscreenUpsellSeenCount, tipsHistory}' /Users/marcus.hinz/.config/ai-control/pools/Test3/.claude.json

Zählerstände in Test3 nach Neustart prüfen


Die Werte stehen noch (99 / 3 / 3), der Banner kommt trotzdem — die Zähler sind also nicht das, was die Anzeige steuert. Woran sie tatsächlich hängt, weiß ich nicht; aus der `.claude.json` allein ist es nicht ablesbar.


ok -- kannst du mal im pool nach den werten schuaen?


grep -ril -e promo -e upsell -e passes /Users/marcus.hinz/.config/ai-control/pools/Test3/ 2>/dev/null

Test3-Pool nach promo/upsell/passes durchsuchen


jq '.cachedGrowthBookFeatures | keys' /Users/marcus.hinz/.config/ai-control/pools/Test3/.claude.json 2>/dev/null; ls /Users/marcus.hinz/.config/ai-control/pools/Test3/cache/

GrowthBook-Flags und cache-Verzeichnis ansehen


[
  "claude_code_skills_dashboard_enabled_cli",
  "tengu-fable-off-switch",
  "tengu-model-error-overrides",
  "tengu-off-switch",
  "tengu-top-of-feed-tip",
  "tengu_1p_event_batch_config",
  "tengu_agent_list_attach",
  "tengu_alder_compass",
  "tengu_amber_anchor",
  "tengu_amber_flint",
  "tengu_amber_heron",
  "tengu_amber_lark",
  "tengu_amber_lattice",
  "tengu_amber_lynx",
  "tengu_amber_moleskin",
  "tengu_amber_packet",
  "tengu_amber_prism",
  "tengu_amber_quill",
  "tengu_amber_redwood2",
  "tengu_amber_redwood3",
  "tengu_amber_rokovoko",
  "tengu_amber_sentinel",
  "tengu_amber_sextant",
  "tengu_amber_wren",
  "tengu_anchor_tide",
  "tengu_ashen_kelp",
  "tengu_aura_sieve",
  "tengu_auto_mode_config",
  "tengu_auto_mode_default_on",
  "tengu_auto_notice_once",
  "tengu_ax_screen_reader",
  "tengu_bad_survey_transcript_ask_config",
  "tengu_basalt_meadow",
  "tengu_basalt_quill",
  "tengu_basalt_spur",
  "tengu_basalt_sundial",
  "tengu_basalt_tern",
  "tengu_bg_attach_stall_ms",
  "tengu_billiard_aviary",
  "tengu_birch_compass",
  "tengu_birch_kettle",
  "tengu_birch_lantern",
  "tengu_birthday_hat",
  "tengu_blue_coaster",
  "tengu_bramble_lintel",
  "tengu_brass_sled",
  "tengu_brick_follow",
  "tengu_bridge_attestation_enforce",
  "tengu_bridge_attestation_enforce_config",
  "tengu_bridge_min_version",
  "tengu_bridge_poll_interval_config",
  "tengu_bridge_poll_interval_ms",
  "tengu_bridge_repl_v2",
  "tengu_bridge_repl_v2_config",
  "tengu_bridge_requires_action_details",
  "tengu_byte_stream_idle_timeout_ms",
  "tengu_c4e_slash_upsell",
  "tengu_c4w_usage_limit_notifications_enabled",
  "tengu_canary",
  "tengu_ccr_bridge",
  "tengu_ccr_bridge_multi_session",
  "tengu_ccr_bundle_max_bytes",
  "tengu_ccr_bundle_seed_enabled",
  "tengu_ccr_delta_rehydrate",
  "tengu_ccr_post_turn_summary",
  "tengu_ccr_v2_send_events_cli",
  "tengu_cedar_halo",
  "tengu_cedar_hollow_7m",
  "tengu_cedar_lantern",
  "tengu_cedar_plume",
  "tengu_cedar_sundial",
  "tengu_cfc_in_product_permissions",
  "tengu_chair_sermon",
  "tengu_chert_bezel",
  "tengu_chomp_inflection",
  "tengu_chrome_auto_enable",
  "tengu_cinder_almanac",
  "tengu_cinder_plover",
  "tengu_classifier_disabled_surfaces",
  "tengu_classifier_summary_heuristic_emit",
  "tengu_classifier_summary_llm_emit",
  "tengu_claudeai_mcp_connectors",
  "tengu_cloth_snorkel",
  "tengu_cobalt_compass",
  "tengu_cobalt_harbor",
  "tengu_cobalt_heron",
  "tengu_cobalt_lantern",
  "tengu_cobalt_plinth",
  "tengu_cobalt_plinth_direct",
  "tengu_cobalt_plinth_putguard",
  "tengu_cobalt_plinth_reader_persist",
  "tengu_cobalt_raccoon",
  "tengu_cobalt_ridge",
  "tengu_cobalt_thicket",
  "tengu_cobalt_wren",
  "tengu_code_diff_cli",
  "tengu_collage_kaleidoscope",
  "tengu_compact_cache_prefix",
  "tengu_compass_dial",
  "tengu_copper_bridge",
  "tengu_copper_fox",
  "tengu_copper_meadow",
  "tengu_copper_thistle",
  "tengu_copper_wren",
  "tengu_coral_beacon",
  "tengu_coral_fern",
  "tengu_cork_lantern",
  "tengu_cork_m4q",
  "tengu_cowork_chrome_automode_default",
  "tengu_crimson_echo",
  "tengu_crimson_vector",
  "tengu_crystal_beam",
  "tengu_desktop_upsell",
  "tengu_desktop_upsell_v2",
  "tengu_destructive_command_warning",
  "tengu_disable_bypass_permissions_mode",
  "tengu_doorbell_agave",
  "tengu_drift_lantern",
  "tengu_dune_wren",
  "tengu_dunwich_bell",
  "tengu_ember_latch",
  "tengu_ember_trail",
  "tengu_event_sampling_config",
  "tengu_event_watchdog_default_on",
  "tengu_feature_claudified_template",
  "tengu_feature_template",
  "tengu_feedback_survey_config",
  "tengu_fennel_kite",
  "tengu_fennel_kite_model",
  "tengu_fg_left_arrow_agents",
  "tengu_fgts",
  "tengu_file_write_optimization",
  "tengu_fine_survey_transcript_ask_config",
  "tengu_flax_grouse",
  "tengu_fleet_past_sessions",
  "tengu_fleetview_onboarding_v2",
  "tengu_flint_harbor",
  "tengu_flint_harbor_prompt",
  "tengu_flint_harbor_share",
  "tengu_frame_publish_context",
  "tengu_frond_boric",
  "tengu_garnet_finch",
  "tengu_gha_plugin_code_review",
  "tengu_gleaming_fair",
  "tengu_good_survey_transcript_ask_config",
  "tengu_gorse_fathom",
  "tengu_gouda_loop",
  "tengu_grey_step2",
  "tengu_gypsum_kite",
  "tengu_harbor",
  "tengu_harbor_ledger",
  "tengu_harbor_permissions",
  "tengu_harbor_prism",
  "tengu_harbor_willow",
  "tengu_hawthorn_steeple",
  "tengu_hawthorn_window",
  "tengu_hazel_osprey",
  "tengu_hazel_osprey_floor",
  "tengu_herring_clock",
  "tengu_ide_rc_auto_enable",
  "tengu_idle_amber_finch",
  "tengu_immediate_model_command",
  "tengu_jade_anvil_4",
  "tengu_kairos_cron",
  "tengu_kairos_cron_durable",
  "tengu_kairos_github_webhooks",
  "tengu_kairos_input_needed_push",
  "tengu_kairos_loop_dynamic",
  "tengu_kairos_loop_prompt",
  "tengu_kairos_push_notifications",
  "tengu_kestrel_arch",
  "tengu_keybinding_customization_release",
  "tengu_lantern_hearth",
  "tengu_lantern_spool",
  "tengu_lapis_anchor",
  "tengu_lapis_anchor_budget",
  "tengu_lapis_finch",
  "tengu_lapis_thicket",
  "tengu_lichen_compass",
  "tengu_lilac_loom",
  "tengu_linen_osprey",
  "tengu_log_datadog_events",
  "tengu_loggia_carousel",
  "tengu_long_context_survey_probability",
  "tengu_long_context_survey_question_variant",
  "tengu_long_context_survey_threshold",
  "tengu_long_context_survey_trigger_mode",
  "tengu_loud_sugary_rock",
  "tengu_loud_sugary_rock2",
  "tengu_lumen_thicket_q7",
  "tengu_malformed_tool_use_clean_retry",
  "tengu_malort_pedway",
  "tengu_maple_pier",
  "tengu_maple_sundial",
  "tengu_maple_tide",
  "tengu_marble_anvil",
  "tengu_marble_lark",
  "tengu_marble_sandcastle",
  "tengu_marble_whisper",
  "tengu_marble_whisper2",
  "tengu_max_version_config",
  "tengu_mcp_elicitation",
  "tengu_mcp_local_oauth_blocked_hosts",
  "tengu_mcp_normalize_root_combinators",
  "tengu_mcp_path_scoped_permissions",
  "tengu_mcp_retry_failed_remote",
  "tengu_mcp_singleton_unwrap",
  "tengu_mcp_stateless_skip_init",
  "tengu_mcp_subagent_prompt",
  "tengu_md_artifact_styling",
  "tengu_mint_lanes",
  "tengu_miraculo_the_bard",
  "tengu_mocha_barista",
  "tengu_moss_anchor",
  "tengu_moth_copse",
  "tengu_native_cursor",
  "tengu_negative_interaction_transcript_ask_config",
  "tengu_nimble_amber_prose",
  "tengu_non_deferrable_builtins",
  "tengu_noreread_q7m_velvet",
  "tengu_ochre_hollow",
  "tengu_olive_hinge",
  "tengu_onyx_plover",
  "tengu_orchid_mantis",
  "tengu_orchid_mantis_v2",
  "tengu_orchid_trellis",
  "tengu_orford_ness",
  "tengu_osprey_lantern",
  "tengu_otk_slot_v1",
  "tengu_passport_quail",
  "tengu_penguin_mode_promo",
  "tengu_penguins_enabled",
  "tengu_permission_friction",
  "tengu_pewter_brook",
  "tengu_pewter_finch",
  "tengu_pewter_kestrel",
  "tengu_pewter_lantern",
  "tengu_pewter_lark",
  "tengu_pewter_ledger",
  "tengu_pewter_summit",
  "tengu_plan_artifact",
  "tengu_plank_river_frost",
  "tengu_plugin_binary_assets",
  "tengu_plugin_official_mkt_git_fallback",
  "tengu_plum_vx3",
  "tengu_porch_bell_9f",
  "tengu_post_compact_survey",
  "tengu_prism_ledger",
  "tengu_prompt_cache_1h_config",
  "tengu_prompt_cache_diagnostics",
  "tengu_prompt_suggestion",
  "tengu_quartz_heron",
  "tengu_quartz_meadow",
  "tengu_quartz_vireo",
  "tengu_quiet_basalt_echo",
  "tengu_quiet_harbor",
  "tengu_quiet_slate_wren",
  "tengu_quill_harbor",
  "tengu_react_vulnerability_warning",
  "tengu_reactive_compact_remote",
  "tengu_read_dedup_killswitch",
  "tengu_red_coaster",
  "tengu_report_findings_tool",
  "tengu_review_bughunter_config",
  "tengu_review_workflow_routing",
  "tengu_rewind_first_message",
  "tengu_riverbed_lantern",
  "tengu_russet_linnet",
  "tengu_saffron_anchor",
  "tengu_saffron_credits_only_tiers",
  "tengu_saffron_lattice",
  "tengu_sage_compass",
  "tengu_sage_compass2",
  "tengu_scarf_coffee",
  "tengu_scratch",
  "tengu_sedge_lantern",
  "tengu_sedge_lantern_holdback",
  "tengu_sepia_cormorant",
  "tengu_sepia_moth",
  "tengu_session_memory",
  "tengu_sessions_elevated_auth_enforcement",
  "tengu_shale_finch",
  "tengu_shining_fractals",
  "tengu_shoji_engine",
  "tengu_silent_harbor",
  "tengu_silk_almanac",
  "tengu_silk_hinge",
  "tengu_skills_dashboard_enabled",
  "tengu_slate_fern",
  "tengu_slate_finch",
  "tengu_slate_harbor_experiment",
  "tengu_slate_harrier",
  "tengu_slate_ibis",
  "tengu_slate_kestrel",
  "tengu_slate_meadow",
  "tengu_slate_meridian",
  "tengu_slate_moth",
  "tengu_slate_nexus",
  "tengu_slate_quill",
  "tengu_slate_ribbon",
  "tengu_slate_siskin",
  "tengu_slate_thimble",
  "tengu_slate_wren",
  "tengu_slim_subagent_claudemd",
  "tengu_sm_config",
  "tengu_snippet_save",
  "tengu_soft_slate_nudge",
  "tengu_sotto_voce",
  "tengu_sparrow_ledger",
  "tengu_startup_announcements",
  "tengu_startup_notice",
  "tengu_steady_lantern",
  "tengu_streaming_tool_execution2",
  "tengu_sub_nomdrep_q7k",
  "tengu_surreal_dali",
  "tengu_swann_brevity",
  "tengu_system_prompt_global_cache",
  "tengu_tab_read_sep",
  "tengu_tangerine_ladder_boost",
  "tengu_team_discovery",
  "tengu_tense_pond",
  "tengu_tern_alloy",
  "tengu_tide_elm",
  "tengu_timber_lark",
  "tengu_tool_pear",
  "tengu_tool_search_unsupported_models",
  "tengu_trace_lantern",
  "tengu_turtle_carbon",
  "tengu_tussock_oriole",
  "tengu_ultraplan_config",
  "tengu_ultraplan_prompt_identifier",
  "tengu_ultraplan_timeout_seconds",
  "tengu_umber_petrel",
  "tengu_usage_overage_included_models",
  "tengu_vellum_lantern",
  "tengu_vellum_siding",
  "tengu_velvet_hammer",
  "tengu_velvet_hammer_fable_5",
  "tengu_velvet_hammer_falcon",
  "tengu_velvet_hammer_haiku",
  "tengu_velvet_hammer_haiku_4_5",
  "tengu_velvet_hammer_mythos_5",
  "tengu_velvet_hammer_opus",
  "tengu_velvet_hammer_opus_4_6",
  "tengu_velvet_hammer_opus_4_7",
  "tengu_velvet_hammer_opus_4_8",
  "tengu_velvet_hammer_sonnet",
  "tengu_velvet_hammer_sonnet_4_5",
  "tengu_velvet_hammer_sonnet_4_6",
  "tengu_velvet_hammer_sonnet_5",
  "tengu_velvet_harbor",
  "tengu_velvet_ibis",
  "tengu_velvet_mallet",
  "tengu_velvet_mallet_fable_5",
  "tengu_velvet_mallet_falcon",
  "tengu_velvet_mallet_haiku",
  "tengu_velvet_mallet_haiku_4_5",
  "tengu_velvet_mallet_opus",
  "tengu_velvet_mallet_opus_4_6",
  "tengu_velvet_mallet_opus_4_7",
  "tengu_velvet_mallet_opus_4_8",
  "tengu_velvet_mallet_sonnet",
  "tengu_velvet_mallet_sonnet_4_5",
  "tengu_velvet_moth",
  "tengu_velvet_static",
  "tengu_velvet_tide",
  "tengu_version_config",
  "tengu_vscode_feedback_survey",
  "tengu_vscode_onboarding",
  "tengu_vscode_review_upsell",
  "tengu_walnut_prism",
  "tengu_walrus_canteen",
  "tengu_willow_census_ttl_hours",
  "tengu_willow_mode",
  "tengu_willow_refresh_ttl_hours",
  "tengu_willow_sentinel_ttl_hours",
  "tengu_windows_credman",
  "tengu_workflows_enabled",
  "tengu_workout2",
  "tengu_worktree_mode",
  "tengu_xq7_marble_zephyr",
  "tengu_xterm_atlas_reset"
]
changelog.md


diff <(jq -S '.cachedGrowthBookFeatures' /Users/marcus.hinz/.config/ai-control/pools/privateDefault/.claude.json) <(jq -S '.cachedGrowthBookFeatures' /Users/marcus.hinz/.config/ai-control/pools/Test3/.claude.json) | head -60

GrowthBook-Flag-Werte beider Pools diffen


117c117
<   "tengu_birch_lantern": "off",
---
>   "tengu_birch_lantern": "step",


Im Pool liegen die Werte als GrowthBook-Flag-Cache in der `.claude.json` (`cachedGrowthBookFeatures`, ~370 Flags mit verschleierten Namen). Der Diff zwischen beiden Pools ergibt genau einen Unterschied:

```
tengu_birch_lantern:  privateDefault = "off"   Test3 = "step"
```

privateDefault (aufgeräumte UI) hat „off", Test3 (mit Werbung) hat „step". Sonst sind die Flag-Caches identisch.


dann setz das mal


f=/Users/marcus.hinz/.config/ai-control/pools/Test3/.claude.json
jq '.cachedGrowthBookFeatures.tengu_birch_lantern = "off"' "$f" > "$f.tmp" && mv "$f.tmp" "$f" && chmod 600 "$f"
jq '.cachedGrowthBookFeatures.tengu_birch_lantern' "$f"

tengu_birch_lantern in Test3 auf off setzen


"off"


Gesetzt: `tengu_birch_lantern = "off"` in `Test3/.claude.json`. Der Cache wird beim Start vom Server aufgefrischt (`cachedGrowthBookFeaturesAt`) — der Wert kann dabei wieder überschrieben werden.


ist es auch nicht
brauchen wir nicht zu vertiefenn
Morgen :: sync Test auf neuem Mach

alles commiten und pushen


Edit

Frische Pools zeigen Promo-/Upsell-Banner („Werbung": fable-5-promo, Passes-Upsell): gesteuert über Zähler in der Pool-`.claude.json` (`tipsHistory`, `passesUpsellSeenCount`, `fullscreenUpsellSeenCount` — zeigen je 3×, dann Ruhe). Kein Settings-Switch vorhanden (verifiziert 2026-07-04 per Snapshot-Diff misc auf privateDefault vs. Test3); privateDefault ist ausgereizt, deshalb dort aufgeräumte UI.

Frische Pools zeigen Promo-/Upsell-Banner („Werbung"), privateDefault nicht — Ursache ungeklärt (Stand 2026-07-04, nicht weiter vertiefen): Hochsetzen der Zähler in der Pool-`.claude.json` (`tipsHistory.fable-5-promo-2`, `passesUpsellSeenCount`) half nicht, ebenso wenig `cachedGrowthBookFeatures.tengu_birch_lantern = "off"` (einziger Flag-Unterschied der Pools). Kein Settings-Switch vorhanden.

**Agenda 2026-07-05:** Sync-Test auf neuem Mac (pool-Repo mit Symlink-Runtime: clonen, `link-pool-runtime` bzw. Pool-Anlage über die App, /resume-Übernahme prüfen).


Frische Pools zeigen Promo-/Upsell-Banner („Werbung"), privateDefault nicht — Ursache ungeklärt (Stand 2026-07-04, nicht weiter vertiefen): Hochsetzen der Zähler in der Pool-`.claude.json` (`tipsHistory.fable-5-promo-2`, `passesUpsellSeenCount`) half nicht, ebenso wenig `cachedGrowthBookFeatures.tengu_birch_lantern = "off"` (einziger Flag-Unterschied der Pools). Kein Settings-Switch vorhanden.

**Agenda 2026-07-05:** Sync-Test auf neuem Mac (pool-Repo mit Symlink-Runtime: clonen, `link-pool-runtime` bzw. Pool-Anlage über die App, /resume-Übernahme prüfen).

---
name: ai-control-pool-setup
description: "Stand des Pool-Setups seit 2026-07-03 — Layout, Starter, was gelöscht wurde, offene Punkte"
metadata:
  node_type: memory
  type: project
  originSessionId: e108ad75-f176-43b6-901d-c3ec19ec3961
---

Seit 2026-07-03 produktiv:

- Pools: `~/.config/ai-control/pools/<pool>/` = CLAUDE_CONFIG_DIR. `pool.json` (name, credentialType), oauth: `.credentials.json`, apikey: `apikey` + `apiKeyHelper` in pool-`settings.json`. Pools (umbenannt 2026-07-03 abends): privateDefault (vorher Mx9Privat; oauth), apiDefault (vorher TestWürth; apikey — 2026-07-03 kurz auf oauth, am selben Tag zurück auf apikey via `apiKeyHelper` in Pool-settings.json; model claude-sonnet-5). Alle 7 Projekte → privateDefault; apiDefault derzeit ohne Projekt. Pool-Wechsel eines Projekts = nur noch `ai-control.json` ändern (einzige Quelle; zieht beim nächsten Start). Pool-Umbenennung ändert den Pfad und damit den Keychain-Suffix — alte Einträge greifen dann nicht mehr.
- `CLAUDE.md`, `commands/`, `settings.json` liegen als physische Kopien in jedem Pool — bewusst poolspezifisch, keine Symlinks.
- Zuordnung: `~/claude-projects/<projekt>/ai-control.json` `{ "pool": ... }`.
- Starter: `~/Applications/Ghostty-<projekt>.app`, `LSEnvironment` setzt nur noch XDG_CONFIG_HOME (stabil, nie poolabhängig). Alle Ghostty-Configs starten `command = ~/.local/bin/claude-sync` (ggf. mit `--add-dir`-Args). `claude-sync` löst seit 2026-07-04 den Pool selbst auf (liest `./ai-control.json` im CWD, exportiert `CLAUDE_CONFIG_DIR`, laut scheiternd ohne Pool), macht git pull davor und commit+push danach. `claude-start` ist gelöscht — in `claude-sync` integriert. Env/plist tragen keinen Pool mehr.
- Pool-Guard (seit 2026-07-04): `claude-sync` schreibt Sentinel `.ai-control-running` in den Projekt-Root (Inhalt pool=CLAUDE_CONFIG_DIR, pid; FD offen gehalten, nach claude-Ende gelöscht, in .gitignore). Vorab-Check (Endstand 2026-07-03 spät): Fensterzahl statt Prozesszustand, ohne Apple-Events — `ghostty-wincount <app-pid>` (Swift-Helfer, CGWindowListCopyWindowInfo onScreenOnly + Layer 0; Binary `~/.local/bin/ghostty-wincount`, Quelle `~/claude-projects/robotunits/bin/ghostty-wincount.swift`; App-pid via ps+grep auf den App-Pfad). Das Skript läuft selbst in Fenster 1; ≥2 → Arbeitsfenster existiert → `open -a` (Launch Services, kein Prompt) + 4 s + Exit 0; sonst → Sentinel-pid und FD-Holder kill -9, Sentinel kommentarlos löschen, normal starten. Gescheiterte Vorstufen: tty-Heuristik (Zombie behält totes tty), Schreiber-PID-Check (claude-sync-Bash überlebt Ghosttys X-Close manchmal kopflos), osascript count/activate (Automation-Prompt „App X will App Y steuern" = NOGO). Bekannte Grenze: minimierte/Space-fremde Fenster zählen als unsichtbar. Traps in claude-sync: EXIT löscht Sentinel, HUP/TERM killt claude (claude läuft als Hintergrund-Kind mit `<&0` — sonst stdin=/dev/null! — und `wait`), INT no-op; greifen aber bei Ghostty-X/Quit oft nicht (hartes Kill), Rest-Aufräumen beim nächsten Start ist der Normalfall. Alle 7 Ghostty-Configs (`~/.config-ghostty/<projekt>/ghostty/config`): `wait-after-command = false`; claude-sync zeigt Schlussmeldungen per sleep (2 s aktivieren, 3 s Ende, 5 s Fehler), dann schließt das Fenster selbst. SessionStart-Hook `~/claude-projects/robotunits/bin/pool-guard` in allen 7 Projekt-settings.json: Sentinel fehlt / Pool-Mismatch / Schreiber-PID tot → rot blinkender Banner auf /dev/tty + kill des claude-Elternprozesses. RAW-Nutzung außerhalb der Projekte bleibt frei; RAW-Start IM Projekt wird beendet. Achtung: greift auch bei /clear in Sessions, die noch ohne Sentinel gestartet wurden.
- Gelöscht: `~/.claude` (komplett), Keychain-Eintrag `Claude Code-credentials`, `~/claude-pools`. Unterhaltungen (90 MB) + `history.jsonl` nach Mx9Privat umgezogen — `/resume` pro Pool.
- App-Code (`~/projects/ai-control`, Tauri): Kernlogik mit injizierbarem Home, 22 Tests (`./build.sh`-Toolchain: CARGO_HOME=~/tools/.cargo; node via fnm, nur in interaktiver zsh). Commands unassign_pool/create_project/delete_project, seit 2026-07-04 restart_project (osascript-Quit → warten → open) + Modal in ProjectList: nach Umhängen eines laufenden Projekts Restart-Angebot inkl. Hinweis, dass der claude-sync-Push beim Abschießen entfällt.
- Eingebautes Terminal (2026-07-04, Prototyp, funktioniert laut Marcus): `src-tauri/src/terminal.rs` (portable-pty, Commands open_terminal/term_start/term_write/term_resize) + `terminal.html`/`src/terminal.ts` (xterm.js, Output base64-Events, Capability `term-*`). „Terminal"-Button in ProjectList öffnet pro Klick ein eigenes Fenster; PTY startet `zsh -ic claude-sync` im Projektordner — Pool/Sentinel/git-Sync unverändert bei claude-sync, App setzt kein CLAUDE_CONFIG_DIR. Fenster-X killt Kind + schließt PTY (HUP wie Ghostty-X, Abschluss-Push entfällt). Damit Weg frei, die Ghostty-Starter abzulösen ("wir haben alles in der Hand"). Offen: Scrollback-Restore, Fensterposition merken.
- Stand 2026-07-04 abends, alles committed+gepusht (bis inkl. Todo-Feature): UI komplett auf Catppuccin-Mocha-Token + JetBrains Mono (frontend-design-Skill; Plugin `frontend-design` war kaputt — installPaths in installed_plugins.json zeigten nach Pool-Umbenennung noch auf Mx9Privat, gefixt), i18n de/en (vue-i18n, Umschalter im Header). Pools: löschbar mit Zuordnungs-Auflösung, „Neu anmelden" löscht vorher den suffixierten Keychain-Eintrag (nur bei ungenutztem Pool, Warn-Dialog), Renew entfernt (Datei-Refresh-Token tot, Keychain hat Vorrang), hasCredentials (apikey-Dateicheck) mit Start-Blockierung. Verbrauch-Tab: usage_stats parst <pool>/projects/*/*.jsonl (Dedup message.id+requestId, Preistabelle Fable 10/50 Opus 5/25 Sonnet 3/15 Haiku 1/5, Cache 1.25x/0.1x), Pool-Zeilen aggregiert + Projekte aufklappbar; apiDefault hat keinerlei Transcripts (Marcus' apiKey-Abfragen vom 04.07. liefen nachweislich nicht über claude-code auf diesem Rechner — Console zeigt die Wahrheit). Projekt-Wizard (create_project_full: Scaffold nach 08-07-Muster inkl. pool-guard-Hook, Arbeitsordner anlegen/verknüpfen) + Löschen (Guard bei laufender Session, optional Arbeitsordner aus additionalDirectories mit). Todo-Feature nur Projektebene (robotunits-Muster: OFFENE-PUNKTE.md + jq-SessionStart-Hook, zuschaltbar in Wizard+Zahnrad; Pool-Ebene bewusst nicht). App heißt ai-control (Cargo-Paket umbenannt), Hand-Icon (Tray per include_bytes + Template-Icon; Dock-Icon der Terminals via NSApplication nur in RunEvent::Ready). 38 Rust-Tests. Offen/geplant: Baustein-Bibliothek (CLAUDE.md-Marker-Mechanismus, Konzept steht: ~/.config/ai-control/blocks/, verwaltete Abschnitte zwischen ai-control:block-Markern), weitere Wizard-Optionen, Split privates Repo / offizielles GitHub-Repo (Ist-Stand als Initial-Commit ohne History; OAuth-Login-Teil wegen ToS-Grauzone fürs öffentliche Repo rausnehmen — apiKey-Teil unkritisch), Vitest für UI-Tests (Vorschlag steht), Dock-Name macOS/Wayland „später überlegen".
- Alter Zwischenstand (Commit f747379 = Terminal + Start/Beenden-Button): (a) ProjectList: ein Button pro Zeile — grün „Starten" (open_terminal) / rot „Beenden" (neues Command stop_project: SIGTERM auf exakte PIDs per `pgrep -f -- "--terminal <projekt>$"`, sonst Ghostty-Quit; NIE Quit über die App-Bundle-ID — träfe die Haupt-App); is_running = Ghostty ODER --terminal-Prozess; Status-Kreis ohne Prozess unsichtbar. (b) Terminal-Config-Dialog (Zahnrad): `terminal: { theme, icon, title }` in projekt-`ai-control.json` (pool-Feld jetzt Option, Datei bleibt bei unassign wenn terminal gesetzt); 5 Themes (mocha/dracula/solarized-dark/gruvbox/one-dark, Paletten in terminal.ts, Fenster-BG gespiegelt in terminal.rs theme_background — muss synchron bleiben); Icon = PNG/ICNS-Pfad via tauri-plugin-dialog-Picker, gesetzt per NSApplication.applicationIconImage (objc2, nur in RunEvent::Ready — in setup() überschreibt macOS es wieder); Titel: Fenstertitel + Header, leer → Projektname. `tauri::generate_context!` darf nur 1× expandieren (_EMBED_INFO_PLIST, fällt nur im Release-Build auf).
- Dock-Grenze macOS: Hover-Label im Dock = Bundle-Name, zur Laufzeit nicht öffentlich änderbar; Wrapper-Bundle pro Projekt von Marcus abgelehnt („verlieren zu viel"). Windows/X11: Titel+Icon greifen fensterbasiert; Wayland-Docks bräuchten .desktop pro Projekt (xdg-toplevel-icon nur KDE). → „da müssen wir was überlegen, nicht jetzt".

Frische Pools zeigen Promo-/Upsell-Banner („Werbung": fable-5-promo, Passes-Upsell): gesteuert über Zähler in der Pool-`.claude.json` (`tipsHistory`, `passesUpsellSeenCount`, `fullscreenUpsellSeenCount` — zeigen je 3×, dann Ruhe). Kein Settings-Switch vorhanden (verifiziert 2026-07-04 per Snapshot-Diff misc auf privateDefault vs. Test3); privateDefault ist ausgereizt, deshalb dort aufgeräumte UI.

**Why:** Getrennte Zugänge pro Pool, [[multi-account-keychain]].

**Agenda 2026-07-04:** Start/Stopp-Architektur grundsätzlich besprechen — Stand vom 2026-07-03 spät (wincount/kill-9/Sentinel-Reste) funktioniert im Test, ist aber Flickwerk um Ghosttys unzuverlässiges Kill-Verhalten herum; Marcus will eine saubere Lösung statt Workarounds. Außerdem: Pool-Guard + Kaltstart über Starter testen; App: UI aufräumen, Projekte managen, Defaults/Standardverhalten (z. B. Todolist); Linux gesondert; Open-Source-Frage („works for my workflow") entschieden nach Feinschliff; außerdem Ghostty und Zed besprechen. Stand App: beta-0.8 gepusht (Tray statt Dock, Autostart-Schalter, Fenster startet unsichtbar, Restart-Dialog).

**How to apply — offen (Stand 2026-07-03):** (1) Sync-Konzept für `~/.config/ai-control` inkl. Unterhaltungen, Secrets-Frage (git). (2) UI kennt die drei neuen Commands nicht. (3) Erledigt durch Integration in `claude-sync` (2026-07-04): der „Flicker" betraf das gelöschte `claude-start`; `claude-sync` läuft in den Ghostty-Wrappern nachweislich interaktiv.

-Frische Pools zeigen Promo-/Upsell-Banner („Werbung": fable-5-promo, Passes-Upsell): gesteuert über Zähler in der Pool-`.claude.json` (`tipsHistory`, `passesUpsellSeenCount`, `fullscreenUpsellSeenCount` — zeigen je 3×, dann Ruhe). Kein Settings-Switch vorhanden (verifiziert 2026-07-04 per Snapshot-Diff misc auf privateDefault vs. Test3); privateDefault ist ausgereizt, deshalb dort aufgeräumte UI.

+Frische Pools zeigen Promo-/Upsell-Banner („Werbung"), privateDefault nicht — Ursache ungeklärt (Stand 2026-07-04, nicht weiter vertiefen): Hochsetzen der Zähler in der Pool-`.claude.json` (`tipsHistory.fable-5-promo-2`, `passesUpsellSeenCount`) half nicht, ebenso wenig `cachedGrowthBookFeatures.tengu_birch_lantern = "off"` (einziger Flag-Unterschied der Pools). Kein Settings-Switch vorhanden.

+**Agenda 2026-07-05:** Sync-Test auf neuem Mac (pool-Repo mit Symlink-Runtime: clonen, `link-pool-runtime` bzw. Pool-Anlage über die App, /resume-Übernahme prüfen).


ist es auch nicht brauchen wir nicht zu vertiefenn Morgen :: sync Test auf neuem Mach  alles commiten und pushen


Launching skill: git-sync


Führe genau dieses eine Kommando aus, sonst nichts:

```bash
~/claude-projects/pool/bin/git-sync
```

Das Skript liest selbst die `permissions.additionalDirectories` aus den Settings und
synct jedes Repo (add, commit mit Timestamp-Message, pull --rebase, push). Kein force,
kein Merge. Gib anschließend die Ausgabe des Skripts wieder.


Bash

git-sync über alle konfigurierten Repos ausführen


· ai-control: keine Änderungen.
· ai-control: nichts zu pushen.


cd /Users/marcus.hinz/claude-projects && git add -A && git commit -m "Pool-Runtime als Symlinks im Repo (Test3-Test), Werbung-Analyse ergebnislos, Agenda Sync-Test neuer Mac" && git push

claude-projects-Repo committen und pushen