Skip to content

fix(config): save config changes into the nested $include file that owns them - #116108

Merged
steipete merged 17 commits into
openclaw:mainfrom
sasan1200:feat/config-include-write-through
Sep 7, 2026
Merged

steipete merged 17 commits into
openclaw:mainfrom
sasan1200:feat/config-include-write-through

Conversation

@sasan1200

@sasan1200 sasan1200 commented Jul 29, 2026 •

Copy link
Copy Markdown
Contributor

Closes #116107

What Problem This Solves

Fixes an issue where users split configuration into nested $include fragments and config commands or doctor --fix cannot save changes to the owning file. The old writer recognized only top-level include ownership and correctly refused to flatten nested fragments into the root.

Why This Change Was Made

Config writes and Doctor share one resolver that selects the deepest sole include owner. It accounts for every logical owner of the canonical target, including filesystem aliases and merged includes, so updating one subtree cannot silently alter another. The writer revalidates captured include targets and contents around persistence and after reload, with conditional rollback if an intermediate file changes. Current-main authority checks and roster projection order are preserved.

Doctor omits root wizard metadata for an include-only repair and records refused persistence accurately. Root-owned keyed-agent sibling additions preserve existing include pointers. The exported ConfigIncludeOwnership.hasArrayAncestor remains optional, with absence meaning false.

The maintainer approved this as a feature-class change on September 6, including positive production growth. No new config option, dependency, schema, protocol, or multi-file write mechanism is introduced. The mainline conflict was resolved with a merge so Sasan's original commits and authorship remain intact, as required by the native landing ancestry gate.

Compatibility review: existing authored config formats and canonical keys are retained. hasArrayAncestor is optional snapshot metadata, so existing callers that omit it remain valid. Existing sole-owner top-level writes remain covered by the focused suite. Shared physical targets now intentionally refuse writes that could alter another logical owner; operators can edit those files directly or give each subtree its own fragment.

Stored-data review: this adds no SQLite schema, persisted config key, or new migration transform. Existing Doctor migrations now persist their already-canonical result in the owning fragment. The nested sandbox.perSession to sandbox.scope fixture proves that upgrade repair with root and intermediate bytes preserved; the companion fixture proves mixed-owner repairs are refused without changing authored files. The maintainer's September 6 feature approval covers this persistence capability.

User Impact

Eligible nested fragments receive their own changes while root and ancestor files retain their authored bytes. Root includes, array and merged ownership, sibling overrides, shared physical targets, external write targets, and mutations spanning multiple owners remain refused. Concurrent include-graph changes cannot be reported as a successful write to an inactive fragment.

Thanks to @sasan1200 (Sasan Sotoodehfar) for the original implementation.

Evidence

  • Candidate head: 80a755a.
  • Delta against the current-main merge parent: production +597/-209 (net +388), tests/support +1753/-53 (net +1700), docs +40/-13 (net +27), other +1/-2. The earlier +313 production delta became +337 against newer main; the two ownership repairs add a further 51 lines.
  • Fresh independent Codex review: no actionable P0/P1/P2 findings across the complete candidate delta. Runtime proof is recorded separately below.
  • git diff --check and focused formatting passed.
  • Ownership regression proof: all five intended cases failed on the conflict-resolved pre-repair source, while the unchanged delegation control passed. With the repair restored, all 100 focused tests across src/config/mutate.test.ts, src/config/include-write-boundary.test.ts, and src/commands/doctor-config-flow.include-refusal.test.ts passed on Testbox. This includes the real Doctor write-stage repair with root and intermediate files byte-preserved.
  • Testbox run: https://github.com/openclaw/openclaw/actions/runs/34079097662 . The driver fetched and verified production head 2d85efcc8e6f7b0cba4d66fec21a0a2cdd219bb2 and applied the exact test-only follow-up now committed as 80a755a50d998e71fa59896d799a9f172dd53344; its test-file SHA-256 matches the committed file. No other source files differ. The successful command exit/timing record owns this proof; stopping the leased runner can mark the linked Actions workflow cancelled.
  • Initial local-to-Testbox sync attempts failed before tests executed. The successful focused proof used a small synthetic driver and fetched the pinned source directly on Testbox.
  • Changed-file gate: pnpm check:changed --timed -- <all 33 PR paths> passed on the same Testbox candidate, including core and test types, lint, baseline guards, and import cycles. The complete proof driver exited 0..
  • Exact-head CI: https://github.com/openclaw/openclaw/actions/runs/34080229268 is green on 80a755a50d998e71fa59896d799a9f172dd53344, after one unchanged-target rerun of a Gateway mock-binding failure outside the fragment worker. The earlier candidate's three fixture failures were corrected by the reviewed test-only follow-up. No assertions or gates were weakened.

Existing full CLI fragment proof

The synthetic pnpm openclaw doctor --fix --non-interactive fixture was previously run against pre-fix commit d4eb1353071c0bc8e2d81c799b72da28d80c8129 and contributor continuation 67d1c02da5351095c68e55521bb31a850fca0038:

  • Before: CLI exit 1; nested agents.entries.main.sandbox.perSession was not migrated; root and intermediate files were unchanged.
  • After: CLI exit 0; the fragment contained canonical sandbox.scope; root and intermediate files were byte-identical.
  • Run: https://github.com/openclaw/openclaw/actions/runs/33992606478 . First-run skill flags and migration metadata repairs were preconditioned before the isolated nested repair; this does not claim Doctor never legitimately writes root-owned state.
  • The candidate also retains the real Doctor preparation/write-stage fixture in src/commands/doctor-config-flow.include-refusal.test.ts, including its refusal sibling. Its refreshed result is included in the Testbox proof above.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jul 29, 2026
@clawsweeper

clawsweeper Bot commented Jul 29, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: blocked before merge. Reviewed September 6, 2026, 11:47 PM ET / September 7, 2026, 03:47 UTC.

ClawSweeper review

What this changes

Routes configuration edits and Doctor repairs into the nested include file that owns them, preserves neighboring include pointers, and reports refused writes accurately.

Merge readiness

⛔ Blocked before merge - 2 items remain

Keep open: nested include write-through remains absent from current main and the latest release. The prior ownership findings are resolved, and the updated evidence addresses the previous validation gap. No new actionable patch defect was found.

Priority: P2
Reviewed head: 80a755a50d998e71fa59896d799a9f172dd53344

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) A coherent implementation with relevant CLI proof and focused ownership regression results; no remaining actionable correctness finding was identified.
Proof confidence 🐚 platinum hermit (4/6) ✨ media proof bonus Sufficient (linked_artifact): The captured real Doctor CLI run demonstrates nested fragment migration with unchanged ancestors; the updated Testbox report supplies the previously missing alias and concurrent-edit regression results through the production configuration writer. Linked run logs could not be independently retrieved in this environment.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Verified Sufficient (linked_artifact): The captured real Doctor CLI run demonstrates nested fragment migration with unchanged ancestors; the updated Testbox report supplies the previously missing alias and concurrent-edit regression results through the production configuration writer. Linked run logs could not be independently retrieved in this environment.
Evidence reviewed 10 items Current main still supports only top-level include writes: The current-main target resolver constructs a one-segment target path and requires ownership at that depth; nested per-entry ownership does not qualify.
Latest release retains the same limitation: Inspection of v2026.9.2 shows the top-level-only resolver. The requested nested write-through capability is not demonstrated as shipped.
Shared-target finding resolved: The resolver canonicalizes all recorded targets and rejects a candidate reused at another logical path, including aliases and merged owners. Root ownership, array ancestry, enclosing merges, and directive-carrying parents also prevent write-through.
Findings None None.
Security None None.

How this fits together

OpenClaw combines the root configuration and included fragments into one configuration snapshot. Configuration commands and Doctor use that snapshot to decide which authored file can safely receive a change.

flowchart TD
A[Root configuration and fragments] --> B[Snapshot with include ownership]
C[Configuration edit or Doctor repair] --> D[Resolve changed paths]
B --> D
D --> E{One eligible owner?}
E -->|Yes| F[Recheck graph and write fragment]
E -->|No| G[Guarded root write or clear refusal]
F --> H[Reload and report saved result]
Loading

Before merge

  • Review config compatibility - Confirm compatibility and upgrade impact for the changed config or default surface before merge.
  • Add data-model compatibility proof - Confirm migration or upgrade compatibility proof before merge.
Agent review details

Security

None.

PR surface

Source +388, Tests +1700, Docs +27, Other -1. Total +2114 across 33 files.

View PR surface stats
Area Files Added Removed Net
Source 13 597 209 +388
Tests 15 1753 53 +1700
Docs 4 40 13 +27
Config 0 0 0 0
Generated 0 0 0 0
Other 1 1 2 -1
Total 33 2391 277 +2114

Review metrics

Metric Value Why it matters
Production versus test growth Production net +388 lines; tests/support net +1700 lines The recorded feature approval covers production growth for shared ownership resolution, persistence checks, and Doctor integration.

Stored data model

Persistent data-model change detected: migration/backfill/repair: config/assertion-safety-baseline.txt, migration/backfill/repair: src/commands/doctor-config-flow.ts, migration/backfill/repair: src/commands/doctor/legacy-config-repair.ts, migration/backfill/repair: src/commands/doctor/shared/include-migration-ownership.ts, migration/backfill/repair: src/flows/doctor-health-contribution-runners.config.ts, migration/backfill/repair: src/flows/doctor-health-contribution-types.ts, and 4 more. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster

Relationship: fixed_by_candidate
Canonical: #116107
Summary: This PR is the explicit implementation candidate for the paired nested-include request; both remain open pending merge.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Technical review

Best possible solution:

Keep one shared ownership resolver for configuration writes and Doctor, preserving authored fragments and refusing ambiguous or concurrently changed ownership.

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

Not applicable as an approved capability extension: main and v2026.9.2 explicitly limit writes to top-level includes, while the captured CLI evidence demonstrates the nested limitation and successful write-through afterward.

Is this the best way to solve the issue?

Yes. Sharing ownership resolution between the writer and Doctor extends the existing persistence path without adding configuration switches or a competing multi-file writer.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 6e8fd6c41f6a.

Labels

Label justifications:

  • P2: This improves configuration persistence for optional nested include layouts with a bounded operator impact.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (linked_artifact): The captured real Doctor CLI run demonstrates nested fragment migration with unchanged ancestors; the updated Testbox report supplies the previously missing alias and concurrent-edit regression results through the production configuration writer. Linked run logs could not be independently retrieved in this environment.
  • proof: sufficient: Contributor real behavior proof is sufficient. The captured real Doctor CLI run demonstrates nested fragment migration with unchanged ancestors; the updated Testbox report supplies the previously missing alias and concurrent-edit regression results through the production configuration writer. Linked run logs could not be independently retrieved in this environment.

Evidence

What I checked:

  • Current main still supports only top-level include writes: The current-main target resolver constructs a one-segment target path and requires ownership at that depth; nested per-entry ownership does not qualify. (src/config/mutate.ts:395, 6e8fd6c41f6a)
  • Latest release retains the same limitation: Inspection of v2026.9.2 shows the top-level-only resolver. The requested nested write-through capability is not demonstrated as shipped. (src/config/mutate.ts:395, 3928bad9badf)
  • Shared-target finding resolved: The resolver canonicalizes all recorded targets and rejects a candidate reused at another logical path, including aliases and merged owners. Root ownership, array ancestry, enclosing merges, and directive-carrying parents also prevent write-through. (src/config/include-write-boundary.ts:147, 80a755a50d99)
  • Concurrent include-graph finding resolved: Captured targets and hashes are checked before persistence, after writing, and after reload. Failure rolls back only a leaf whose contents still match this write; final config-path and runtime-generation guards remain in place. (src/config/mutate.ts:608, 80a755a50d99)
  • Doctor and root-owned sibling preservation: Doctor shares the writer's eligibility decision and records include refusals before reporting repairs as committed. Root-owned roster edits preserve eligible keyed include pointers while retaining checks against changed or deleted included entries. (src/config/io.write-prepare.ts:1607, 80a755a50d99)
  • Retained real CLI proof: The captured body reports a synthetic real CLI Doctor run: before the fix, exit 1 and an unmigrated nested sandbox setting; after the fix, exit 0 and canonical sandbox.scope in the fragment, with root and intermediate files byte-identical. First-run root repairs were explicitly preconditioned. Evidence link: https://github.com/openclaw/openclaw/actions/runs/33992606478 . (67d1c02da535)

Likely related people:

  • steipete: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)
  • Josh Lehman: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)

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 (32 earlier review cycles; latest 8 shown)
  • reviewed 2026-09-02T14:19:06.087Z sha f6b06ca :: needs maintainer review before merge. :: none
  • reviewed 2026-09-02T23:31:21.786Z sha 8b3702d :: blocked before merge. :: none
  • reviewed 2026-09-03T18:10:43.281Z sha d870312 :: blocked before merge. :: none
  • reviewed 2026-09-04T06:00:25.158Z sha f28e869 :: blocked before merge. :: none
  • reviewed 2026-09-05T21:20:48.139Z sha 67d1c02 :: blocked before merge. :: [P1] [P1] Reject fragment targets shared by other logical subtrees | [P2] [P2] Revalidate intermediate include files before committing
  • reviewed 2026-09-05T21:46:26.234Z sha 67d1c02 :: blocked before merge. :: [P1] [P1] Reject fragment targets shared by other logical subtrees | [P2] [P2] Revalidate intermediate include files before committing
  • reviewed 2026-09-05T21:52:40.344Z sha 67d1c02 :: blocked before merge. :: [P1] Reject fragment targets shared by other logical subtrees | [P2] Revalidate intermediate include files before committing
  • reviewed 2026-09-07T03:15:06.267Z sha 2d85efc :: blocked before merge. :: none

@sasan1200

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 29, 2026 •

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 29, 2026
@sasan1200
sasan1200 force-pushed the feat/config-include-write-through branch from 914126e to 1c9a750 Compare July 29, 2026 23:19
@clawsweeper clawsweeper Bot added 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. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Aug 3, 2026
…wns them

Config writes only routed into an $include file when the directive sat at a
top-level key. A directive nested deeper, such as a per-agent
agents.entries.<id> include, fell through to the root write, which refused the
write rather than flatten the included content.

- Resolve the deepest authored include that solely owns every changed path,
  using the include provenance already recorded while reading the snapshot.
- Require every enclosing include to be a sole owner, so a merged or
  sibling-overridden ancestor still declines write-through.
- Keep array-entry includes, root-level changes, and changes spanning an
  include boundary on the existing root write path.
- Retain the parsed-directive fallback for snapshots without provenance.

Verified: new nested write-through and out-of-boundary cases in
src/config/mutate.test.ts fail without this change; 17 boundary-resolution
cases in src/config/include-write-boundary.test.ts; runtime-config shard 214
files / 2967 tests pass; pnpm build, pnpm lint, tsgo:core, tsgo:ui and
check:architecture pass.
…ough

Read-time roster migration adds keys to the resolved source config that the
authored include file does not carry, so the pre-write equality check rejected
every nested include write with "included config changed since last load".

- Compare the authored include content against sourceConfigBeforeMigrations
  when the snapshot carries it, falling back to sourceConfig.
- Add a regression case covering a migration-added key at the boundary.

Verified: openclaw config set against a real nested include layout now writes
the included file and leaves the root $include directive in place.
@sasan1200
sasan1200 force-pushed the feat/config-include-write-through branch from 1c9a750 to fdc6df8 Compare August 4, 2026 04:36
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation gateway Gateway runtime commands Command implementations labels Aug 4, 2026
@sasan1200

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Aug 4, 2026 •

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

- src/config/mutate.ts: keep upstream's persistCanonicalAgentRoster root-write guard in front of the changed-path include check; pre-migration source comparison reads the boundary path.
- src/commands/doctor-config-flow.ts: keep upstream's persistCanonicalAgentRoster result field beside includeBoundaryWrite; singleTopLevelIncludeWrite removed.
- src/commands/doctor-config-flow.test.ts: upstream mock without the "issues" preflight mode; includeProvenance passthrough kept; Doctor wiring tests use a retired tuning knob inside an include as the repair vehicle.
- resolveIncludeWriteBoundary declines every boundary beneath a root-level $include (documented read-only topology).
- configWriteTargetsIncludeBoundary declines when persistCanonicalAgentRoster is set or the candidate no longer carries the boundary value, matching the writer; Doctor passes the flag.
- Root writer include-flatten refusals are typed (createConfigIncludeOwnershipError, carrying the owned config path and the authored $include target); the Doctor write runner records them as configWriteRefusal "include-ownership", names the included file to repair by hand, and keeps the queued repair panels unprinted instead of surfacing a raw error.
- docs/gateway/configuration.md, configuration-reference.md, opentelemetry.md: Doctor refuses a run that mixes a root-owned repair with an include-owned repair.
- extensions/file-transfer/src/cli.test.ts: provenance fixture carries hasArrayAncestor.
- docs/cli/plugins.md: nested write-through wording for plugins commands.
…ter and Doctor eligibility

- `resolveIncludeOwnedWriteCandidate` is the one decision consumed by `tryWriteIncludeOwnedConfigMutation` and `configWriteTargetsIncludeBoundary`; `getIncludeMutationBoundary` inlined
- keyed config-path reads and writes use the existing `config-paths.ts` helpers; `readConfigPathValue`, `writeConfigPathValue`, `hasConfigPathValue` and their tests removed
- an in-memory candidate carrying an own `undefined` at the boundary now takes the root writer instead of serializing `undefined` into the include file; authored JSON5 configs behave as before
- top-level parsed-directive fallback for snapshots without recorded provenance kept (openclaw#114251)
- docs: root includes read-only means every section of a config whose root object authors `$include`

Refs openclaw#116107
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Sep 3, 2026
sasan1200 and others added 2 commits September 3, 2026 21:02
Keep array ancestry optional for existing SDK callers, reuse include detection and overlap ownership logic, and cover Doctor fragment writeback with unchanged ancestor files. The broader nested-write PR remains held for ownership review and its positive production LOC delta.
@clawsweeper clawsweeper Bot added status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 5, 2026
Merge current main while preserving the contributor's commits, then reject
fragment files shared by other logical owners and revalidate the captured
include graph before persistence, after writing, and after reload. Preserve
main's authority guards and roster projection order. Keep hasArrayAncestor
optional for existing snapshot callers.

The feature-class production growth is maintainer-approved. Independent
review, formatting, and the scoped whitespace check passed. Runtime validation
is pending the exact-head hosted gate after local Testbox synchronization
failed before tests started.

Co-authored-by: Sasan Sotoodehfar <sasan1200@gmail.com>
@steipete

steipete commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

@clawsweeper re-review

The maintainer continuation at 2d85efc resolves the two recorded ownership findings: canonical targets shared by another logical subtree are refused, and captured include targets and bytes are revalidated around persistence and after reload. Conditional rollback preserves concurrent edits. Mainline conflicts are resolved while retaining Sasan's original commit ancestry and current-main authority and roster-projection behavior.

The feature-class production growth is approved by the maintainer; hasArrayAncestor remains optional. Fresh independent review found no actionable P0/P1/P2 issue. The body distinguishes the retained full CLI proof from the new tests and exact-head CI, which are still pending; local Testbox sync failures are not claimed as runtime proof.

@clawsweeper

clawsweeper Bot commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event exact_review_queue).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Sep 7, 2026
Change only the intended plugin leaf so the regression fixtures reach the
include ownership boundary without introducing unrelated root changes.
The pre-repair implementation now fails all five intended ownership cases,
while the unchanged delegation control passes. The candidate passes all
100 focused config and Doctor tests on Testbox.

Co-authored-by: Sasan Sotoodehfar <sasan1200@gmail.com>
@steipete steipete self-assigned this Sep 7, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This assigned pull request has been automatically marked as stale after being open for 27 days.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Sep 7, 2026
@steipete

steipete commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

The compatibility and stored-data review items are addressed in the body for 80a755a. Existing formats and canonical keys are retained; hasArrayAncestor remains optional snapshot metadata. Existing sole-owner top-level writes are covered by the passing suite. Shared physical targets intentionally refuse writes that could alter another logical owner.

There is no SQLite schema, persisted config key, or new migration transform. The existing Doctor migration is persisted into its owning fragment; the real preparation/write fixture proves canonical sandbox.scope output with root and intermediate bytes preserved, and its mixed-owner sibling proves refusal without authored-file changes. The maintainer's feature approval covers this persistence capability. All 100 focused tests and the changed-file gate passed; the remaining landing gate is exact-head CI, where one unchanged Gateway mock-binding job is being rerun.

@steipete
steipete merged commit 05182b6 into openclaw:main Sep 7, 2026
387 of 389 checks passed
@steipete

steipete commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

commands Command implementations docs Improvements or additions to documentation gateway Gateway runtime P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL stale Marked as stale due to inactivity status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Config writes are not routed into a nested $include file, so changes under it cannot be saved

2 participants