Skip to content

feat(safety-profile): lock flag values with locked-flags - #976

Closed
ronny-rentner wants to merge 10 commits into
openclaw:mainfrom
ronny-rentner:feat/safety-profile-locked-flags
Closed

feat(safety-profile): lock flag values with locked-flags#976
ronny-rentner wants to merge 10 commits into
openclaw:mainfrom
ronny-rentner:feat/safety-profile-locked-flags

Conversation

@ronny-rentner

Copy link
Copy Markdown
Contributor

Safety profiles can allow or deny commands, but nothing in them can fix a flag value. Sanitized output happens only if the caller passes --sanitize-content, and a flag that does take a value from the environment is still overridden by the command line. When that command line is written by a model rather than a person, neither is a setting an operator can rely on.

This adds a locked-flags mapping to the profile format. A locked flag is applied before the command runs, and setting it on the command line is an error rather than an override.

locked-flags:
  sanitize-content: true
  wrap-untrusted: true
  no-input: true

How it works. parseRaw reads locked-flags alongside allow/deny and keeps it out of command flattening; values may be bool, int or string. The generator emits bakedSafetyLockedFlag as a hashed switch with the same collision check as the rule matchers, so a locked flag name is no more patchable than a command rule. enforceLockedFlags runs beside enforceBakedSafetyProfile, applies each value through the flag's own parser, and rejects a command line that sets one. Locks apply per selected command, so a locked flag a command doesn't declare is silently inert.

Because a locked value can make a command reject a combination the caller never asked for, usage errors carry a note naming the locked flags and the profile. That's attached once in the error path, so no command carries profile knowledge.

Not a behaviour change. Profiles without locked-flags are unaffected, stock builds compile a stub returning "not locked", and readonly.yaml/agent-safe.yaml are untouched. locked-flags could not previously appear in a profile — an unknown top-level key was a parse error — so no existing profile changes meaning.

On the two new profiles. readonly-locked.yaml and agent-safe-locked.yaml are copies of their originals plus the locks above (and readonly: true on the read side, which also rejects a mutating request inside an allowed command). I added them as copies because I didn't know whether you want preset locked profiles shipped at all — they're easy to drop if the mechanism alone is what you want, or they could replace the existing presets instead of sitting beside them, if you'd rather the shipped agent profile be locked by default. That last option is a behaviour change for anyone building agent-safe, which is why I didn't do it. Note that locking sanitize-content makes gmail get --format raw unavailable, since that combination is rejected; both descriptions say so.

Proof — no mailbox or credentials involved. The lock check runs before account resolution, and the last command needs only an account string, failing at flag validation before any network call. m1 is a placeholder that is never used.

$ make build-safe PROFILE=safety-profiles/agent-safe-locked.yaml OUTPUT=bin/gog-agent-safe-locked
v0.35.0-11-gfee967bd-safe (fee967bd12b5 2026-08-10T16:51:09Z)
built bin/gog-agent-safe-locked with baked safety profile safety-profiles/agent-safe-locked.yaml

$ ./bin/gog-agent-safe-locked gmail get m1 --json --sanitize-content=false
flag --sanitize-content is locked by baked safety profile "agent-safe-locked"

$ ./bin/gog-agent-safe-locked gmail get m1 --json --wrap-untrusted=false
flag --wrap-untrusted is locked by baked safety profile "agent-safe-locked"

$ ./bin/gog-agent-safe-locked gmail get m1 --json --no-input=false
flag --no-input is locked by baked safety profile "agent-safe-locked"

$ ./bin/gog-readonly-locked gmail get m1 --json --readonly=false
flag --readonly is locked by baked safety profile "readonly-locked"

$ ./bin/gog-agent-safe-locked gmail get m1 --format raw --json --account a@b.com
--sanitize-content cannot be used with --format raw
note: --no-input, --sanitize-content, --wrap-untrusted locked by baked safety profile "agent-safe-locked"

The last one is the lock taking effect: nothing on that command line mentions --sanitize-content, and the refusal only fires when it is true.

Tests. Sixteen. internal/safetyprofile covers value parsing, non-scalar rejection, and locked flags not leaking into command rules. cmd/bake-safety-profile covers the emitted hashed lookup, that the flag name never appears verbatim, and that profiles without locks still compile. internal/cmd covers every spelling of setting a locked flag (including setting it to the value it already has), inertness on commands without the flag, stock builds ignoring locks, unparsable values failing loudly, an int lock reaching the command, and the note text. go test ./... passes except TestDocsWriteUpdate_FileInputErrors, which fails in my sandbox because /nonexistent returns permission denied instead of no such file; unrelated, reproducible with cat.

Docs. docs/safety-profiles.md gains a "Locked Flags" section covering syntax, semantics, and which flags not to lock, with --reply-all as the worked counter-example.

@clawsweeper

clawsweeper Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Aug 10, 2026
@clawsweeper

clawsweeper Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed August 10, 2026, 3:02 PM ET / 19:02 UTC.

ClawSweeper review

What this changes

The PR adds a locked-flags safety-profile mapping that fixes selected CLI flag values, rejects overrides, and adds locked presets, documentation, and tests.

Merge readiness

⚠️ Needs maintainer review before merge - 4 items remain

Keep open: the prior blockers are addressed, but false-valued json or plain locks are currently treated as enabled locked output modes and can reject or suppress a valid opposing mode.

Priority: P2
Reviewed head: b3a42d56a2b3a1b6cd4855202b3c7af926f8c048
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Real-command proof is strong and earlier findings are addressed, but the false-valued output-lock case remains a merge blocker.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (terminal): The PR description and follow-up comment provide after-fix terminal evidence for override rejection and locked output-mode behavior without credentials or network access.
Patch quality 🦐 gold shrimp (3/6) Security review found an item that needs attention.

Verification

Check Result Evidence
Real behavior Verified Sufficient (terminal): The PR description and follow-up comment provide after-fix terminal evidence for override rejection and locked output-mode behavior without credentials or network access.
Evidence reviewed 4 items False output locks are misclassified: The resolver treats the presence of a lock as a locked output mode, irrespective of the parsed boolean value. A json: false lock therefore rejects --plain and clears GOG_PLAIN; the symmetric plain: false case clears JSON.
Documented value contract: The PR documents boolean, integer, and string locked values, so false-valued booleans are supported input rather than invalid profile data.
Prior blockers addressed: The updated head now validates locked names and rejects locks for --home and parser-required flags before enforcing values.
Findings 1 actionable finding [P2] Respect false-valued output locks
Security Needs attention False locks act as enabled output locks: The precedence resolver checks whether a flag name is locked rather than whether the lock evaluates true, changing the policy that profiles with false-valued output flags actually enforce.

How this fits together

Safety profiles compile command restrictions into gog binaries before commands execute. This change injects profile-controlled flag values after parsing and before output-mode resolution and command execution.

flowchart LR
A[Safety profile YAML] --> B[Profile generator]
B --> C[Compiled gog binary]
D[CLI arguments and environment] --> E[Command parser]
C --> F[Locked-flag enforcement]
E --> F
F --> G[Output-mode resolution]
G --> H[Command execution]
Loading

Decision needed

Question Recommendation
Should the new agent-safe-locked and readonly-locked preset profiles ship alongside the existing unlocked presets? Ship optional locked presets: Keep the new profiles alongside existing presets so current builds retain their behavior while operators can opt into locked safety defaults.

Why: The mechanism is a new policy surface, and the PR explicitly leaves whether to ship the two new presets as a maintainer choice.

Before merge

  • Respect false-valued output locks (P2) - A json: false lock still makes jsonLocked true, so --plain is rejected and GOG_PLAIN is cleared even though the profile only fixed JSON off; plain: false has the symmetric effect on JSON. Base competing-mode handling on the parsed locked boolean value and add coverage for both false cases.
  • Resolve security concern: False locks act as enabled output locks - The precedence resolver checks whether a flag name is locked rather than whether the lock evaluates true, changing the policy that profiles with false-valued output flags actually enforce.
  • Resolve merge risk (P1) - A custom profile that locks json: false or plain: false can alter an otherwise valid output selection, contrary to the documented fixed-value semantics.

Findings

  • [P2] Respect false-valued output locks — internal/cmd/root.go:423-437
  • [medium] False locks act as enabled output locks — internal/cmd/root.go:423
Agent review details

Security

Needs attention: False-valued output locks are enforced as enabled modes, so this security-policy feature needs a narrow correction before merge.

Review metrics

Metric Value Why it matters
Runtime versus tests runtime +256/-14, tests +441 The feature’s focused regression coverage exceeds its runtime-code growth.
Shipped preset profiles 2 added, +720 lines The two copied policy profiles are the portion requiring an explicit product decision.

Merge-risk options

Maintainer options:

  1. Respect false-valued output locks (recommended)
    Add tests for false-valued JSON and plain locks, then apply competing-mode precedence only when the locked mode is true.

Technical review

Best possible solution:

Resolve output-mode conflicts from the enforced boolean values so false locks prevent only their own flag and leave the opposite mode available.

Do we have a high-confidence way to reproduce the issue?

Yes, from source: a profile with locked-flags: {json: false} followed by --plain version reaches the new resolver, which treats the false JSON lock as an enabled mode conflict.

Is this the best way to solve the issue?

No; output precedence must distinguish a true lock from a false lock while retaining explicit-argument rejection for genuinely enabled locked modes.

Full review comments:

  • [P2] Respect false-valued output locks — internal/cmd/root.go:423-437
    A json: false lock still makes jsonLocked true, so --plain is rejected and GOG_PLAIN is cleared even though the profile only fixed JSON off; plain: false has the symmetric effect on JSON. Base competing-mode handling on the parsed locked boolean value and add coverage for both false cases.
    Confidence: 0.97

Overall correctness: patch is incorrect
Overall confidence: 0.97

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 71c6c1e63787.

Labels

Label justifications:

  • P2: A bounded output-mode defect should be corrected before this otherwise useful feature merges.
  • merge-risk: 🚨 compatibility: False-valued locks currently suppress an existing valid output-mode choice.
  • merge-risk: 🚨 security-boundary: The PR changes compiled controls intended to keep automated callers from disabling safety behavior.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (terminal): The PR description and follow-up comment provide after-fix terminal evidence for override rejection and locked output-mode behavior without credentials or network access.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR description and follow-up comment provide after-fix terminal evidence for override rejection and locked output-mode behavior without credentials or network access.

Evidence

Security concerns:

  • [medium] False locks act as enabled output locks — internal/cmd/root.go:423
    The precedence resolver checks whether a flag name is locked rather than whether the lock evaluates true, changing the policy that profiles with false-valued output flags actually enforce.
    Confidence: 0.97

Acceptance criteria:

  • [P1] go test ./internal/cmd -run 'TestLockedFlag'.
  • [P1] make test.

What I checked:

  • False output locks are misclassified: The resolver treats the presence of a lock as a locked output mode, irrespective of the parsed boolean value. A json: false lock therefore rejects --plain and clears GOG_PLAIN; the symmetric plain: false case clears JSON. (internal/cmd/root.go:423, b3a42d56a2b3)
  • Documented value contract: The PR documents boolean, integer, and string locked values, so false-valued booleans are supported input rather than invalid profile data. (docs/safety-profiles.md:195, b3a42d56a2b3)
  • Prior blockers addressed: The updated head now validates locked names and rejects locks for --home and parser-required flags before enforcing values. (internal/cmd/safety_profile.go:71, b3a42d56a2b3)
  • Current-main ownership history: Peter Steinberger introduced the current CLI output-mode behavior in the output predictability work and is the dominant recent contributor to the root CLI path. (internal/cmd/root.go:44, e90afe76786b)

Likely related people:

  • Peter Steinberger: Introduced the current output-mode behavior and authored the runtime read-only safety work; history shows 74 commits touching the root CLI path. (role: recent CLI and safety-area contributor; confidence: high; commits: e90afe76786b, 4cac149d75a7; files: internal/cmd/root.go, internal/cmd/safety_profile.go)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Add focused tests for json: false and plain: false with explicit and environment-provided opposing modes.
  • Change output precedence so only a true locked output flag suppresses or conflicts with the other mode.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (2 earlier review cycles)
  • reviewed 2026-08-10T17:00:32.541Z sha fee967b :: found issues before merge. :: [P2] Preserve locked output modes through precedence resolution
  • reviewed 2026-08-10T18:12:51.324Z sha 22e8ed9 :: found issues before merge. :: [P1] Mark injected locks as effectively provided | [P1] Reject unknown locked flag names during profile validation | [P2] Reject or initialize locks needed before runtime setup | [P2] Do not accept locks for parser-required flags

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fee967bd12

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

if flagProvided(kctx, flag.Name) {
return usagef("flag --%s is locked by baked safety profile %q", flag.Name, bakedSafetyProfileName())
}
if err := flag.Value.Parse(kong.ScanFromTokens(kong.Token{Type: kong.FlagValueToken, Value: value}), flag.Value.Target); err != nil {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Treat injected locked flags as provided

Parsing the locked value directly into the target does not add the flag to kctx.Path, so flagProvided() remains false. Commands whose behavior depends on presence therefore silently ignore the lock: for example, locking contacts-only: true for gmail vacation update sets the struct field but internal/cmd/gmail_vacation.go never adds restrict_to_contacts to the update, and contacts/calendar/task update handlers have the same pattern. Record injected locks as provided or make the presence checks aware of them.

Useful? React with 👍 / 👎.

Comment on lines +139 to +144
for name, raw := range entries {
flag := strings.TrimSpace(strings.ToLower(name))
if flag == "" {
return fmt.Errorf("empty flag name")
}
switch typed := raw.(type) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reject locked flag names that do not exist

Any non-empty name is accepted and baked without checking it against the CLI model, while runtime enforcement only queries locks for flags in kctx.Flags(). A typo such as readonlly: true therefore builds successfully and is ignored on every invocation, potentially leaving mutations enabled even though the profile appears to enforce read-only operation. Validate that each locked name matches at least one canonical CLI flag while still allowing per-command flags to be absent from unrelated commands.

Useful? React with 👍 / 👎.

Comment thread internal/cmd/root.go
Comment on lines +185 to +186
if err = enforceLockedFlags(kctx); err != nil {
return reportEarlyError(runtimeIO.Err, err)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Apply a locked home before resolving runtime paths

When a profile locks home and the caller omits --home, this hook updates cli.Home only after preScanHomeArg() and bindRuntimeLayoutResolver() have already selected the default config/data roots. Commands consequently keep reading the user's normal configuration and credentials rather than the locked directory, despite the flag target showing the locked value. The locked home must participate in layout binding before the resolver is constructed, or this flag should be rejected as unsupported.

Useful? React with 👍 / 👎.

Comment thread internal/cmd/root.go
Comment on lines +185 to +186
if err = enforceLockedFlags(kctx); err != nil {
return reportEarlyError(runtimeIO.Err, err)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Apply locked values before required-flag validation

Locked values are injected only after parser.Parse(args) has completed, so a profile cannot supply a flag tagged required:"": Kong rejects the command as missing that flag before this code runs, while explicitly supplying it is also rejected as an override. Thus locks such as title, parent, or state-file can never satisfy commands that require them, contrary to the stated behavior that callers need not pass locked values. Inject locks before parse validation or reject required flags during profile generation.

Useful? React with 👍 / 👎.

…locked json or plain wins over the competing mode
… a locked one, override only environment defaults
@clawsweeper clawsweeper Bot added merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Aug 10, 2026
@ronny-rentner

Copy link
Copy Markdown
Contributor Author

Fixed in fd24ccc7 and 22e8ed95.

Precedence now runs after enforceLockedFlags, and a locked mode outranks the competing one. Reordering alone wasn't enough: a locked flag isn't "provided", so --plain would still have cleared a locked json.

One behaviour decision worth surfacing — the competing flag is treated by origin:

  • explicit --plain against a locked json is refused, since the caller asked for output the profile forbids
  • GOG_PLAIN is overridden silently, since an environment default is a preference, not a request about this invocation

Two explicit modes remain a conflict error, as before.

Proof, with a throwaway profile locking only json (neither shipped profile locks an output mode):

name: json-locked
locked-flags:
  json: true
version: true
$ make build-safe PROFILE=json-locked.yaml OUTPUT=bin/gog-json-locked
v0.35.0-13-g22e8ed95-safe (22e8ed956367 2026-08-10T18:05:08Z)
built bin/gog-json-locked with baked safety profile json-locked.yaml

$ ./bin/gog-json-locked --plain version
flag --plain conflicts with --json, locked by baked safety profile "json-locked"

$ GOG_PLAIN=1 ./bin/gog-json-locked version
{
  "commit": "22e8ed956367",

Both previously failed with invalid output mode (cannot combine --json and --plain).

Four tests cover the CLI and environment combinations; I confirmed they're not vacuous by restoring the old ordering and watching them fail. Docs updated to state the environment-versus-explicit split.

Not guarded, deliberately: a profile locking both json and plain builds and then fails on every invocation. Catching that at bake time would mean the generator hard-coding which flags are mutually exclusive — happy to add it if you'd prefer.

The two P1s are unchanged and on your side; the PR description lists the preset options.

…s that match nothing, and refuse locks on --home or required flags
@clawsweeper clawsweeper Bot added merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Aug 10, 2026
@ronny-rentner

Copy link
Copy Markdown
Contributor Author

All four addressed in b3a42d56.

PresenceflagProvided now counts a locked flag as given, so presence-sensitive commands (calendar_edit.go and similar) include the locked value in their patch requests. A separate flagOnCommandLine keeps the narrower question for lock enforcement and output-mode precedence; without the split, enforcement would see its own lock as an override and reject every invocation.

Unknown names — the generator emits a count alongside the hashed lookup, and a pre-enforcement pass walks the CLI model counting matches. A name matching nothing refuses to run:

$ ./bin/gog-typo version
baked safety profile "typo" locks 1 flag(s) but only 0 exist; check the locked-flags names

$ strings bin/gog-typo | grep -c readonlly
0

The count rather than a name list is deliberate: emitting the names would have put them in the binary as patchable text and undone the hashing the rule matchers rely on.

One difference from the finding as written: this refuses at first invocation rather than during profile validation, so a typo still builds. Validating at bake time would mean the generator constructing the Kong model to know which flags exist — happy to do it if you want the check there.

--home and required flags — refused, taking the "reject as unsupported" option, since both are consumed before locks run: --home by the pre-parse layout scan that picks config and credential roots, required flags by Kong's own validation.

Six tests added, docs updated with the behaviour and the three refusals.

@steipete

Copy link
Copy Markdown
Collaborator

Maintainer verdict: LAND, using the hardened maintainer stack at openclaw/gogcli:triage/t8-pr976 (6d30196f). No contributor revision is requested.

The core idea is sound, but a generic bool/int/string lock surface was too broad for a security boundary. The landing stack narrows locked-flags to boolean policy switches, which covers the motivating controls (sanitize-content, wrap-untrusted, no-input, and readonly) without compiling arbitrary paths, account names, tokens, or other values into policy binaries. It also removes the two copied preset files to avoid permanent policy drift; operators can copy an existing preset and add the few locks they need.

The stack additionally fixes false-valued output locks, makes GOG_AUTO_JSON subordinate to a lock, validates unknown/required/non-boolean/pre-parse flags before execution, rejects help, version, and home locks, preserves aliases, and keeps stock builds unchanged. Contributor authorship is preserved in the stack and maintainer commits carry Ronny's co-author credit.

Proof run on the final stack:

$ make test
ok github.com/openclaw/gogcli/internal/cmd 76.889s
... all Go and Node tests passed

$ GOLANGCI_LINT_CACHE=/private/tmp/gogcli-t8-golangci-cache make lint
0 issues.

$ make docs-check
docs coverage ok: 709 command pages, 27 feature pages

$ ./gog-lock-json-true version
{ "commit": "a16e9334583b", ... }

$ ./gog-lock-json-true --json=false version
flag --json is locked by baked safety profile "live-json-true"
exit 2

$ ./gog-lock-json-true --machine=false version
flag --json is locked by baked safety profile "live-json-true"
exit 2

$ GOG_JSON=1 ./gog-lock-json-false version
v0.35.0-16-ga16e9334-dirty-safe (...)

$ GOG_AUTO_JSON=1 ./gog-lock-json-false version
v0.35.0-16-ga16e9334-dirty-safe (...)

$ make build-safe PROFILE=live-lock-string.yaml OUTPUT=bin/gog-lock-string
parse profile: locked-flags: json: expected boolean value, got string
exit 2

$ make build-safe PROFILE=live-lock-nonbool.yaml OUTPUT=bin/gog-lock-nonbool
baked safety profile "live-nonbool" locks --format, but only boolean flags can be locked
exit 2

Final structured review found no accepted/actionable P0/P1 findings (confidence 0.94). The original PR CI failure was the reported staticcheck selector issue; the landing stack fixes it and the local lint gate is clean.

@ronny-rentner
ronny-rentner deleted the feat/safety-profile-locked-flags branch August 11, 2026 04:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants