fix: fail closed on invalid launch inputs #1192
Open
be-coder-06
wants to merge 1 commits from
fix/1182-fail-closed-launch into next
pull from: fix/1182-fail-closed-launch
merge into: :next
:main
:docs/1216-trunk-parameterization
:next
:docs/ia-merge-current
:fix/869-lease-probe-timeout
:feat/workspace-hygiene-tool-enforcement
:feat/1080-pr-edit
:fix/1182-fail-closed-launch
:fix/1179-required-security-di
:feat/p3-slice0-task5-chat-runtime-router-shaggy
:feat/p3-slice0-task5-chat-runtime-router
:feat/wf1-composition
:feat/p3-slice0-task4-web-catalog-selection
:feat/lease-promotion-and-harness-isolation
:ci/provision-pi-runtime
:feat/p3-slice0-task3-catalog-selection
:feat/p3-slice0-task2-harness-registry
:adopt/965-mos-ste-writing-standard
:fix/991-comment-url-scheme-normalise
:feat/wf2-bundle-migration
:feat/wf4-plugin-acquisition
:feat/wf5-refresh-safety
:fix/1145-coord-di-compiled-boot
:feat/p3-slice0-task1-harness-contracts
:docs/webui-phase-p-structure
:feat/1150-pi-goal-extension
:feat/webui-p3-chat
:fix/1146-ci-queue-purpose
:fix/1138-conditional-federation
:feat/webui-p2-data-auth
:fix/gateway-runner-image
:feat/webui-p1-vite-skeleton
:fix/break-c-hooks-and-web-image
:docs/webui-fleet-claude-bridge-plan
:fix/wizard-gateway-failure
:fix/ci-queue-wait-no-status
:fix/next-node-gate
:fix/mosaic-init-rce
:greenfield/fomo-lin
:fix/1099-pipefail-wake
:fix/1099-pipefail-tests
:fix/1099-pipefail-sweep
:fix/framework-shell-portability
:fix/1043-pane-git-identity
:fix/1081-issue-close-silent-comment-failure
:fix/1090-enrollment-wallclock-tolerance
:feat/1082-tea-stale-token-diagnostic
:fix/detect-platform-silent-128-outside-repo
:feat/1050-install-state-machine-red-fixture
:fix/pr-merge-message-field
:feat/1051-mosaic-brain-installer
:feat/1045-mosaic-cred
:remediation/state
:fix/1056-upgrade-rollback-control-race
:fix/1019-ci-queue-timeout-harness
:feat/rm-02-gate-registry
:fix/rm-01-reproducible-checkout
:remediation/mission-setup
:fix/hygiene-inert-format-gate
:fix/1019-queue-guard-stdin
:feat/mos-ste-writing-standard
:fix/1007-suite-hermeticity
:feat/push-guard-null-case-verification
:mos-comms-live
:docs/heartbeat-framework-layering-ms-lead
:feat/869-c4-version-coupling
:feat/869-c2-install-ordering-guard
:feat/869-c5-doctor-activation-check
:feat/per-agent-gitea-identity
:fix/875-belongs-case-insensitive-slug
:fix/ci-queue-wait-404-branch-absent
:feat/869-c1-activation-probe
:feat/869-c3-broker-supervisor
:fix/865-tea-cli-comment-invocation
:feat/glpi-skills
:fix/860-deflake-mutator-lease-gate
:fix/850-detect-platform-port-normalization
:fix/856-worktree-deps-preflight
:fix/835-pr-review-approve-reject-comment-flag
:fix/848-truthful-evidence
:fix/812-pr-review-comment
:fix/849-recovery-runtime-fixture-race
:docs/758-ledger-m5-001-sync
:feat/834-tc-server-side-doc
:feat/833-constrained-recovery-command
:feat/827-gate0-probe
:governance/gate0-probe3-amendment
:fix/795-codex-pr-diff
:fix/795-ci-base-jq
:fix/795-ci-base-git
:feat/791-pr3-fleet-regen
:feat/791-pr2-snapshot-restore
:fix/807-glpi-206
:fix/808-agent-send-false-sender
:feat/791-upgrade-config-protection
:feat/790-mosaic-yolo-claudex-pr2
:feat/790-mosaic-yolo-claudex
:feat/758-v1-v2-migrator
:fix/766-exact-fleet-comms
:test/758-reconciler-lifecycle-gates
:docs/771-kbn101-db-role-split
:test/758-example-profile-dispositions
:feat/758-shared-role-resolution
:feat/mos-logical-identity-fencing
:feat/769-kbn100-unified-schema
:docs/753-kbn010-threat-gate
:feat/758-roster-v2-compiler
:feat/756-official-discord-plugin
:docs/758-fleet-config-management
:fix/mos-option2-qualification-format
:docs/issue-758-m0
:docs/mos-option2-qualification
:mos-comms
:feat/tess-interaction-agent
:fix/tess-docs-format
:draft/mosaic-platform-prd
:fix/installer-provider-gate-and-local-gateway-redis
:release/mosaic-cli-0.0.37
:feat/framework-constitution-alpha
:fix/git-wrapper-repo-detection
:fix/woodpecker-wrapper-legacy-mosaic
:fix/t-a292e96f-gitea-pr-metadata
:fix/gitea-pr-metadata-login-t-a292e96f
:fix/t_a292e96f-pr-metadata-gitea
:fix/t_3a368a52-gitea-usc-login
:fix/bootstrap-hotfix
:fix/populate-known-packages-list
:fix/idempotent-init
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Fixes #1182 (FL-07–FL-10), the explicit W-F1 prerequisite, by enforcing one invariant: a wrong answer must not be interpreted as no answer or success.
CHAT_HARNESS_RUNTIMEandMOSAIC_STORAGE_TIERvalues with typed errors before runtime/storage selection; true absence keeps documented defaults.MosaicConfigEnvironmentErrorfrom the public@mosaicstack/configentry point.runtime_launch_faileddiagnostics.session.launchprovenance mandatory before every spawn, including normal/yolo claudex, while preserving #1109execLeaseGatedRuntimerouting.Gateway assertion inversion
The existing Gateway boundary assertion previously encoded the defect: invalid
MOSAIC_STORAGE_TIER=invalidwas expected to selecttier=local source=default. It is deliberately inverted—not deleted—to require a typedMosaicConfigEnvironmentErrorwith codeinvalid_storage_tierbefore Gateway module selection.Tests and negative controls
apps/gateway/src/chat/chat-runtime-fail-closed.spec.tspackages/config/src/mosaic-config.fail-closed.spec.tspackages/mosaic/src/commands/launch-fail-closed.integration.spec.tssrc/index.tsexport produces TS2305 and runtimenot a constructor; restoring it passes 5/5.Source-text anti-drift checks are secondary coverage; each finding's primary control is behavioral.
Explicit known reds
Mosaic Vitest — qualified-red, tracked by #1190
Exactly three
src/cli-smoke.spec.tsupdate-notice/stderr assertions fail, with 1528 other tests passing:production CLI emits one blocked JSON object for bare --sourceproduction CLI emits one blocked JSON object for bare --decisionsproduction CLI emits one blocked JSON object for bare --observationsNo fourth Vitest failure is attributed to #1190.
framework-shell — pre-existing host drift, tracked by #1191
One
invariant_r_unittest.pycase is red: its hardcoded measured Pi 0.84.1 conflicts with web1's dynamically resolved global Pi 0.80.7. A clean archive oforigin/next@216cd72226cd9ee17eea461cfe7cd0e010a22f02reproduces the identical single failure, and the working test is byte-identical to base. #1191 tracks both the immediate host drift and hardcoded-version lifecycle defect; #1184 owns the native Pi 0.84.1 pin/approval work.Base
Built directly on
origin/next@216cd72226cd9ee17eea461cfe7cd0e010a22f02with one commit; no independent rebase.Fixes #1182
Independent review of
55f2ec3dbc: APPROVE.Reviewed and probed the four fail-closed boundaries rather than relying on source shape alone.
FL-07/08: explicit non-empty values outside each closed enum throw typed errors before runtime/storage selection; only unset/empty values retain documented defaults. The Gateway boundary test correctly inverts the former invalid-to-local expectation. No denylist is used, so new unknown values fail without fixture enumeration.
FL-09: independently probed Node spawnSync outcomes: an unavailable executable produces error with null status; self-termination produces signal with null status; both are rejected in the production ordering before status propagation, and diagnostics disclose only fixed code/reason. I also tested the background-shell shape: a shim that successfully backgrounds a descendant and exits reports numeric status 0. That is not silently reclassified by this code; it is the child process's actual success status and lies outside the PR's claimed spawn-error/signal/missing-status conditions. No timeout assertion is used here.
FL-10: record failure returns before every runtime spawn route. Correlation authority is deleted before write and installed only after append succeeds; claudex overwrites any caller env launch ID with the newly recorded ID. Normal claude/codex/opencode/pi and normal/yolo claudex paths all cross the mandatory record boundary. Tests verify zero spawn and zero launch-ID propagation under a real filesystem write failure.
No test asserts credential/log leakage or preserves a permissive default.
git diff --checkpassed; exact-head CI is terminal green. No blocking findings.Independent review of
55f2ec3dbc: APPROVE.Reviewed and probed the four fail-closed boundaries rather than relying on source shape alone.
FL-07/08: explicit non-empty values outside each closed enum throw typed errors before runtime/storage selection; only unset/empty values retain documented defaults. The Gateway boundary test correctly inverts the former invalid-to-local expectation. No denylist is used, so new unknown values fail without fixture enumeration.
FL-09: independently probed Node spawnSync outcomes: an unavailable executable produces error with null status; self-termination produces signal with null status; both are rejected in the production ordering before status propagation, and diagnostics disclose only fixed code/reason. I also tested the background-shell shape: a shim that successfully backgrounds a descendant and exits reports numeric status 0. That is not silently reclassified by this code; it is the child process's actual success status and lies outside the PR's claimed spawn-error/signal/missing-status conditions. No timeout assertion is used here.
FL-10: record failure returns before every runtime spawn route. Correlation authority is deleted before write and installed only after append succeeds; claudex overwrites any caller env launch ID with the newly recorded ID. Normal claude/codex/opencode/pi and normal/yolo claudex paths all cross the mandatory record boundary. Tests verify zero spawn and zero launch-ID propagation under a real filesystem write failure.
No test asserts credential/log leakage or preserves a permissive default.
git diff --checkpassed; exact-head CI is terminal green. No blocking findings.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.