mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-20 11:52:20 +02:00
docs(openclaw): document the GSTACK_SESSION_KIND override; wire session-kind into paid selectors (#2733)
OPENCLAW.md's spawned-session section now covers the explicit per-command marker, its deliberate spawned-only narrowness, the /ship Step 18 usage, the destructive carve-out, onboarding-block suppression, and the hook env-blindness caveat. bin/gstack-session-kind and the shared spawned-directive module join the conductor-prose and auto-decide-preserved selector dep lists (session-kind previously appeared in no touchfiles entry — editing it alone triggered no paid E2E). TODOS.md gains the plan-tune capture follow-up for spawned auto-choices. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
85e4597b48
commit
46ba23c512
@@ -2668,6 +2668,18 @@ Shipped as v0.5.0 on main. Includes `/plan-design-review` (report-only design au
|
|||||||
|
|
||||||
## Document-Release
|
## Document-Release
|
||||||
|
|
||||||
|
### Spawned-session auto-choices are invisible to /plan-tune
|
||||||
|
|
||||||
|
**What:** Capture auto-chosen decisions from spawned sessions (OPENCLAW_SESSION or GSTACK_SESSION_KIND=spawned) into `gstack-question-log` so `/plan-tune` learning sees them.
|
||||||
|
|
||||||
|
**Why:** In spawned sessions the model never calls AskUserQuestion (it auto-chooses the recommended option per the spawned-session block), so the PostToolUse capture hook never fires and no prose brief is ever logged — every gate decision made inside a /ship Step 18 document-release subagent is missing from the question-tuning corpus.
|
||||||
|
|
||||||
|
**Context:** #2733 made spawned sessions reachable from Claude Code subagents (every Conductor-hosted /ship now produces one). The subagent reports auto-chosen decisions in the JSON contract's `decisions` array (user-visible in the ship console), but nothing writes them to `~/.gstack/` question analytics. Start from the spawned-session instruction block in `bin/gstack-skill-start` — add a "log each auto-chosen decision with bin/gstack-question-log" sentence and a `source` value distinguishing auto-chosen from human-answered so tuning never trains on machine picks as if a human made them.
|
||||||
|
|
||||||
|
**Effort:** S
|
||||||
|
**Priority:** P3
|
||||||
|
**Depends on:** #2733 fix (GSTACK_SESSION_KIND=spawned marker) landing.
|
||||||
|
|
||||||
### Auto-invoke /document-release from /ship — SHIPPED
|
### Auto-invoke /document-release from /ship — SHIPPED
|
||||||
|
|
||||||
Shipped in v0.8.4; redesigned twice since. Current design (v0.18.2.0+, carved in
|
Shipped in v0.8.4; redesigned twice since. Current design (v0.18.2.0+, carved in
|
||||||
|
|||||||
+32
-2
@@ -116,12 +116,42 @@ No gstack infrastructure (no browse, no telemetry, no preamble).
|
|||||||
|
|
||||||
When Claude Code runs inside a session spawned by OpenClaw, the `OPENCLAW_SESSION`
|
When Claude Code runs inside a session spawned by OpenClaw, the `OPENCLAW_SESSION`
|
||||||
environment variable should be set. gstack detects this and adjusts:
|
environment variable should be set. gstack detects this and adjusts:
|
||||||
- Skips interactive prompts (auto-chooses recommended options)
|
- Skips interactive prompts (auto-chooses recommended options; destructive or
|
||||||
- Skips upgrade checks and telemetry prompts
|
irreversible options are never auto-chosen — the conservative choice wins
|
||||||
|
and gets recorded in the completion report)
|
||||||
|
- Suppresses interactive-onboarding instruction blocks at emission (upgrade
|
||||||
|
checks, telemetry prompts, feature discovery, routing injection, tips), so
|
||||||
|
one-time prompts survive intact for the next human session
|
||||||
|
- Suppresses the Conductor prose signal (`CONDUCTOR_SESSION: true`) — a
|
||||||
|
spawned session inside a Conductor workspace auto-chooses instead of
|
||||||
|
rendering prose to nobody
|
||||||
- Focuses on task completion and prose reporting
|
- Focuses on task completion and prose reporting
|
||||||
|
|
||||||
Set the env var in sessions_spawn: `env: { OPENCLAW_SESSION: "1" }`
|
Set the env var in sessions_spawn: `env: { OPENCLAW_SESSION: "1" }`
|
||||||
|
|
||||||
|
### Explicit override: GSTACK_SESSION_KIND
|
||||||
|
|
||||||
|
`GSTACK_SESSION_KIND=spawned` is the explicit per-command marker for the same
|
||||||
|
classification, outranking every ambient env marker (including
|
||||||
|
`OPENCLAW_SESSION` and `GSTACK_HEADLESS`). It exists because Claude Code
|
||||||
|
subagents inherit the parent session's env byte-for-byte (#2733) — a
|
||||||
|
dispatching skill marks its subagent by prefixing the preamble invocation on
|
||||||
|
the same command line:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
GSTACK_SESSION_KIND=spawned "$_SS" --skill "document-release" ...
|
||||||
|
```
|
||||||
|
|
||||||
|
gstack itself uses this: `/ship` Step 18 dispatches the `/document-release`
|
||||||
|
subagent with this prefix so its interactive gates auto-choose instead of
|
||||||
|
prose-stopping. Deliberately narrow: only `spawned` is honored — `headless`
|
||||||
|
already has `GSTACK_HEADLESS`, and letting an env var force `interactive`
|
||||||
|
over CI markers would be a misclassification footgun. Empty or other values
|
||||||
|
are reserved and ignored (fall through to ambient detection). Note that hook
|
||||||
|
processes inherit the harness env, so a per-command prefix never reaches
|
||||||
|
PreToolUse/PostToolUse hooks — the hook texts carry a spawned escape sentence
|
||||||
|
for that topology (`hosts/claude/hooks/spawned-directive.ts`).
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
For OpenClaw users: tell your OpenClaw agent "install gstack for openclaw."
|
For OpenClaw users: tell your OpenClaw agent "install gstack for openclaw."
|
||||||
|
|||||||
@@ -119,12 +119,12 @@ export const E2E_TOUCHFILES: Record<string, string[]> = {
|
|||||||
// written a never-ask preference, AUQ should still auto-decide rather than
|
// written a never-ask preference, AUQ should still auto-decide rather than
|
||||||
// surfacing the question. Touches the question-tuning + preference
|
// surfacing the question. Touches the question-tuning + preference
|
||||||
// infrastructure plus the resolvers that own the AUTO_DECIDE preamble.
|
// infrastructure plus the resolvers that own the AUTO_DECIDE preamble.
|
||||||
'auto-decide-preserved': ['bin/gstack-skill-start', 'bin/gstack-skill-end', 'scripts/resolvers/question-tuning.ts', 'scripts/resolvers/preamble/generate-ask-user-format.ts', 'scripts/resolvers/preamble/generate-preamble-bash.ts', 'scripts/resolvers/preamble/generate-completion-status.ts', 'plan-ceo-review/**', 'bin/gstack-question-preference', 'bin/gstack-config', 'bin/gstack-slug', 'hosts/claude/hooks/question-preference-hook.ts', 'lib/is-conductor.ts', 'test/helpers/claude-pty-runner.ts', 'test/skill-e2e-auto-decide-preserved.test.ts'],
|
'auto-decide-preserved': ['bin/gstack-skill-start', 'bin/gstack-skill-end', 'bin/gstack-session-kind', 'scripts/resolvers/question-tuning.ts', 'scripts/resolvers/preamble/generate-ask-user-format.ts', 'scripts/resolvers/preamble/generate-preamble-bash.ts', 'scripts/resolvers/preamble/generate-completion-status.ts', 'plan-ceo-review/**', 'bin/gstack-question-preference', 'bin/gstack-config', 'bin/gstack-slug', 'hosts/claude/hooks/question-preference-hook.ts', 'hosts/claude/hooks/spawned-directive.ts', 'lib/is-conductor.ts', 'test/helpers/claude-pty-runner.ts', 'test/skill-e2e-auto-decide-preserved.test.ts'],
|
||||||
|
|
||||||
// Conductor → prose decision brief (Conductor signal makes prose the default;
|
// Conductor → prose decision brief (Conductor signal makes prose the default;
|
||||||
// the PreToolUse hook denies the flaky tool). Touches the resolver that owns
|
// the PreToolUse hook denies the flaky tool). Touches the resolver that owns
|
||||||
// the Conductor rule, the preamble signal, the hook, and the detection helper.
|
// the Conductor rule, the preamble signal, the hook, and the detection helper.
|
||||||
'conductor-prose': ['bin/gstack-skill-start', 'bin/gstack-skill-end', 'scripts/resolvers/preamble/generate-ask-user-format.ts', 'scripts/resolvers/preamble/generate-preamble-bash.ts', 'scripts/resolvers/preamble.ts', 'plan-eng-review/**', 'hosts/claude/hooks/question-preference-hook.ts', 'lib/is-conductor.ts', 'test/helpers/claude-pty-runner.ts', 'test/skill-e2e-conductor-prose.test.ts'],
|
'conductor-prose': ['bin/gstack-skill-start', 'bin/gstack-skill-end', 'bin/gstack-session-kind', 'scripts/resolvers/preamble/generate-ask-user-format.ts', 'scripts/resolvers/preamble/generate-preamble-bash.ts', 'scripts/resolvers/preamble.ts', 'plan-eng-review/**', 'hosts/claude/hooks/question-preference-hook.ts', 'hosts/claude/hooks/spawned-directive.ts', 'lib/is-conductor.ts', 'test/helpers/claude-pty-runner.ts', 'test/skill-e2e-conductor-prose.test.ts'],
|
||||||
|
|
||||||
// Real-PTY E2E batch (#6 new tests on the harness).
|
// Real-PTY E2E batch (#6 new tests on the harness).
|
||||||
// Each one tests behavior the SDK harness can't observe (rendered TTY,
|
// Each one tests behavior the SDK harness can't observe (rendered TTY,
|
||||||
|
|||||||
Reference in New Issue
Block a user