From 38b8b617956daa95a7b71afed6e116f144efcd3f Mon Sep 17 00:00:00 2001 From: Gurney Buchanan Date: Wed, 21 Oct 2026 14:27:20 -0400 Subject: [PATCH] Default the init full-permission consent to Yes, with a sharper warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The consent question defaulted to No, but No is the choice that breaks the product: the harness's skills cannot run unattended without full permission, so every run and flow fails closed on the first permission request. New users hit the wizard first and had no signal that No means "most workflows will not complete." The confirm now highlights Yes as the recommended default, and its description warns explicitly that runs and flows (audit → triage → patch → verify) will not complete without it. Doctor's scoped-mode message carries the same warning. Headless `init --yes` still defaults to No — silent consent without a human reading the warning is the one path that stays opt-in via --full-permission. 💘 Generated with Crush Assisted-by: Crush:rits/zai-org/glm-5-3 --- CHANGELOG.md | 4 ++++ internal/bootstrap/doctor.go | 2 +- internal/tui/init.go | 10 +++++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cac3637..672c273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,3 +105,7 @@ Initial implementation. — state, usage and the last dozen journal entries, printed and gone. A flow peek shows the stage chain and recurses into the current stage's run. +- The init wizard's full-permission confirm now defaults to Yes (the + recommended choice) and its warning spells out that runs and flows + (audit → triage → patch → verify) fail closed without it; doctor's + scoped-mode message says the same. diff --git a/internal/bootstrap/doctor.go b/internal/bootstrap/doctor.go index 93e7fdc..9df004a 100644 --- a/internal/bootstrap/doctor.go +++ b/internal/bootstrap/doctor.go @@ -42,7 +42,7 @@ func Doctor(ctx context.Context, state *State, log LogFn) (*DoctorReport, error) if state.FullPermission { add("permission-mode", true, "full (consented at init): harnesses run with all tools auto-approved") } else { - add("permission-mode", true, "scoped (fail-closed): permission requests abort runs with exit 2 — the harness's skills need `traust-cli init --full-permission`") + add("permission-mode", true, "scoped (fail-closed): permission requests abort runs with exit 2 — skills and flows (audit → triage → patch → verify) need `traust-cli init --full-permission`") } // Traust checkout + venv. diff --git a/internal/tui/init.go b/internal/tui/init.go index aa7847d..dcd06e0 100644 --- a/internal/tui/init.go +++ b/internal/tui/init.go @@ -24,6 +24,9 @@ func RunInitWizard(defaultWorkspace, defaultForge string, detected []string, def Ref: "latest", ToolchainProfile: "none", Harness: defaultHarness, + // Full permission is the recommended default: the harness's skills + // cannot run unattended without it, so the confirm highlights Yes. + FullPermission: true, } harnessOptions := []huh.Option[string]{} @@ -73,9 +76,10 @@ func RunInitWizard(defaultWorkspace, defaultForge string, detected []string, def ), huh.NewGroup( huh.NewConfirm(). - Title("Run skills with full permissions?"). - Description("The traust harness's skills REQUIRE unattended tool use (bash, file writes) — "+ - "without full permission they fail closed on the first permission request. "+ + Title("Run skills with full permissions? (recommended)"). + Description("The traust harness's skills REQUIRE unattended tool use (bash, file writes). "+ + "WARNING: without full permission, runs and flows (audit → triage → patch → verify) "+ + "fail closed on the first permission request — most workflows will not complete. "+ "With it, your harness runs with all tools auto-approved "+ "(claude --dangerously-skip-permissions, crush --yolo, codex --dangerously-bypass-approvals-and-sandbox). "+ "S9 isolation still applies: agents run from the harness root and never load the audit target's configuration.").