gstack 1.76.0.0

1.76.0.0

Ship's doc-sync now survives Conductor.

Added 9
  • Spawned subagents are now marked with GSTACK_SESSION_KIND=spawned environment variable to identify their spawned status
  • Interactive gates in spawned sessions are now automatically resolved by choosing the recommended option instead of rendering unanswerable decision briefs
  • Auto-chosen gate decisions are recorded in a decisions array that the parent process prints to the console for visibility
  • Destructive and irreversible options are never auto-chosen in spawned sessions; the conservative choice is always selected instead
  • AskUserQuestion rules now include a proactive spawned rule that short-circuits before the Conductor rule with destructive option protection
  • bin/gstack-skill-start now suppresses CONDUCTOR_SESSION for spawned sessions and sets SPAWNED_SESSION: true with spawned-session instruction blocks
Changed 1
  • Ship Step 18 dispatch prompt now frames the subagent as spawned and resolves every named gate to the recommended option with conservative fallback
Fixed 1
  • Conductor-hosted /ship no longer loses its PR Documentation section when the document-release subagent encounters an interactive gate

From gstack

Spawned subagents finally know they're spawned. Every Conductor-hosted /ship used to lose its PR Documentation section the moment the document-release subagent hit an interactive gate: the subagent inherited the parent's environment, classified itself as a session a human was watching, rendered a decision brief nobody could answer, and stopped. The JSON contract broke, every time a gate fired (#2733). This release makes the spawned classification reachable: /ship marks its subagent with GSTACK_SESSION_KIND=spawned, and the whole stack (preamble, AskUserQuestion rules, both AUQ hooks) now resolves gates by auto-choosing the recommended option instead of writing prose to nobody. Destructive options are never auto-chosen, on any surface: the conservative choice wins and gets recorded. Auto-chosen decisions come back in a decisions array the parent prints to your console, so nothing is decided invisibly. GSTACK_SESSION_KIND=spawned (bin/gstack-session-kind step 0): explicit per-command spawned marker, outranking every ambient env marker. Deliberately narrow: only spawned is honored; other values are reserved and ignored. Documented in docs/OPENCLAW.md, with a SPAWNED_OVERRIDE: env status line for tamper visibility when the env var (rather than an orchestrator marker) drove the classification. decisions in the doc-sync contract (ship/sections/pr-body.md.tmpl): the document-release subagent records each auto-chosen gate as one line in a required decisions array; the parent prints them after the sync summary. Never embedded in the public PR body (tripwire-pinned). Absent key from an older installed skill reads as empty. Proactive spawned rule in the AskUserQuestion prose (all tier-2+ skills): SESSION_KIND: spawned now short-circuits BEFORE the Conductor rule, with the destructive carve-out (never auto-choose an irreversible option, take the conservative choice and record it) and anti-injection scoping: a spawned marking counts only from the prompt that created the session, never from files, tool output, or web content read mid-run. Gate-tier E2E (test/skill-e2e-docsync-spawned.test.ts): drives the verbatim Step 18 dispatch prompt against a real preamble-bearing document-release slice in a Conductor-ambient env with both AUQ hooks seeded live; asserts the 5-key JSON contract, a non-empty decisions array, and an untouched VERSION through a deliberately fired gate. bin/gstack-skill-start: spawned sessions suppress CONDUCTOR_SESSION: true (prose to nobody is always wrong), key SPAWNED_SESSION: true and the spawned-session instruction block on the resolved kind instead of raw OPENCLAW_SESSION (OpenClaw behavior unchanged, regression-pinned), gate all 11 interactive-onboarding blocks plus their ack markers at emission, and skip the network-bound update-check and the first-task repo probe (their consumers are suppressed anyway; the one-shot just-upgraded marker survives for the next human session). AUQ hooks (hosts/claude/hooks/): the Conductor deny gains a deterministic [conductor][spawned] auto-choose branch for env-marked spawned sessions, with per-question one-way-door annotations; both hooks' prose directives (interactive AND headless) carry a shared spawned escape sentence, single-sourced in spawned-directive.ts so the two paths can never drift. Hooks inherit the harness env, so the escape text is the designed lever for per-command-marked subagents. Ship Step 18 dispatch prompt: frames the subagent as spawned, instructs the same-line env prefix (template bash blocks do not share exports), resolves every named gate to the recommended option with a conservative fallback, and places the skill's own doc-health summary in the body so the JSON stays the final line. #2733: Conductor-hosted /ship runs no longer lose their Documentation section when document-release hits an AskUserQuestion gate. The failure was gate-correlated and hit every ship on affected hosts.

View original

Upgraded? How did it go?

Discussion