Skip to content

feat(flows): select per-node models and session config options - #844

Merged
vincentkoc merged 6 commits into
openclaw:mainfrom
superbiche:feat/flow-node-config-options
Oct 31, 2026
Merged

vincentkoc merged 6 commits into
openclaw:mainfrom
superbiche:feat/flow-node-config-options

Conversation

@superbiche

@superbiche superbiche commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Related: #533, #843

What Problem This Solves

Flow authors cannot select a node's model and adapter options before its first turn. A flow run only accepts a run-wide --model, and rejects --config-option.

User Impact

ACP nodes can declare modelId and ordered configOptions, with defaults from --model and repeatable flow run --config-option <key=value>. The node model overrides the run default; options run in order after model selection and before the prompt. Selection rejection or timeout prevents prompting.

The existing passthrough model key stays inert metadata, including numeric, string and object values. This preserves the compatibility boundary requested in #485 (comment).

The persistent-handle contract pins the first settings. Later omitted fields inherit them; conflicting explicit selections fail. Another handle permits different settings. Reconnect loads the same ACP session and restores its selections or fails before prompting. The model/configuration surface and first-settings pinning contract are approved for landing.

Why This Change Was Made

This extends the one-shot configuration shape from #533 to flow nodes. Controls use the session's creating client, in order: model, run options, node options, prompt.

Bundles gain optional requested/accepted settings on session bindings and step snapshots. The printed JSON result omits those settings. Definition snapshots retain modelId; legacy model metadata is not promoted into configuration. Existing flows without settings retain their previous bundle shape. A run-wide model adds settings evidence but does not create a node-level conflict.

Configuration acknowledgements are not provider-usage attestation. Persistent creation controls are recorded in binding and step evidence, rather than events.ndjson. The existing v1 bundle schemas remain additive. Reconnects that restore only options can still send redundant configuration controls; removing that redundancy remains outside this change.

Evidence

The earlier real-adapter proof is retained at #844 (comment). It exercised the original control pipeline before this compatibility repair; it is not a fresh adapter run on the current candidate.

The repair adds persistent and isolated flow regressions for legacy metadata with no selection, run defaults and explicit modelId, plus the v0.19.5 schema comparison. Existing tests cover ordering, rejection, pinning, same-session replay, evidence provenance and JSON output.

On 034221c0, formatting, typecheck, lint, CLI/viewer builds, docs checks and normal commit hooks pass. The declared flows/runtime coverage target meets its 85% gates; the configured mutation target scores 91.98%.

The full test run has 3,075 passes, 15 skips and one failure: conformance retires wrapper-exited adapter and its transport. The same test fails on an untouched upstream archive at facec6f; the merged upstream 0d874f9 differs from that baseline only in release workflow/docs, not the implicated code. This existing gate failure remains explicit and is not represented as a green full check.

Independent Opus 5.5/medium artifact review reports no P0–P2 defects and passes with residuals. Current-candidate coverage is local/source/mock evidence; no fresh live-adapter run was performed. The first-prompt reconnect edge was source-reviewed through saved preference replay. Slophammer parity remains for CI because the checker is not installed locally.


@superbiche · contributor · drafted with GPT-6.1 Sol, reviewed before posting; the voice and decisions are mine.

Maintainer integration validation

Integrated main 62cd9826d15ea866b866b0e53015b2e9eea60900 at head 72a84bcce0df5be22bbdff86991df1be944c9ed6, including the landed runtime setup timeout, ACP message observer, and approved development-tool updates. The only manual conflict was CHANGELOG.md: preserve incoming entries and append the original flow entry to the existing Changes section. All 23 non-changelog introduced feature patches are identical to the previously reviewed and validated head 009b112b9d997fb78c8fb9716b0b685ea2783384; contributor ancestry and inert legacy model metadata behavior are preserved. git diff --check and the outgoing personal-data scan pass.

Previous full code and docs CI passed: https://github.com/openclaw/acpx/actions/runs/41173135869. Fresh exact-head integration CI passed all 12 jobs, including Node 22/24/26, coverage, mutation, format, types, lint, builds, docs, conformance, and Slophammer: https://github.com/openclaw/acpx/actions/runs/41210298168. This checkout is code-only; no project dependency-backed tests were executed locally for this integration. The persistent-handle settings contract is approved for landing.

Apply ordered run defaults and node configuration before the first ACP prompt, preserve creating-client use, and pin persistent handles across same-session replay. Record requested and accepted settings in v1 flow bundles.

Validation: focused configuration tests, declared coverage, documentation checks, mutation testing, Python unit tests, and built Codex first-turn receipts passed. Aggregate check retains three unchanged conformance failures; wrapper-exited also fails on the untouched baseline. Independent coordinator review remains pending.
@superbiche
superbiche requested a review from a team as a code owner September 30, 2026 18:13
@clawsweeper

clawsweeper Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

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

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 session-state 🚨 Merging this PR could lose, corrupt, stale, or mis-associate session or agent state. 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 Sep 30, 2026
@clawsweeper

clawsweeper Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: blocked before merge.

What this changes

This PR adds per-node model and ordered session-option selection to ACP flows, with run defaults and persistent-session replay.

Example: A Codex flow node requests modelId gpt-6-luna and reasoning_effort medium.

  • Before: Flow nodes cannot declare these selections before their first prompt.
  • After: The runtime selects the model, applies medium effort, and then prompts; later nodes sharing the handle inherit those settings.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Live adapter evidence and passing current-head checks support the patch; readiness is capped by the unresolved public settings contract.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (logs): The contributor's built-CLI Codex trace shows isolated creation, persistent first turn, and same-session restoration with model and effort controls preceding prompts; current source comparison maps the modelId rename to that exercised pipeline, with focused compatibility tests supporting the repair.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Feature · Worth it: Needs a maintainer decision · Fix scope: Complete
User problem: Flow authors cannot choose a node's model and adapter options before its first turn.
Reason: The capability has clear workflow value and follows the earlier compatibility direction, but the new persistent-handle contract lacks recorded approval.

Merge readiness

⛔ Blocked before merge - 1 item remains

Keep this PR open: it adds a capability missing from main and resolves the previous compatibility finding; the persistent-handle settings contract still needs a maintainer decision.

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

Decision needed

  • Question: Should a persistent flow handle pin its first effective settings, inherit omitted selections, and reject later conflicting explicit selections?
  • Recommendation: Approve settings pinned per handle: Keep the proposed inheritance, conflict checks, and replay contract; flows needing different settings use distinct handles.
  • Why: The earlier maintainer discussion supports a distinct validated model field, but neither it nor discussion on this PR settles pinning versus changing settings between turns.

Before merge

  • Resolve maintainer decision - Resolve the maintainer decision shown above before merge.

Findings

None.

Tests

  • Low-value test test/cli-flags.test.ts: Remove the added helper-level description assertions: they repeat the supplied description and pin incidental wording, while CLI integration coverage exercises repeatable option parsing.
Agent review details

How this fits together

The flow runner translates node definitions and CLI defaults into ACP session controls, then records prompt results and configuration acknowledgements in run bundles.

flowchart TD
A[Flow definition and CLI defaults] --> B[Flow runner]
B --> C[Session settings and binding]
C --> D[Shared session configuration]
D --> E[ACP adapter]
E --> F[Prompt result]
C --> G[Run bundle]
F --> G
Loading

Technical review

Best possible solution:

Adopt the scoped modelId surface and shared configuration path once the persistent-handle settings contract is decided.

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

This is a feature request; main's node schema, session-binding path, and CLI registration confirm the missing selection surface.

Is this the best way to solve the issue?

The implementation appropriately extends the existing ordered configuration owner and preserves legacy metadata, with persistent-handle semantics awaiting an owner decision.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 0d874f9a98de.

Provenance checked

  • Extensible flow-node metadata keeps the original intent (ead133c: Flow validation deliberately retained extension fields; the closing discussion on feat: configurable model per agent and per flow node #485 required preserving legacy model metadata.)
  • Ordered session configuration keeps the original intent (95848ba: One-shot sessions select the model first, apply ordered options, and prompt only after successful configuration; this PR extracts and reuses that path.)
  • Persistent flow session reuse changes intended behavior with a stated reason (697ee1f: Handles reuse a session across steps; this PR explains pinning as a way to restore one defined configuration after reconnect.)
  • Cancellation and accepted session state keeps the original intent (0f15c46: Node attempts own cancellation and cleanup; the extracted configuration path retains authority checks and executes before prompting.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

  • Capability remains absent on main: Main creates persistent bindings using run-wide session options and has no node-settings resolution or flow config-option registration; the introduced diff supplies those paths. (src/flows/runtime.ts:1092, 034221c0fe8e)
  • Previous compatibility finding resolved: The schema and resolver now consume modelId while model remains passthrough metadata; six added scenarios cover numeric, string, and object metadata across persistent and isolated nodes with absent, run-wide, and explicit selections. (test/flows.test.ts:2568, 034221c0fe8e)
  • Recorded maintainer compatibility direction: Peter Steinberger's closing discussion on feat: configurable model per agent and per flow node #485 (comment) permits a scoped follow-up with a validated field that does not reuse legacy model metadata; it does not approve this PR's persistent-handle pinning semantics.
  • Contributor supplied live behavior evidence: feat(flows): select per-node models and session config options #844 (comment) records the built CLI using the real Codex ACP adapter, model and effort acknowledgements before prompting, and same-session restoration. The recorded head uses the former field name; comparison verifies that the current rename feeds the same control pipeline. (src/flows/runtime.ts:1094, 18c2a9487d7d)
  • Additive storage boundary: Settings are optional additions to newly generated bindings, step receipts, and definition snapshots. Unconfigured runs omit them, the viewer reads JSON without rejecting extra fields, and the PR introduces no rewriting or resumption of existing run bundles. (examples/flows/replay-viewer/src/lib/load-bundle.ts:76, 034221c0fe8e)
  • Feature history and ownership: Flow runtime and extensible validation history lead to Onur Solmaz; subsequent cancellation, session identity, and state repairs lead to Peter Steinberger. Michel Tomas authored the merged one-shot configuration change reused here, including its former src/cli/session/runtime.ts path. (src/session/execution/runtime.ts:1368, 0d874f9a98de)

Likely related people:

  • Onur Solmaz: Raw commit ead133c adds src/flows/schema.ts:22 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: ead133cfb225; files: src/flows/schema.ts)

Review metrics

Metric Value Why it matters
Production and test scope Production +383/-68; tests and fixtures +938/-1 Most added coverage exercises ordering, rejection, replay, saved evidence, and legacy metadata across both session modes.

Labels

Label changes:

  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • remove status: ⏳ waiting on author: Current PR status no longer selects a status label.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.

Label justifications:

  • P2: This is a useful, bounded flow configuration feature without evidence of an urgent existing regression.
  • merge-risk: 🚨 compatibility: New public node fields and persistent-handle settings semantics create a lasting API contract; legacy model metadata is now preserved.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • proof: sufficient: Contributor real behavior proof is sufficient.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

History

Review history (6 earlier review cycles)
  • reviewed 2026-09-30T18:18:46.112Z sha 18c2a94 :: needs real behavior proof before merge. :: none
  • reviewed 2026-09-30T18:41:36.331Z sha 18c2a94 :: blocked before merge. :: [P2] Keep raw option values out of the flow JSON result
  • reviewed 2026-09-30T19:33:46.991Z sha 18c2a94 :: blocked before merge. :: [P2] Keep raw option values out of the flow JSON result
  • reviewed 2026-09-30T20:03:31.152Z sha 9aecae5 :: blocked before merge. :: none
  • reviewed 2026-10-06T21:48:07.089Z sha 9aecae5 :: blocked before merge. :: none
  • reviewed 2026-10-13T04:41:05.934Z sha 9aecae5 :: blocked before merge. :: [P1] Preserve legacy model metadata when adding node selection

Reviewed October 16, 2026, 3:06 PM ET / 19:06 UTC (Revision 7).

@superbiche

Copy link
Copy Markdown
Contributor Author

Real-adapter proof on head 18c2a9487d7dce8931e3283332678c505f688c7b, using the built CLI with the official @agentclientprotocol/codex-acp 1.1.14 adapter. HOME and CODEX_HOME point to a scratch directory, and the adapter runs in a sandbox that mounts only the auth file (read-only).

Flow (proof.flow.mjs) — one isolated node, then two persistent nodes on the same handle; the third declares no settings:

import { acp, defineFlow } from "acpx/flows";
const settings = { model: "gpt-6-luna", configOptions: [{ configId: "reasoning_effort", value: "medium" }] };
export default defineFlow({
  name: "node-settings-proof",
  startAt: "isolated",
  nodes: {
    isolated: acp({ ...settings, session: { isolated: true }, prompt: () => "Reply with exactly: ONE" }),
    first: acp({ ...settings, session: { handle: "pinned" }, prompt: () => "Reply with exactly: TWO" }),
    reconnect: acp({ session: { handle: "pinned" }, prompt: () => "Reply with exactly: THREE" }),
  },
  edges: [{ from: "isolated", to: "first" }, { from: "first", to: "reconnect" }],
});
$ node dist/cli.js --cwd "$SCRATCH/workspace" --deny-all --format json --timeout 180 flow run proof.flow.mjs --default-agent codex
exit 0
"status":"completed", "outputs":{"isolated":"ONE","first":"TWO","reconnect":"THREE"}

The adapter's defaults are gpt-6.1-sol at low effort. The run requests gpt-6-luna at medium.

Isolated node: first turn. Excerpt from sessions/isolated-*/events.ndjson: non-update messages only, config catalogs trimmed to model and reasoning_effort, prompt receipts reduced to stopReason and _meta.quota.model_usage[].model.

{"id": 1, "method": "session/new", "params": {"_meta": {"claudeCode": {"options": {"model": "gpt-6-luna"}}}}}
{"id": 1, "result": {"configOptions": [{"id": "model", "currentValue": "gpt-6.1-sol"}, {"id": "reasoning_effort", "currentValue": "low"}]}}
{"id": 2, "method": "session/set_config_option", "params": {"sessionId": "01a0f398-3e9b-78d0-bb61-5a09207862a7", "configId": "model", "value": "gpt-6-luna"}}
{"id": 2, "result": {"configOptions": [{"id": "model", "currentValue": "gpt-6-luna"}, {"id": "reasoning_effort", "currentValue": "low"}]}}
{"id": 3, "method": "session/set_config_option", "params": {"sessionId": "01a0f398-3e9b-78d0-bb61-5a09207862a7", "configId": "reasoning_effort", "value": "medium"}}
{"id": 3, "result": {"configOptions": [{"id": "model", "currentValue": "gpt-6-luna"}, {"id": "reasoning_effort", "currentValue": "medium"}]}}
{"id": 4, "method": "session/prompt", "params": {"sessionId": "01a0f398-3e9b-78d0-bb61-5a09207862a7", "prompt": [{"type": "text", "text": "Reply with exactly: ONE"}]}}
{"id": 4, "result": {"stopReason": "end_turn", "model_usage": ["gpt-6-luna"]}}

Persistent handle pinned: first turn and reconnect. Excerpt from sessions/pinned-*/events.ndjson, using the same filter. As documented, the controls sent when the persistent session was created are not in events.ndjson; binding.json (below) records them. The node reconnect declares no settings. It resumes the same ACP session, which comes back at the adapter defaults, restores the pinned model and effort, and only then prompts:

{"id": 4, "method": "session/prompt", "params": {"sessionId": "01a0f398-5544-7ab0-940b-32d48aaa916f", "prompt": [{"type": "text", "text": "Reply with exactly: TWO"}]}}
{"id": 4, "result": {"stopReason": "end_turn", "model_usage": ["gpt-6-luna"]}}
{"id": 1, "method": "session/resume", "params": {"sessionId": "01a0f398-5544-7ab0-940b-32d48aaa916f", "_meta": {"claudeCode": {"options": {"model": "gpt-6-luna"}}}}}
{"id": 1, "result": {"configOptions": [{"id": "model", "currentValue": "gpt-6.1-sol"}, {"id": "reasoning_effort", "currentValue": "low"}]}}
{"id": 2, "method": "session/set_config_option", "params": {"sessionId": "01a0f398-5544-7ab0-940b-32d48aaa916f", "configId": "model", "value": "gpt-6-luna"}}
{"id": 2, "result": {"configOptions": [{"id": "model", "currentValue": "gpt-6-luna"}, {"id": "reasoning_effort", "currentValue": "low"}]}}
{"id": 3, "method": "session/set_config_option", "params": {"sessionId": "01a0f398-5544-7ab0-940b-32d48aaa916f", "configId": "reasoning_effort", "value": "medium"}}
{"id": 3, "result": {"configOptions": [{"id": "model", "currentValue": "gpt-6-luna"}, {"id": "reasoning_effort", "currentValue": "medium"}]}}
{"id": 4, "method": "session/prompt", "params": {"sessionId": "01a0f398-5544-7ab0-940b-32d48aaa916f", "prompt": [{"type": "text", "text": "Reply with exactly: THREE"}]}}
{"id": 4, "result": {"stopReason": "end_turn", "model_usage": ["gpt-6-luna"]}}

sessions/pinned-*/binding.json (settings fields):

{
  "handle": "pinned",
  "acpSessionId": "01a0f398-5544-7ab0-940b-32d48aaa916f",
  "requestedSettings": { "model": "gpt-6-luna", "configOptions": [{ "configId": "reasoning_effort", "value": "medium" }] },
  "acceptedSettings": {
    "model": { "requested": "gpt-6-luna", "applied": true, "accepted": "gpt-6-luna" },
    "configOptions": [{ "configId": "reasoning_effort", "value": "medium", "acceptedValue": "medium", "reported": true }]
  }
}

In the two excerpts, every prompt runs on gpt-6-luna, and each prompt is preceded by an adapter-reported reasoning_effort of medium where the adapter default is low. That covers the first turns (the isolated session and the persistent session's creation controls, recorded in binding.json) and the resumed session. This adapter's prompt receipt reports the model but not the effort, so effort evidence is the adapter's config-option reply.

On the persistent-handle contract and global --model: a conflict requires a node to set model or configOptions explicitly, and those fields do not exist on main. With global --model only, every node on a handle resolves the same requested model, so no existing flow can hit the new conflict error. The only visible change for those runs is the additive requestedSettings / acceptedSettings keys in the bundle. Pinning was chosen so that a reconnect has one well-defined state to restore; a different configuration uses a different session.handle.


@superbiche · contributor · drafted with Claude Opus 5.5.

@clawsweeper clawsweeper Bot added merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. 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. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Sep 30, 2026
@superbiche

Copy link
Copy Markdown
Contributor Author

On the option-value finding: ACP session config options are select (the value is one of the IDs the adapter advertises, like medium or gpt-6-luna) or boolean. The schema has no free-text option type, so a value cannot carry a secret. main already stores the same values in plain text: session records keep them in acpx.desired_config_options, fed by exec --config-option (#533), and bundle events.ndjson records the raw session/set_config_option messages. The new fields repeat values acpx already stores. I'd rather not add redaction for catalog IDs; if you want the flow JSON result slimmer, I can drop the settings fields from stdout and keep them in the bundle.

@clawsweeper re-review


@superbiche · contributor · drafted with Claude Opus 5.5, reviewed before posting; the voice and decisions are mine.

@clawsweeper

clawsweeper Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
Exact review queued.

Re-review progress:

Omit requestedSettings and acceptedSettings from the session bindings printed
by flow run --format json; the run bundle keeps them. Pin global --model
bundle evidence for shared persistent handles.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@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 merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 session-state 🚨 Merging this PR could lose, corrupt, stale, or mis-associate session or agent state. labels Sep 30, 2026
@clawsweeper clawsweeper Bot added 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. labels Oct 13, 2026
@clawsweeper clawsweeper Bot added the status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. label Oct 13, 2026
@superbiche

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Please review current head 034221c0fe8e7d5357519a58d466bbc9fb6a0e95; the existing checklist still names 9aecae5. This revision preserves legacy model metadata, adds explicit modelId selection and upgrade regressions, and resolves the merge conflict. All current CI jobs pass. The PR body retains the evidence limits; the persistent-handle pinning contract still needs a maintainer decision.


@superbiche · contributor · drafted with GPT-6.1 Sol.

@clawsweeper

clawsweeper Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed 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. clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Oct 16, 2026

@vincentkoc vincentkoc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Technical review of head 034221c found no actionable P0–P2 defects in the supplied diff and source context. Ordered configuration, persistent-handle conflicts, and replay acceptance are checked before prompting. No contributor code was executed locally.

Not ready to land yet:

  • The branch currently conflicts with main. A merge-tree comparison against 289c04f found the conflict in CHANGELOG.md only. Integrate current main while preserving all existing release history and Unreleased entries, then run the full code and docs CI on the resulting head. Older green checks are not evidence for that integration.
  • The new modelId/configOptions surface and first-settings pinning contract for persistent handles still need the explicit maintainer decision requested in the PR body. This technical review does not approve that permanent contract.

@vincentkoc vincentkoc self-assigned this Oct 31, 2026

@vincentkoc vincentkoc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approved the modelId/configOptions surface and first-settings pinning contract for persistent handles. Omitted later fields inherit the pinned settings; conflicting explicit selections fail; reconnect preserves the same ACP session or fails before prompting. Legacy model metadata remains inert.

The main integration changes no introduced feature source/test/doc patch across 23 non-changelog files, so the completed independent P0-P2 review remains applicable. The only manual repair preserves existing changelog entries and appends the flow entry. All 12 exact-head CI jobs passed: https://github.com/openclaw/acpx/actions/runs/41210298168.

Retained the two small help assertions: they cover the new optional description override and unchanged one-shot default. Production flow behavior is proven by the integration tests, not those helper assertions.

@vincentkoc
vincentkoc merged commit ba09c49 into openclaw:main Oct 31, 2026
17 checks passed
@vincentkoc

Copy link
Copy Markdown
Member

Landed as ba09c49.

Approved per-node model/configuration selection and first-settings pinning for persistent handles. Integrated main with only a changelog conflict repair, preserving the reviewed feature patch and contributor ancestry. Reviewed head 72a84bc; full code and docs CI passed all 12 jobs: https://github.com/openclaw/acpx/actions/runs/41210298168.

Thanks @superbiche!

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. 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants