Repository navigation
[deployment] vogt-prod lifecycle bootstrap hook is not mounted or executing #467
Description
Summary
Follow-up to #384. The generic Vogt lifecycle-hook runner is present and active in vogt-prod, but the deployment currently has no lifecycle hook bundle mounted. As a result, the deployment-owned workspace bootstrap (agent-workspace-config/bootstrap/deploy.sh) is not run during startup.
This leaves the agent workspace dependent on stale/persisted state and does not ensure that Claude Code and Codex receive the intended workspace bootstrap assets and operating guidance. The per-session MCP registration helper still runs, but agent sessions can remain unaware of, or reluctant to use, the Vogt and Cadastre MCPs unless explicitly directed.
Expected behavior
The private vogt-prod deployment should mount and execute a deployment-owned bootstrap hook during the Vogt lifecycle, for example a post-start.d hook that invokes the workspace bootstrap repository's bootstrap/deploy.sh. The hook should be idempotent, observable in deployment logs, and fail startup when required bootstrap/verification fails.
The public Vogt image and base Compose files should remain estate-neutral; this should be wired by the private deployment overlay using the lifecycle contract introduced by #384.
Actual behavior
In the running production engine:
- PID 1 is
/usr/local/bin/vogt-lifecycle /usr/local/bin/mydevenv2-entrypoint. /run/vogt/hooksis not mounted and contains no hook bundle.- No
VOGT_LIFECYCLE_*orVOGT_HOOKS_REQUIREDenvironment is configured in the container; lifecycle state falls back to/tmp/vogt-lifecycle. - There is no startup log showing
agent-workspace-config/bootstrap/deploy.shor an equivalent workspace bootstrap hook. mydevenv2-mcp-bootstrapdoes run frommydevenv2-agent-authlaunches and writes client registrations, but this is separate from the workspace bootstrap and does not provide a behavioral instruction to use the MCPs.
Evidence
Environment inspected on 2026-08-29 (secrets and private hostnames omitted):
Entrypoint: ["/usr/local/bin/vogt-lifecycle"]
Command: ["/usr/local/bin/mydevenv2-entrypoint"]
Mounts included workspace/home/data volumes, but no /run/vogt/hooks mount.
/tmp/vogt-lifecycle/started exists; no hook execution output was present.
The documented lifecycle contract says that hooks are supplied from a deployment-owned read-only mount at /run/vogt/hooks; the runner does not discover scripts from the image or workspace automatically.
Impact
- Recreated or refreshed production workspaces are not guaranteed to receive the bootstrap repository's shared Claude/Codex assets.
- Existing sessions may not know that Vogt and Cadastre are available or may not proactively select their tools.
- The deployment can appear healthy while the intended workspace bootstrap has silently been omitted.
Proposed fix
- Add a private deployment-owned executable hook under
post-start.dthat invokesagent-workspace-config/bootstrap/deploy.shwith an explicitWORKSPACE_ROOT. - Mount the hook bundle at
/run/vogt/hooks:ro, configure a persistent lifecycle state directory, and setVOGT_HOOKS_REQUIRED=trueif bootstrap is mandatory. - Keep dirty-checkout handling explicit; do not silently use
--allow-dirtyfor production updates. - Add deployment verification that proves the hook ran and that the expected workspace assets are present.
- After a successful deployment, restart existing Claude Code and Codex sessions so they reload the materialized client configuration and instructions.
Related
- feat(deploy): support deployment-owned lifecycle hook scripts outside images #384 — generic deployment-owned lifecycle hooks (implemented)
docs/DEPLOYMENT.md— deployment-owned lifecycle hooksagent-workspace-config/bootstrap/deploy.sh— workspace bootstrap entry point
Implementation plan (private estate deployment)
This must be implemented in the private deployment repository/overlay, not the public Vogt image.
- Add an executable deployment-owned hook under
post-start.dthat invokes the workspace bootstrap with an explicit workspace root. - Mount the hook bundle at
/run/vogt/hooks:ro, configure persistent lifecycle state, and setVOGT_HOOKS_REQUIRED=true. - Make dirty-checkout handling explicit; do not silently use
--allow-dirty. - Verify expected Claude/Codex/Vogt/MCP assets after startup and include hook evidence in the deployment receipt.
- Restart or refresh existing sessions after a successful bootstrap.
The public image only supplies the generic lifecycle hook contract.
Activity
thedancingdeveloper commentedon Sep 5, 2026
Status: still open. No change found. The generic #384 lifecycle contract is present in the repo, but wiring the deployment-owned bootstrap hook (mount
/run/vogt/hooks, invokeagent-workspace-config/bootstrap/deploy.sh, setVOGT_HOOKS_REQUIRED, add verification) is a private-overlay/operator task and there is no evidence it has been done on vogt-prod. Remains open pending that overlay change plus deployment verification that the hook actually ran.thedancingdeveloper commentedon Sep 8, 2026
Closing — resolved and now out of scope for the public repo. The estate deploy/overlay (where this hook belongs, as the issue notes) moved to the private ops repo in the 2026-09 reset. Operationally verified this session: on the prod v0.6.1 cutover the deployment pre-start hooks under
/run/vogt/hooksare mounted and execute (the engine state-dir rename hook ran and loggedengine state: migrated …). If a prod bootstrap-hook gap resurfaces it's now tracked in the private ops repo, not here.