Repository navigation
v1.91.92.0 feat(outside-voice): enforce codex_reviews consent in the send binaries, codex_effort setting, privacy disclosures (Wave 9 Lane C) - #3144
Merged
Conversation
…stamp --next) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…ort high|medium Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…-consent Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> # Conflicts: # CHANGELOG.md # VERSION # agents-digest/gstack-AGENTS.md # package.json
…-consent Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> # Conflicts: # CHANGELOG.md # VERSION # agents-digest/gstack-AGENTS.md # package.json
…n and the disabled sentence; drop the cap raises Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
|
😎 This pull request was merged. |
Contributor
E2E Evals: ✅ PASS119 executed, 0 reused rule/judge records | 0 manual accepted (unscored; no score-cache credit) | $93.13 rule/judge cost | reconcile exit: 0 Profile: pr / mode Derived dependents (scripts/pr-dependencies.ts):
Rule and judge shards
Fail-closed reconciliationSliced lane: planner → duration-packed executors → fail-closed report. Behavior cases run a pre-registered 3-trial panel (PASS at 2/3 with no contract violation); a PASS 2/3 is shown with its failed trial, never as a clean pass. Reused results retain their original provenance and expiry. |
This was referenced Oct 11, 2026
Closed
Closed
4 of 5 tasks
levi85
pushed a commit
to levi85/gstack
that referenced
this pull request
Oct 14, 2026
…send binaries, codex_effort setting, privacy disclosures (Wave 9 Lane C) (garrytan#3144) Outside-review consent (codex_reviews) is enforced in gstack-codex-probe run-with-timeout, gstack-claude-code, gstack-outside-voice run and the autoplan runner (not_run / consent_missing, exit 3; garrytan#3102). Codex reasoning effort resolves GSTACK_CODEX_EFFORT, then codex_effort, then each gate's default inside run-with-timeout --effort (D1-A; garrytan#3098, closes garrytan#2934). README and telemetry privacy disclosures corrected (garrytan#1081, garrytan#1080, garrytan#1150). Co-authored-by: Lockyer <135391289+Lockyer228@users.noreply.github.com> Co-authored-by: Lubos Buracinsky <159481718+lubosxyz@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Wave 9 Lane C. Outside-review consent (
codex_reviews) is now enforced by the binaries that send repository content, not by skill prose (#3102, plan D5). Codex reasoning effort becomes a setting with one precedence (D1-A; adopts #3098, closes #2934). The README and telemetry privacy disclosures now match what gstack actually does (#1081, #1080, #1150).Consent at the send (/design-review and /ship send code to Codex without asking #3102). These four senders read
codex_reviewsbefore any CLI starts:gstack-codex-probe run-with-timeoutgstack-claude-codegstack-outside-voice run/autoplanrunner (lib/autoplan-run.ts)When the value is
disabled, the config is unreadable, or the value is unknown, they refuse withnot_run/consent_missing(exit 3). The refusal line says what happened and why, gives the fix command and linksdocs/troubleshooting.md#outside-review-consent-missing; it comes from the newlib/gate-outcomes.tsrow.unsetmeans the default (enabled) and shows the one-time first-send notice.--user-invokedis passed only by/codexand/claude-code, where the user asked for the review by name. The shared TS reader islib/outside-consent.ts, with the bash twingstack-config get --stored <key>. Both printenabled|disabled|unset|unreadable(unreadable exits 2), and a test keeps them equal.Skill text. Every preflight reads
get --stored codex_reviews, and disabled or unreadable givesCODEX_MODE: disabled. The hard-coded_OUTSIDE_CFG=enabledin/shipdesign-lite and the other opt-in callers is gone. Each skill's preflight carries one shared sentence telling the agent to relay a send'sconsent_missingline. There is no per-invocation consent check in skill prose.Reasoning effort (D1-A).
run-with-timeout --effort <gate default>resolvesGSTACK_CODEX_EFFORT, thencodex_effort(newgstack-configkey, validated), then the gate default, and appends-c model_reasoning_effort="X". An invalid level stops before any Codex call./codex --xhighbecomes aGSTACK_CODEX_EFFORT=xhighprefix on the dispatch./speckeeps a pinnedmediuminside its 120 s budget.gstack-codex-probe check-effortremains as a no-call diagnostic.gstack-models list(and--jsoncodexEffort) shows the effective value, anddocs/model-policy.mdgains a "Reasoning effort" section.Privacy text (Undisclosed hourly GitHub network call in every skill preamble (update-check) #1081, Telemetry consent text says 'no repo names ever sent' but omits that they're recorded locally #1080, Session tracking and OPENCLAW_SESSION preamble not gated by telemetry config #1150). The README's Privacy & Telemetry section now covers:
skill-usage.jsonl, whose repo and branch are stripped before upload, and the fact that nothing is logged when telemetry is offconsent_missing)The
gstack-skill-starttelemetry prompt and thegstack-configheader now match.Call-site consent
run-with-timeout/gstack-claude-codecodex_reviewsCODEX_MODE: disabled; the send refusesconsent_missingif reached/autoplan(interactive andgstack-autoplan run)initRuncodex_reviewsdisabled,not_run,consent_missing; the native voice still runs/codex,/claude-coderun-with-timeout --user-invoked/gstack-claude-code --user-invokedcodex_reviews=disabled/office-hours(second opinion, sketch)gstack-claude-codecodex_reviews/design-review,/design-consultationgstack-claude-codecodex_reviews(previously "automatic, no opt-in needed")outside_status: disabled/shipdesign-litecodex_reviews(previously hard-coded enabled)/review,/shipadversarialcodex_reviewsgstack-outside-voice run(API runner)codex_reviews<out>.meta.json, printsOUTSIDE_STATUS: not_run reason=consent_missing, exits 3Behavior changes
codex_reviews=disablednow stops/shipdesign-lite and/design-review's outside voice. Both previously sent regardless.config.yaml, or an unknowncodex_reviewsvalue, now refuses outside sends (fail closed). It used to fall back to enabled.gstack-configthat fails to run, or exits 2 for an unreadable config, now reads asCODEX_MODE: disabled, and its fix line is shown. It previously fell back toenabled.consent_missingwhen refused. Callers that pass neither--user-invokednor a consenting config get no CLI launch.GSTACK_CODEX_EFFORT/codex_effortnow change the effort of every outside-review gate except/spec. Unset keeps today's defaults.gstack-config get --stored <key>is new. Plaingetis unchanged.Parity (no cap raised)
Every skill fits under its existing cap on the integrated tree (main 8fc9f2a). Three raises approved earlier in development (ship, plan-ceo-review, office-hours) were reverted after trimming. The preflight's consent read now sits in its
ifcondition, and the relay of a send'sconsent_missingline is folded into each caller's existing "Disabled ..." sentence.Test edits
test/outside-consent.test.ts,test/outside-send-boundary.test.ts(static check that no rendered skill on either host launchescodex exec|reviewor a headlessclaudeexcept through the consent-enforcing binaries),test/codex-effort.test.ts, and arun-with-timeout --effortcase intest/codex-probe-subcommands.test.ts. That case covers the env, then config, then default order turning--effort Xinto-c model_reasoning_effort="X", and that a bad level or a non-codex command never runs.test/gen-skill-docs.test.ts(branches correctly per skillName): the expectation for the literalmodel_reasoning_effort="high"|"medium"becomesrun-with-timeout --effort highfor plan-design-review and--effort mediumfor design-consultation, and each skill asserts the other value is absent. The literal is still checked where it is produced (the probe test above).test/claude-code-skill.test.tsandtest/host-config.test.ts: the runner-call pattern now includes--user-invoked.test/skill-validation.test.ts(adversarial in /review and /ship):reasoning_effort="high"becomesrun-with-timeout --effort high.--user-invoked/--effort <level>arguments: codex-hardening, codex-invocation-sites, codex-skill-isolation, model-role-invocation, outside-send-boundary, outside-voice-invocation, binding-template-drift, autoplan-dual-voice-evidence (plus its helper's command needle), run-in-background-guidance, outside-voice-preflight (/design-review and /ship send code to Codex without asking #3102 ship case), design-consultation-contract, gstack-config-key-locale (validator count) and spec-quality-gate-secret-sink.lib/claude-code-migration.ts(addslib/outside-consent.tstoCLAUDE_CODE_RUNTIME_FILES),claude-code/SKILL.md.tmpl(--user-invokedon its three runner calls) (no cap changes intest/helpers/carve-guards.ts).Contributor PRs
GSTACK_CODEX_EFFORTprecedence, thecheck-effortsubcommand with its validation and repair hint, and its probe tests. Its template contract (a per-blockcheck-effortcapture) is superseded byrun-with-timeout --effortto keep skill text small. Credit: CHANGELOG thanks plus aCo-authored-bytrailer.codex_effortsetting.GSTACK_CLAUDE_EFFORTis declined: the Claude runner takes no effort setting in the plan (D1-A), and adding a flag would override the CLI's own configuration. Credit: CHANGELOG thanks plus aCo-authored-bytrailer for the original diagnosis.Verification
bun run typecheckis clean, and thetypecheck:testratchet reports no new diagnostics.gstack-pregate --stage preflight --only secrets,strays,literalspasses.bun test test/parity-suite.test.tspasses 22/22.bun run test:ubicloud) at head76ef2bd7(merged with main 8fc9f2a, restamped 1.91.92.0): 17 shards, 1,202 files, 27,983 tests, 27,892 pass, 91 skip, 0 fail, no flaky retry. The VM was destroyed.619610c7, failed 2 tests that reproduce serially:test/claude-code-skill.test.ts(plan-review consultation) andtest/host-config.test.ts(Claude outside-voice golden). Both match"$CLAUDE_RUNNER" --cwd, and the approved--user-invokedchange toclaude-code/SKILL.md.tmplmoved that string. The two test patterns were updated inc9b646ab; 21 claude-code test files then gave 1517 pass, 0 fail.test/bootstrap-retention-shard.test.tsfailure passed on the serial retry and locally (4/4), and it was clean in the final run.Not verified