hygiene: de-privatize vibecrafted before public release (vc-deprivatize) - #70
hygiene: de-privatize vibecrafted before public release (vc-deprivatize)#70div0-space wants to merge 33 commits into
Conversation
… a hosted macOS runner - new workflow release-dmg.yml (macos-15, workflow_dispatch + v* tags): checks out vibecrafted + donors vc-frame/vc-terminal, materializes $KEYS from secrets, runs make release, re-walks the DMG through the hygiene gate, scrubs keys, uploads DMG + receipts as artifact (no publish) - payload-hygiene.sh: PAYLOAD_HYGIENE_EPHEMERAL_ROOTS declares builder roots that identify nobody (/Users/runner, $GITHUB_WORKSPACE); not an allowlist of payload strings — every surviving literal is still refused; unset = operator boundary unchanged - why: operator decision 2026-08-22 — the local operator build cannot pass its own gate (rustc leaves ~411 $HOME literals in vc-frame via inlined upstream spans); a hosted runner has no operator identity to leak, so the gate's promise holds by construction - measured: three clean local builds of PR66/main all stop at 'names the build host in 3 place(s)' (vc-frame only) Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T19:53:05+02:00 runtime: terminal
…s an encrypted asset - assets/fonts/SpotMono.ttc.enc: AES-256-CBC/PBKDF2 ciphertext of the licensed font (434 KB exceeds the 48 KB Actions secret limit; plaintext must not sit in a public repo) - release-dmg.yml: decrypts it into $KEYS/fonts with secret VC_FONT_PASSPHRASE; replaces the VC_SPOT_MONO_TTC_B64 secret - passphrase also kept in the operator's ~/.keys for rotation Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T20:09:33+02:00 runtime: terminal
…rst hosted run - workflow_dispatch is only registered once the file exists on main; a push trigger on this branch lets PR #69 prove the runner path before merge - remove before/at merge Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T20:14:17+02:00 runtime: terminal
- vetcoders/vc-frame main (7ab84069, 2026-08-14) lacks the release-binary target and the baked-manifest fix; develop (017e3839) is 13 ahead and is what the operator's local donor builds from - first hosted run 32590319025 proved toolchain, keys and vc-terminal; it stopped exactly on 'No rule to make target release-binary' Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T20:29:46+02:00 runtime: terminal
- run 32591086444 reached xtask build and panicked in prost-build: no protoc on macos-15; brew protobuf provides it Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T20:41:58+02:00 runtime: terminal
…wn for the server shell - run 32591700337 built vc-frame and vc-start on the runner; build-server-release stopped on missing cargo-leptos - pinned to 0.3.7, the version the operator's machine releases with Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T21:08:29+02:00 runtime: terminal
…not name the operator - run 32593008654 assembled the whole app on macos-15 and stopped at the gate with 'no --forbid literal given': every build-host root was ephemeral, so the scanner refused an empty proof — correctly - payload-hygiene.sh: PAYLOAD_HYGIENE_EXTRA_LITERALS appends caller literals; the workflow passes the operator's home and workshop, which is exactly what a signed artifact built elsewhere must not carry - these two paths already appear in the public git history; forbidding them leaks nothing Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T21:48:37+02:00 runtime: terminal
…pshot-donors) - run #5 assembled Vibecrafted.app but the hygiene gate refused it: 411x /Users/polyversai + 13x /Volumes/vc-workspace in Contents/Helpers/vc-frame - source: vc-frame's git-tracked zellij-utils/assets/plugins/*.wasm, built on the operator machine and embedded via include_bytes!; no runner flag can rewrite bytes compiled elsewhere - the builder already recompiles them under its remaps behind --snapshot-donors; on a hosted runner the donors are throwaway checkouts, so it is always on Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T22:29:45+02:00 runtime: terminal
…the search list - run #6 passed the hygiene gate (0 literals) and died in codesign: "The specified item could not be found in the keychain" although find-identity saw the Developer ID in the ephemeral keychain - codesign chains the leaf through the search list; the hosted image also lacks Apple's Developer ID G2 intermediate - builder: KEYCHAIN_SESSION_REGISTER_SEARCH_LIST now honours VIBECRAFTED_KEYCHAIN_SEARCH_LIST (default 0 — the operator machine keeps its Codescribe-safe behaviour) - workflow: sets it to 1 and imports DeveloperIDG2CA.cer into the runner's login keychain Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-22T23:31:15+02:00 runtime: terminal
…r, document the hosted path - run 32600012658 produced Vibecrafted_4.2.4-20260822-8d041616.dmg: notarized, stapled, accepted by spctl, clean through the hygiene gate on the operator machine - the push trigger on ci/release-dmg-runner was only for bring-up; tags v* and workflow_dispatch remain - RELEASE_KICKOFF: the root workflow is no longer read-only; hosted runner vs operator machine, publication stays an explicit step Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-23T00:19:26+02:00 runtime: claude-code
….conf, accent-named themes
- vetcoders-mesh.kdl: vetcoders-dragon/sztudio/silver/div0 → mesh-red/purple/cyan/green, palettes byte-identical
- auto-theme.sh: VIBECRAFTED_THEME pin > VIBECRAFTED_MESH_MAP > ${VIBECRAFTED_HOME}/mesh.conf > vibecrafted; no host list in the repo
- smoke [5] uses a temp mesh.conf with generic hosts (29/0); vc-dashboard MESH line reads the same file
- docs/VC-FRAME.md: per-host mapping section replaces the private host table
Authored-By: claude <agents@vetcoders.io>
session_id: 67428033-45fe-4310-abb5-09b998f5da06
time: 2026-08-23T13:00:37+02:00
runtime: claude-code
…from config, not a host list
- mission_control.rs: TAILSCALE_DISPATCH_TARGETS const removed; VIBECRAFTED_DISPATCH_TARGETS env > ${VIBECRAFTED_HOME}/mesh.conf (first token per line) > empty with a neutral 'no dispatch targets configured' signal
- fixtures/snapshots: host-a/host-b with 100.64.0.x CGNAT addresses instead of real peers
- lib.rs: useless_format clippy error in HEAD fixed; rustfmt pass on vc_start/config/observe/ui (HEAD was not fmt-clean)
- fmt/clippy -D warnings/test -p voc green
Authored-By: claude <agents@vetcoders.io>
session_id: 67428033-45fe-4310-abb5-09b998f5da06
time: 2026-08-23T13:01:01+02:00
runtime: claude-code
…he private chronicle - 'kronika <date>' → 'doctrine <date>' in comments, docs, diagnostics and the tests that assert on them (spawn.sh, agent_dispatch.py, spawn_parity_test.sh, agent_dispatch_test.py) - 'kronika notes/fragments' → 'chronicle …' in skill prose; PL glossary entry kept (vocabulary) - spawn_parity 18/0, race_protection 23/0, agent_dispatch tests green Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-23T13:01:11+02:00 runtime: claude-code
…, runtime and fixtures - private workstation names (dragon/div0/sztudio/silver/mgbook16/ops-linux/blacky) → host-a…host-f in docker/runtime, vibecrafted-vm, AICX-SYNC, fleet-health-probes, dashboards, tools, test fixtures; one real tailnet address → 100.64.0.11 - people in public prose → operator / Vetcoders (design sketches, synthesis template, AGENT_OPS, install.sh signature line, PL glossary example) - hook templates: 'Vista-specific' comments → product-neutral; regex unchanged - tests green: aicx_sync_smoke 16/0, iterm2 149 passed, memex/live_dashboard/control_plane suites Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-23T13:01:42+02:00 runtime: claude-code
…lic workflow, placeholders normalized - release-dmg.yml: PAYLOAD_HYGIENE_EXTRA_LITERALS comes from the repository variable of the same name (set: 2 lines); empty variable fails the run - test fixtures: /Users/polyversai|someone|nobody|operator|Barney → /Users/tester; scratch session name instead of the operator's - .loctree/loct-findings-vibecrafted.json untracked (was tracked despite .gitignore) - vc-deprivatize verify: OK; REVIEW items recorded in ~/.local/state/vetcoders/naming/need-decisions.md Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-23T13:02:04+02:00 runtime: claude-code
… operator skills - skills_sync.sh --mirror uses rsync --delete against the target host's skills dir; vc-deprivatize (private, not in the shared store) is now excluded from both push and delete - make uninstall already leaves it alone (it only removes store-enumerated skill names) Authored-By: claude <agents@vetcoders.io> session_id: 67428033-45fe-4310-abb5-09b998f5da06 time: 2026-08-23T13:07:42+02:00 runtime: claude-code
There was a problem hiding this comment.
Pull request overview
Repository-wide hygiene and de-privatization pass ahead of public release, replacing private hostnames/user paths/person-identifiers with generic placeholders, and refactoring a few runtime/release surfaces so they no longer depend on baked-in mesh topology.
Changes:
- Replace private mesh hostnames/paths/person-identifiers across docs, scripts, tests, and fixtures with generic
host-*and/Users/testerexamples. - Refactor vc-frame “mesh” theming and tui-agent Tailscale dispatch-target logic to be configured via env/
mesh.confrather than hard-coded hosts. - Add a GitHub-hosted macOS “Release DMG” workflow and extend payload-hygiene to support “ephemeral builder roots” + extra operator-bound literals.
Reviewed changes
Copilot reviewed 91 out of 92 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| vibecrafted-vm/wizard/strings.json | Updates VM wizard strings to use generic host examples. |
| vibecrafted-vm/RUNBOOK.md | Scrubs hostnames in VM runbook examples and narrative. |
| vibecrafted-vm/README.md | Scrubs hostnames in VM README usage/examples. |
| vibecrafted-vm/entry.sh | Updates comments/examples referencing mesh hosts. |
| vibecrafted-vm/compose.yaml | Updates comments to generic host examples for userspace tailscale. |
| vibecrafted-server/control-core/tests/scaffold_artifacts.rs | Scrubs hard-coded operator home paths from test fixtures. |
| vibecrafted-core/vibecrafted_core/skills/vc-review/SKILL.md | Renames “kronika” references to “chronicle/doctrine” terminology. |
| vibecrafted-core/vibecrafted_core/skills/vc-research/references/synthesis-template.md | Scrubs personal identifiers from template frontmatter. |
| vibecrafted-core/vibecrafted_core/skills/vc-operator/DASHBOARD.md | Scrubs host references in operator dashboard docs. |
| vibecrafted-core/vibecrafted_core/skills/vc-audit/SKILL.md | Renames “kronika” references to “chronicle/doctrine” terminology. |
| vibecrafted-core/vibecrafted_core/skills/vc-audit/DISPATCH.md | Renames “kronika” references to “chronicle/doctrine” terminology. |
| vibecrafted-core/vibecrafted_core/skills/pl/vibecrafted_glossary_rules-PL.md | Scrubs a glossary example string. |
| vibecrafted-core/vibecrafted_core/skills/pl/vc-research/references/synthesis-template.md | Scrubs personal identifiers from PL template frontmatter. |
| vibecrafted-core/vibecrafted_core/skills/pl/vc-operator/DASHBOARD.md | Scrubs host references in PL operator dashboard docs. |
| vibecrafted-core/vibecrafted_core/skills/pl/vc-audit/DISPATCH.md | Renames “kronika” references to “chronicle/doctrine” terminology (PL). |
| vibecrafted-core/vibecrafted_core/skills/pl/LIVING_TREE_RULE.md | Renames “kronika” references to “doctrine” (PL). |
| vibecrafted-core/vibecrafted_core/skills/LIVING_TREE_RULE.md | Renames “kronika” references to “doctrine”. |
| vibecrafted-core/vibecrafted_core/server_supervisor.py | Updates docstring wording to remove operator-path naming. |
| vibecrafted-core/vibecrafted_core/runtime/scripts/skills_sync.sh | Updates usage examples to generic hostnames. |
| vibecrafted-core/vibecrafted_core/runtime/scripts/lib/util.sh | Scrubs “Silver” workstation-specific wording from contract comment. |
| vibecrafted-core/vibecrafted_core/runtime/docs/fleet-health-probes.md | Scrubs mesh hostnames/IPs in fleet-health docs/examples. |
| vibecrafted-core/vibecrafted_core/config/vc-frame/vc-quick-cmd.sh | Scrubs operator identity/host example in vc-frame quick cmd spec comment. |
| vibecrafted-core/vibecrafted_core/config/vc-frame/themes/vetcoders-mesh.kdl | Renames mesh theme identifiers to generic mesh-* accents; removes topology mapping. |
| vibecrafted-core/vibecrafted_core/config/vc-frame/config.kdl | Updates theme docs/comments to match new mesh-* accent scheme + mapping config. |
| vibecrafted-core/vibecrafted_core/config/vc-frame/auto-theme.sh | Refactors host→theme resolution to read from env/mesh.conf instead of hard-coded hosts. |
| vibecrafted-core/vibecrafted_core/aicx_sync.py | Renames “kronika” references to “doctrine” in module documentation. |
| vibecrafted-core/vibecrafted_core/agent_dispatch.py | Renames “kronika” references to “doctrine” in parity diagnostics/docs. |
| vibecrafted-core/tests/test_memex_client.py | Scrubs hostnames and “kronika” sources in memex client tests. |
| vibecrafted-core/tests/test_live_dashboard.py | Scrubs workspace names from dashboard tests. |
| vibecrafted-core/tests/test_control_plane.py | Scrubs hostnames from test docstring narrative. |
| vibecrafted-core/tests/test_control_plane_lock_doctrine.py | Scrubs “Kronika” mention from lock doctrine test header. |
| vibecrafted-app/tui-agent/tests/snapshots/mission_control_snapshots__vc_admin_status.snap | Regenerates snapshot with generic hosts/IPs. |
| vibecrafted-app/tui-agent/tests/snapshots/mission_control_snapshots__mission_control_tab_tailscale_probe.snap | Regenerates snapshot with generic hosts/IPs. |
| vibecrafted-app/tui-agent/tests/mission_control_snapshots.rs | Updates snapshot test fixtures; adds env-based dispatch targets. |
| vibecrafted-app/tui-agent/src/ui.rs | Formatting-only changes (layout/paragraph builder chains). |
| vibecrafted-app/tui-agent/src/observe.rs | Formatting-only changes (array literals, iterator chains, line wrapping). |
| vibecrafted-app/tui-agent/src/mission_control.rs | Removes hard-coded dispatch targets; reads from env or mesh.conf; adds “not configured” signal. |
| vibecrafted-app/tui-agent/src/lib.rs | Minor allocation cleanup in error rendering. |
| vibecrafted-app/tui-agent/src/config.rs | Help text formatting tweaks. |
| vibecrafted-app/tui-agent/src/bin/vc_start.rs | Formatting-only changes + test assertion line wrapping. |
| vibecrafted-app/docs/plans/PLAN_23_AGENT_OPERATOR_DASHBOARD.md | Scrubs hostnames in plan doc examples. |
| tools/scripts/github/repo-transfer.py | Scrubs personal account name from usage examples. |
| tools/scripts/github/README.md | Scrubs personal account name from examples. |
| tools/scripts/chat/README.md | Scrubs host reference, but updates model example text (needs quoting fix per comments). |
| tools/scripts/chat/chat-cli.py | Scrubs host reference, but updates model example text (needs quoting fix per comments). |
| tools/README.md | Scrubs “dragon” naming in tooling docs. |
| tests/vc-frame-layouts-smoke.sh | Updates vc-frame theme tests to mesh.conf/VIBECRAFTED_MESH_MAP-based mapping. |
| tests/tui/test_vc_frame_config.py | Updates doctrine reference in test comment. |
| tests/tui/test_unified_app_contract.py | Scrubs example bundle IDs and user paths from contract tests. |
| tests/tui/test_product_entry_policy.py | Scrubs non-product session example names. |
| tests/tui/test_payload_hygiene.py | Scrubs user path literals in payload hygiene tests. |
| tests/spawn_parity_test.sh | Updates parity test diagnostics to cite “doctrine”. |
| tests/race_protection_test.sh | Scrubs “kronika incident” wording. |
| tests/aicx_sync_smoke.sh | Scrubs hostnames in AICX sync smoke script. |
| tests/agent_dispatch_test.py | Updates parity test docs/assertions to cite “doctrine”. |
| templates/hooks/scripts/redact-output.mjs | Generalizes token naming (“product-specific”). |
| templates/hooks/lib/secrets.sh | Generalizes token naming (“product-specific”). |
| templates/hooks/config/template.husky.env | Generalizes secret guard description. |
| scripts/vc-dashboard | Refactors mesh host display to read from mesh.conf and color by theme accent. |
| scripts/lib/spawn.sh | Updates parity wording and diagnostics to cite “doctrine”. |
| scripts/lib/payload-hygiene.sh | Adds ephemeral-root filtering + extra-literals support for hosted builders. |
| scripts/lib/living-tree-commit.sh | Updates kronika references to doctrine. |
| scripts/install-hammerspoon.sh | Updates kronika references to doctrine. |
| scripts/build-vibecrafted-release.sh | Makes keychain-search-list behavior configurable for hosted runners. |
| scripts/bootstrap-modal.sh | Scrubs example runtime hostname. |
| plugins/iterm2/tests/test_iterm2_osc.py | Scrubs host/profile strings in tests. |
| Makefile | Updates doctrine references; one comment has redundant wording (needs fix per comments). |
| install.sh | Scrubs signing identity output string. |
| docs/VC-FRAME.md | Documents new mesh accent themes + mesh.conf/VIBECRAFTED_MESH_MAP mapping scheme. |
| docs/runtime/AGENT_OPS.md | Scrubs personal identifiers in provenance text. |
| docs/RUNTIME_CONTAINER.md | Scrubs “dragon” naming in runtime container docs. |
| docs/RELEASE_KICKOFF.md | Documents hosted runner DMG workflow + operator publication boundary. |
| docs/public/_CONTRACT.md | Updates “do not emit private infra identifiers” examples. |
| docs/MEMEX.md | Renames kronika references to chronicle; scrubs hostnames in examples. |
| docs/ITERM2.md | Renames kronika references to doctrine. |
| docs/HAMMERSPOON.md | Renames kronika references to doctrine. |
| docs/design/agents-workshop/preview.html | Scrubs personal name to “Operator” in UI mock content. |
| docs/design/agents-workshop/Layout-5.md | Scrubs personal name to “Operator” in UI mock content. |
| docs/design/agents-workshop/Layout-4.md | Scrubs personal name to “Operator” in UI mock content. |
| docs/design/agents-workshop/Layout-2.md | Scrubs personal name to “Operator” in UI mock content. |
| docs/design/agents-workshop/Layout-1.md | Scrubs personal name to “Operator” in UI mock content. |
| docs/design/agents-workshop/_render.py | Scrubs transcript string to “Operator” in renderer fixture. |
| docs/AICX-SYNC.md | Scrubs hostnames; renames kronika references to doctrine. |
| docker/runtime/tailscale.env.example | Scrubs runtime hostname example. |
| docker/runtime/README.md | Scrubs hostnames and runtime access examples. |
| docker/runtime/entrypoint-runtime.sh | Scrubs runtime ssh example in logs/comments. |
| docker/runtime/Dockerfile | Scrubs hostnames in container documentation/comments. |
| docker/runtime/docker-compose.yml | Scrubs hostnames in compose docs and defaults. |
| config/hammerspoon/init.lua | Renames kronika references to doctrine. |
| config/aicx-sync.toml.example | Scrubs mesh hostname examples and updates docs. |
| .github/workflows/release-dmg.yml | Adds hosted-runner DMG build/sign/notarize workflow (integrity-check note in comments). |
Suppressed comments (2)
tools/scripts/chat/README.md:63
- This alias example also uses an unquoted model name containing a space, so the alias will not work as written when pasted into a shell.
tools/scripts/chat/chat-cli.py:285 - This epilog example also uses a model name with a space ("libraxisai/a local-11b"); without quoting it will be split into multiple args when pasted into a shell.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| local name="$1" | ||
| name="${name%.local}" | ||
| name="${name%.lan}" | ||
| printf '%s' "$name" | tr '[:upper:]' '[:lower:]' |
| # Dragon with Svetliq | ||
| ./chat-cli.py -b http://dragon:10240/v1 -m libraxisai/Svetliq-11b-v3.0-mlx | ||
| # host-a with a local | ||
| ./chat-cli.py -b http://host-a:10240/v1 -m libraxisai/a local-11b-v3.0-mlx |
| curl -fsSL -o DeveloperIDG2CA.cer https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer | ||
| security import DeveloperIDG2CA.cer -k "$HOME/Library/Keychains/login.keychain-db" -T /usr/bin/codesign |
|
|
||
| # With custom model | ||
| ./chat-cli.py --base-url http://dragon:10240/v1 --model libraxisai/Svetliq-11b | ||
| ./chat-cli.py --base-url http://host-a:10240/v1 --model libraxisai/a local-11b |
| # downgrades, allow cross-family delegation, and honor the | ||
| # VIBECRAFTED_SPAWN_ALLOW_DOWNGRADE=1 operator override with an audit | ||
| # warning. Captures kronika 2026-04-10 doctrine. | ||
| # warning. Captures doctrine 2026-04-10 doctrine. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 91 out of 92 changed files in this pull request and generated 1 comment.
Suppressed comments (6)
vibecrafted-core/vibecrafted_core/config/vc-frame/auto-theme.sh:53
normalize_hoststrips.local/.lanbefore lowercasing, so values likeHOST-A.LOCALwill not have the suffix removed (the.localmatch is case-sensitive) and can fail to match the configured mapping. Lowercase first, then strip suffixes so casing variants behave as documented.
tools/scripts/chat/README.md:33- The example model id contains a space (
libraxisai/a local-...), which makes the command invalid when copied (word-splitting) and suggests a non-existent model identifier. Use a placeholder like<model-id>(or a valid slug without spaces).
tools/scripts/chat/README.md:65 - The alias example also uses an unquoted model id containing a space, so it won't run when pasted into a shell. Replace it with a placeholder/valid slug to keep the snippet copy-pasteable.
tools/scripts/chat/README.md:72 - This transcript snippet repeats the same model id with a space (
libraxisai/a local-11b). Even though it's “output”, readers often copy/paste it; use a placeholder (<model-id>) and a generic assistant name to avoid implying a real model name with invalid characters.
tools/scripts/chat/chat-cli.py:23 - The help/usage examples use a model id with a space (
libraxisai/a local-11b), which makes the example command invalid when pasted. Replace with a placeholder (<model-id>) or a valid slug without spaces.
tools/scripts/chat/chat-cli.py:286 - The argparse epilog repeats the same invalid example model id with a space, which breaks copy/paste usage. Use a placeholder (
<model-id>) or a valid slug without spaces.
| || { echo "::error::repository variable PAYLOAD_HYGIENE_EXTRA_LITERALS is empty; the hygiene gate would prove nothing about the operator"; exit 1; } | ||
| umask 077 | ||
| mkdir -p "$KEYS/fonts" | ||
| printf '%s' "$VC_CERT_P12_B64" | base64 --decode > "$KEYS/Certificates.p12" |
…s instead of refusing them - run_mutation: a `$HOME` behind a symlink (`/tmp`→`/private/tmp`, `/home`→`/var/home`) raised RunMetaMutationError on every meta write; the dispatcher died right after spawn and the worker ran unsupervised, so runs never left `active/pid_alive`. - _canonical_directory / _canonical_meta_path now resolve ancestors and return the canonical path; only the meta file itself is still refused when it is a symlink. - run_mutation_locks keys reentrancy by the resolved root — an outer lock via `~/.vibecrafted` and an inner via `/private/...` used to flock the same file twice and self-deadlock the board sync. - runtime_transcript mirrors the same rule so transcript manifests are written under symlinked homes. - tests: symlinked-ancestor mutation and cross-spelling lock reentrancy. Authored-By: claude <agents@vetcoders.io> session_id: d825633a-af40-4a4e-b528-4aeb2e90d78b time: 2026-08-23T15:38:02+02:00 runtime: headless
…t reads green, not red - doctor: `server-supervisor` is `warn: optional` when the LaunchAgent was never installed (headless runs, observe/await and reports work without it); a present but unhealthy service still fails closed. - doctor: `version - unknown` on a stamped install falls back to the published runtime's VERSION stamp (same truth the launcher resolves); update-available no longer compares "unknown" against the channel. - foundation:vc-frame stops pointing at a vc-frame installer that does not exist; it now says the cockpit ships with the desktop app and headless works without it. - install-foundations: missing vc-frame prints the headless next steps instead of "cockpit cannot exist without it". - make install: the closing banner says `vc-start` only when vc-frame is on PATH; otherwise it prints PATH export + doctor + one dispatch + await. - README: from-source install = complete headless runtime; cockpit arrives with the DMG; first-run commands spelled out. Authored-By: claude <agents@vetcoders.io> session_id: d825633a-af40-4a4e-b528-4aeb2e90d78b time: 2026-08-23T15:43:12+02:00 runtime: headless
…s real runs; help explains its words - init: when vc-frame is absent (or `--runtime plain`), the agent starts in the caller's terminal with the /vc-init prompt instead of "run vc-start first" — which needed the same missing binary. Non-TTY callers get the headless alternative. - status: delegates to the control-plane board (one full sync, then today's runs newest first with state, report path and the await command); the legacy artifacts scan that printed "No activity yet" after two finished runs is the fallback only when core is unavailable. New module run_board.py. - settlements: listed in help but "not in the command deck" on an installed runtime — routed to core. - help: a three-line Words block (run / stage / workspace) in the root banner; init --help documents --runtime plain; status --help says what a run is. - scripts/vibecrafted is the byte mirror of the deck (deck owns). - tests updated to the new contract (init without vc-frame, empty status). Authored-By: claude <agents@vetcoders.io> session_id: d825633a-af40-4a4e-b528-4aeb2e90d78b time: 2026-08-23T15:43:45+02:00 runtime: headless
…tatus board - test_operator_mode: missing vc-frame now asserts the plain-terminal fallback message and the headless alternative, never "run vc-start first". - test_vibecrafted_launcher: empty status asserts the dispatch + await hint instead of "No activity yet — run init". Authored-By: claude <agents@vetcoders.io> session_id: d825633a-af40-4a4e-b528-4aeb2e90d78b time: 2026-08-23T15:44:14+02:00 runtime: headless
…names the cockpit as optional - core.sh: sourcing the first readable runtime helper returned out of a `while read < <(enumerator)` loop, closing the pipe under the producer — every `vibecrafted init` printed three "printf: write error: Broken pipe" lines. Candidates are drained first (portable loop, /bin/bash 3.2 has no mapfile). - doctor vc-frame:path: "run make install" right after a successful make install was a loop; it now says the cockpit is optional and where it comes from. - run_board: report_validated renders as ok, like completed. Authored-By: claude <agents@vetcoders.io> session_id: d825633a-af40-4a4e-b528-4aeb2e90d78b time: 2026-08-23T15:50:29+02:00 runtime: headless
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 108 out of 109 changed files in this pull request and generated no new comments.
Suppressed comments (5)
.github/workflows/release-dmg.yml:132
base64 --decodeis GNU-specific and is likely to fail on the macOS runner (BSDbase64typically uses-D). Use a portable decode fallback so the key materialization step works on hosted macOS images.
printf '%s' "$VC_CERT_P12_B64" | base64 --decode > "$KEYS/Certificates.p12"
tools/scripts/chat/README.md:33
- This example uses a model name containing a space, but it is not quoted. Copy/pasting will pass
libraxisai/aas the model and treat the remainder as extra CLI args.
tools/scripts/chat/README.md:63 - This alias uses an unquoted model string containing a space, so the shell will split it into multiple arguments and
--modelwill receive the wrong value.
tools/scripts/chat/chat-cli.py:24 - The usage example includes a model name containing a space but it is not quoted; copy/pasting will pass the wrong
--modelvalue.
tools/scripts/chat/chat-cli.py:286 - The argparse epilog example includes an unquoted model name containing a space, which will be split by the shell when copy/pasted.
…etitors - .loctree/canary/JOURNAL.md: Phase I inventory from loct twins/where-symbol/who-imports — nine definitions of the runtime roots in four languages, two control-plane shims with a three-candidate path chain, two shell lib trees, small Python twins, and the two absences (agent orientation, integrator). One throne decided per power. - .gitignore: .loctree/* stays local, .loctree/canary/ is versioned truth (nested .loctree dirs in sub-crates remain ignored). Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:26:13+02:00 runtime: interactive
… redefining the root - dispatch/worktrees.py defined its own vibecrafted_home with os.environ.get(..., "~/.vibecrafted"): an empty VIBECRAFTED_HOME resolved to the cwd while runtime_paths resolved to ~/.vibecrafted. Deleted; the module imports the throne. - dispatch/doctor.py imported the competitor; it now imports runtime_paths.vibecrafted_home. - vibecrafted-core tests/dispatch: 123 passed. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:26:22+02:00 runtime: interactive
…e roots - scripts/lib/runtime-roots.sh is the only shell reading of VIBECRAFTED_HOME / RUNTIME_HOME / TOOLS_HOME / LAUNCHER_BIN; install-foundations.sh and install-runtime.sh source it instead of carrying their own copies. - install-foundations.sh treated VIBECRAFTED_ROOT/.vibecrafted as a home. VIBECRAFTED_ROOT is the release generation root exported by every launcher — on a DMG machine that would have put the control plane inside the immutable generation. Gone. - install.sh is the curl|bash bootstrap and keeps a verbatim copy between markers; tests/tui/test_runtime_roots_parity.py pins the copy byte-for-byte and proves the library and the bootstrap resolve identical roots for four env shapes, and that the contract fails closed on drift. Its --tools-dir default comes from the same function. - Drift output follows docs/CLI_PRODUCT_SPEC.md: one '✗ … drift' line each plus one '→ fix' line; the five-line essay is gone. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:27:41+02:00 runtime: interactive
…tion - scripts/migrate_agents_workspace.sh moved March-era .ai-agents/ folders into the control plane and carried its own VIBECRAFTED_ROOT meaning (a workspace to scan, not the release generation). Nobody outside this org has .ai-agents/; the script was the last competitor for the root grammar. Removed with its Makefile targets and test. - test_install_runtime: drift assertion follows the one-line '✗ … drift' wording. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:27:51+02:00 runtime: interactive
…not a script found by path - deck _control_plane_script walked three candidate roots (repo source, installed tools, script root) for scripts/control_plane_state.py and ran whichever existed first — which copy of the truth synced depended on the machine. Gone; _sync_control_plane_best_effort runs `-m vibecrafted_core.control_plane sync` through _core_module_dir and _vibecrafted_python like every other core verb. - runtime/scripts/lib/meta.sh: spawn_control_plane_script (same chain, VIBECRAFTED_ROOT first) removed; spawn_sync_control_plane uses spawn_python_module. - scripts/vibecrafted mirror re-synced byte for byte. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:41:33+02:00 runtime: interactive
…e module object per truth - scripts/control_plane_state.py loaded vibecrafted_core.control_plane and then rebound its vibecrafted_home to a second module object (_sync_overrides) on every call; scripts/runtime_paths.py executed the canonical file under a second module name; scripts/control_plane_launch.py forwarded workflow. Three competitors of three thrones. (The file deletions themselves rode along in a2469bb.) - installer_gui.py imports vibecrafted_core directly (checkout package dir on sys.path). - vetcoders_install.py must run on the host python3 before the product interpreter exists and vibecrafted_core/__init__ needs 3.11+, so it executes runtime_paths.py from its file — still the one definition, just not through the package import. - distribution manifest (install.sh, distribution_manifest.py) no longer lists the shim. - pyproject: per-file E402 ignores for the shims removed. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:47:20+02:00 runtime: interactive
… runtime env scrubbed - conftest: VIBECRAFTED_HOME/RUNTIME_HOME/TOOLS_HOME/RUNTIME_BIN/ROOT/RUNTIME_ROOT/PYTHON/SOURCE are deleted for every tui test. With a live launcher's env, a test building its own HOME still resolved the operator's runtime and skipped the step it meant to prove. - test_control_plane_state imports the throne and sets VIBECRAFTED_HOME instead of monkeypatching the shim's copy; launcher tests expect '-m vibecrafted_core.control_plane sync', seed the fake tools root with the one file the deck probes for core, and isolate PATH so a venv console script cannot own the -m call; the path-chain test in test_meta_lifecycle is gone with the chain; manifest tests drop scripts/runtime_paths.py; the tarfile extractall in the manifest test is documented as bounded (members asserted, filter=data). - docs: four mentions point at vibecrafted_core.control_plane / runtime_paths. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:52:38+02:00 runtime: interactive
…ome vibecrafted_core.clock - utc_now ×3 (compact_hooks, cron, loop), _now_iso ×7 (capabilities, continuity/capabilities, lifecycle_control, perception, settlement, spawn, trust) and control_plane._now each read the wall clock on their own, in three formats: RFC 3339 +00:00, Z-suffixed, and — in lifecycle_control — LOCAL time with a numeric offset. Two machines comparing 'which receipt is newer' could disagree by a timezone. - vibecrafted_core/clock.py is the only reader of the wall clock for product state: utc_now (aware datetime), utc_now_iso (+00:00), utc_now_z (Z), utc_now_compact (file names). Every module above imports it; lifecycle_control receipts are UTC now. - control_plane._now stays as the injectable seam tests patch; it delegates to clock. - cron.default_state_file duplicated loop's (different signature) — cron imports loop's. - wrappers.deck_path was a forwarder to package_resources.deck_path — gone, the name is imported. - vibecrafted-core: 249 passed across cron/loop/compact_hooks/capabilities/perception/ settlement/trust/lifecycle_control/control_plane; wrappers+cron+loop_ship 27 passed. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T16:53:20+02:00 runtime: interactive
…eline, what stays by name - Cut 1 roots, Cut 2 control-plane entry, Cut 3 clock: competitors listed with LOC and the wrong thing each one did. - loct prism over roots/sync/install/timestamps after the cuts: 13/15, union 60, shared 16, Jaccard 0.463 — the number the next cuts must lower. - Six things not cut tonight, each with the proof it needs first. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T17:00:14+02:00 runtime: interactive
… — one name, one meaning - wrappers.repo_root returned Path.cwd(); loop.repo_root returns the git toplevel. Two answers under one name. The wrapper's is the operator's invocation directory and is now called that; loop keeps repo_root. - test_wrappers patches the new name. loct twins: 340 → 336 export groups after tonight. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T17:04:35+02:00 runtime: interactive
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 147 out of 149 changed files in this pull request and generated 1 comment.
Suppressed comments (3)
tools/scripts/chat/README.md:32
- This example model name contains a space (
libraxisai/a local-…), which makes the command invalid as-is and reads like an accidental redaction artifact. Use a placeholder like<org>/<model-name>(or a real model slug without spaces).
tools/scripts/chat/README.md:67 - The alias + example output use
libraxisai/a local-11b(space in model slug), which is not a valid--modelvalue and will break copy/paste. Consider using a placeholder model slug and keep the alias name consistent with the command shown.
tools/scripts/chat/chat-cli.py:23 - This usage example uses a
--modelvalue with a space (libraxisai/a local-11b), which is not a valid model identifier for OpenAI-compatible APIs and will break copy/paste. Replace it with a placeholder (or a real slug without spaces).
| Connected to: http://host-a:10240/v1 | ||
| Model: libraxisai/a local-11b | ||
|
|
||
| You: Kim jestes? | ||
| Assistant: Jestem Svetliq - polski model AI specjalizujacy sie w medycynie weterynaryjnej... | ||
| Assistant: Jestem a local - polski model AI specjalizujacy sie w medycynie weterynaryjnej... |
… the chronicle hygiene - de3a017 moved the canonical vc-audit and vc-review prose off the private chronicle ('kronika notes' → 'chronicle notes') but left the PL mirrors; the freshness leg of test_localization_contract has been red on this branch since. - The mirrors now say 'dziennik projektu' in the same two sentences — same hygiene, same meaning — and are newer than their canonical files again. Authored-By: claude <agents@vetcoders.io> session_id: 48924e5f-ecb3-4b18-9a67-3647ecc09312 time: 2026-08-23T17:23:48+02:00 runtime: interactive
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 149 out of 151 changed files in this pull request and generated no new comments.
Suppressed comments (4)
tools/scripts/chat/README.md:32
- The example model name contains a space, so this command will be parsed as two separate arguments (breaking
--model/-m). Quote the model value (or use a space-free model name).
tools/scripts/chat/README.md:63 - This alias uses single quotes around the full command, but the
-mvalue contains a space, so it will still split into multiple arguments. Quote the model inside the alias.
tools/scripts/chat/chat-cli.py:23 - The docstring example passes a model name containing a space without quoting, which will be split into two argv tokens. Quote the model value so the example is copy/pasteable.
tools/scripts/chat/chat-cli.py:285 - The argparse epilog example uses an unquoted model name with a space, which will be split into two args. Quote the model value so the help output stays correct.
What
vc-deprivatizepass over the whole repository (stacked on #69 — the hosted-runner DMG workflow; merge that first or this PR carries its commits).Scan before: 1277 findings / 465 definite leaks. After:
verify→ OK, no unambiguous PII/secret leaks remain; 219 "definite" hits left, of which 182 are the wordtailscale(product surface) and the rest are REVIEW items below.Refactors (functional, tested)
auto-theme.shand the theme names. Themes are nowmesh-red/purple/cyan/green(palettes byte-identical); host→theme comes fromVIBECRAFTED_MESH_MAPor${VIBECRAFTED_HOME}/mesh.conf. Smoke 29/0, pytest 9/9, shellcheck clean. Operator machines need a~/.vibecrafted/mesh.confto keep their per-host accent (format indocs/VC-FRAME.md).TAILSCALE_DISPATCH_TARGETS = ["dragon","div0"]removed; targets fromVIBECRAFTED_DISPATCH_TARGETSormesh.conf; empty → neutral signal. Snapshots regenerated with generic hosts and CGNAT addresses.cargo fmt/clippy -D warnings/test -p vocgreen (also fixes a pre-existing clippy error inlib.rs).kronika 2026-04-10citations →doctrine 2026-04-10in code + the tests asserting on them.Scrubs
host-a…host-facross docker/runtime, vibecrafted-vm, AICX-SYNC, fleet-health-probes, dashboards, tools, fixtures; one real tailnet IP →100.64.0.11Szowesgadout of CLI examples/Users/polyversai→/Users/tester(fixtures) and a repository variablePAYLOAD_HYGIENE_EXTRA_LITERALS(workflow; empty = run fails).loctree/loct-findings-vibecrafted.jsonuntracked (tracked despite.gitignore)REVIEW — recorded in
~/.local/state/vetcoders/naming/need-decisions.md(14 rows), highlightsruntime_receipt.py/installer_gui.pystill probe~/Libraxisand~/vc-workspace/vetcodersas legacy workshop rootstools/hooks/load-project-context.shpingsapi.libraxis.cloud(private product) on session starttest_unified_app_contract.py(ground truth, name is public in the cert)tools/scripts/github/repo-transfer.py(personal-account migration tool) — suggest removingvetcodersin prose — separate casing PRHistory scan (report-only)
7 commit subjects carry
[maciej/manual]/ops-linux. No rewrite performed; operator decision before first public push.Never merge from this PR — operator button.
🤖 Generated with Claude Code