fix(agents/graphs/auto_debug): return update dicts from node functions instead of mutating state in-place #11155
No reviewers
Labels
No labels
auto/needs-reevaluation
controller-managed
overdue
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Bounty
$100
Bounty
$1000
Bounty
$10000
Bounty
$20
Bounty
$2000
Bounty
$250
Bounty
$50
Bounty
$500
Bounty
$5000
Bounty
$750
MoSCoW
Could have
MoSCoW
Must have
MoSCoW
Should have
Needs Feedback
Points
1
Points
13
Points
2
Points
21
Points
3
Points
34
Points
5
Points
55
Points
8
Points
88
Priority
Backlog
Priority
CI Blocker
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
State
Completed
State
Duplicate
State
In Progress
State
In Review
State
Paused
State
Unverified
State
Verified
State
Wont Do
Type
Automation
Type
Bug
Type
Discussion
Type
Documentation
Type
Epic
Type
Feature
Type
Legendary
Type
Refactor
Type
Support
Type
Task
Type
Testing
No project
No assignees
4 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
cleveragents/cleveragents-core!11155
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/issue-10496-auto-debug-state-mutation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fix auto_debug.py node state mutations (#10496)
All four node functions in AutoDebugAgent were mutating the input state dict in-place and returning the full state object, violating the LangGraph StateGraph contract which expects nodes to return only a partial update dict.
Changes
{{"messages": updated_messages}}instead of mutatingstate["messages"]in-place via append and returning the full state.{{"current_fix": fix_data}}instead of mutatingstate["current_fix"]and returning all 10 state keys.fix_validated+attempted_fixes"with new list copies) instead of aliasing the originalattempted_fixeslist and mutating it in-place.{{"result": ...}}}instead of settingstate["result"]in-place and returning the full state.Bug impact
state.get("attempted_fixes")returns a reference to the same list, and.append()mutates both the checkpointed state and any other code holding a reference to that list.Tests
Added BDD feature tests in
features/tdd_auto_debug_state_mutation.featurecovering all four node functions (including the validation retry branch) to verify no in-place mutations occur. Each test uses deepcopy/length snapshots before and after the call to assert immutability of the original state.Closes #10496
Node functions _analyze_error, _generate_fix, _validate_fix, and _finalize previously mutated the input state dict in-place and returned the full state object, violating the LangGraph node contract which requires returning only a dict of state updates (changed keys). This fix updates all four node functions to return new partial state dicts containing only the changed keys, consistent with the correct pattern already used in context_analysis.py and plan_generation.py. Changes: - _analyze_error: returns {"messages": [*existing, new_message]} - _generate_fix: returns {"current_fix": fix_data} - _validate_fix: returns {"fix_validated": is_valid} plus "attempted_fixes" when invalid - _finalize: returns {"result": {...}} - All four functions now have return type dict[str, Any] instead of AutoDebugState - Added TDD BDD tests verifying no in-place mutation occurs ISSUES CLOSED: #10496Review Summary
The core logic fix in
auto_debug.pyis correct and well-implemented — all four node functions (_analyze_error,_generate_fix,_validate_fix,_finalize) now properly return partial state update dicts instead of mutating state in-place, which is exactly the right fix for the LangGraph node contract violation described in #10496. The new docstrings and updated return type annotations (dict[str, Any]instead ofAutoDebugState) are appropriate.However, there are 8 blocking issues that must be resolved before this PR can be approved.
BLOCKER 1 — CI is failing
Three CI checks are currently failing:
CI / lint— failing after 1m0sCI / unit_tests— failing after 4m38sCI / integration_tests— failing after 3m42sPer company policy and CONTRIBUTING.md, all CI gates must pass before a PR can be approved and merged. Fix all CI failures and push a corrected commit.
BLOCKER 2 —
# type: ignorein step definitions file (see inline comment)features/steps/tdd_auto_debug_state_mutation_steps.pyline 85 contains# type: ignore[typeddict-item]. Zero-tolerance policy applies — any PR that adds a# type: ignoreis rejected.How to fix: Resolve the underlying type mismatch. Change
_base_stateto returndict[str, Any]and cast toAutoDebugStateonly where a method signature demands it.BLOCKER 3 — Missing
@tdd_issueand@tdd_issue_10496tags in BDD feature file (see inline comment)features/tdd_auto_debug_state_mutation.featurehas no TDD tags on any scenario. Per the TDD bug fix workflow, regression tests for bug issues must carry@tdd_issueand@tdd_issue_Ntags permanently. The CI gate checks for@tdd_issue_10496and will block the merge if absent.How to fix: Add
@tdd_issue @tdd_issue_10496before everyScenario:in the file. Do NOT add@tdd_expected_fail— that tag only appears on the TDD branch before the fix.BLOCKER 4 — PR scope is not atomic: unrelated changes bundled in (see inline comments)
This PR modifies 43 files but its stated purpose is fixing
auto_debug.pyfor issue #10496. The diff contains numerous changes unrelated to this issue:subplan_execution_service.py— status_map optimisation and stop_flag guard (for #7582)plan_lifecycle_service.py— prompt_definition root decision fix (for #9061).opencode/agents/config files — agent permission restructuringbenchmarks/langgraph_execution_bench.pyandtui_rendering_bench.py— new benchmarksdocs/api/decisions.md,docs/api/invariants.md,docs/api/checkpoints.md,docs/api/plan-corrections.md— API docs for other featuresfeatures/subplan_execution.feature— new scenario for #7582features/tdd_plan_lifecycle_decision_root_type.feature— new feature for #9061docs/timeline.md,mkdocs.yml— unrelated updatesPer CONTRIBUTING.md, each PR must be atomic. These must be removed via rebase and submitted in separate PRs.
BLOCKER 5 — No milestone assigned on PR
The PR has no milestone. Per CONTRIBUTING.md requirement 12, the PR must be assigned to the same milestone as the linked issue. Issue #10496 is in v3.2.0 — assign this milestone to the PR.
BLOCKER 6 — No
Type/label on PRThe PR has no labels. Per CONTRIBUTING.md requirement 12, exactly one
Type/label must be applied. This is a bug fix: applyType/Bug.BLOCKER 7 — Branch name does not match issue Metadata and uses wrong prefix
Issue #10496's Metadata section specifies branch
fix/auto-debug-node-return-update-dicts. The actual branch used isfix/issue-10496-auto-debug-state-mutation. Additionally, per CONTRIBUTING.md, bug fix branches must use thebugfix/mN-prefix (notfix/). The correct branch name would have beenbugfix/m2-auto-debug-node-return-update-dicts. Since renaming a pushed branch is disruptive, document this deviation in a follow-up cleanup.BLOCKER 8 — Missing Forgejo dependency link
The PR does not block issue #10496 in Forgejo. Per CONTRIBUTING.md: CORRECT direction is PR → blocks → issue. Currently no dependency links are set in either direction. Add issue #10496 under "blocks" on the PR.
Additional: CHANGELOG missing entry for #10496
The
CHANGELOG.mdwas modified in this commit but contains no entry for theauto_debugfix. The only new entries are for unrelated changes (doc additions, #7582). Add an entry:Non-blocking suggestions
Suggestion: The
_MockLLMand_InvalidValidationLLMclasses in the step file do not extendBaseLanguageModel. Per project rules, all mocks must live infeatures/mocks/only. Consider moving these mock classes there.Suggestion:
_analyze_error(line 130 inauto_debug.py) containsif content == "Mock LLM response"— a test-only guard in production code. This is pre-existing and not introduced by this PR, but worth a follow-up cleanup issue.Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +68,4 @@@given("the auto debug state mutation module is imported")def step_module_imported(context: Any) -> None:"""Verify the auto_debug module is importable."""BLOCKER —
# type: ignoreis prohibited.This
# type: ignore[typeddict-item]suppression must be removed. CONTRIBUTING.md has a zero-tolerance policy for# type: ignore— any PR that adds one is rejected.Why: The
_base_statehelper takes**overrides: Anyand callsstate.update(overrides)on anAutoDebugStateTypedDict, which Pyright flags because arbitraryAnyvalues may not satisfy the TypedDict schema.How to fix: Change the return type to
dict[str, Any]and cast at the call site, or use typed keyword arguments that matchAutoDebugStatefields. Example:Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +7,4 @@Given the auto debug state mutation module is importedScenario: _analyze_error does not mutate the original state objectGiven an auto debug agent for mutation testingBLOCKER — Missing
@tdd_issueand@tdd_issue_10496tags.Every scenario in this file must carry
@tdd_issue @tdd_issue_10496. This is a permanent requirement for all regression tests tied to a bug issue. The CI gate checks for these tags and blocks the merge if absent.How to fix: Add
@tdd_issue @tdd_issue_10496immediately before eachScenario:line. Do NOT add@tdd_expected_fail— that tag is only present on the TDD branch (before the fix).Example:
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
BLOCKER — Unrelated change in this PR.
This change (recording
prompt_definitionas the root decision type duringstart_strategize()) is unrelated to theauto_debugnode state mutation fix. Based on the commit history and CHANGELOG, this is for issue #9061.How to fix: Remove this change from the branch via
git rebase -iand submit it in a separate PR for issue #9061.Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
BLOCKER — Unrelated change in this PR.
This file is not related to the
auto_debugstate mutation fix described in this PR. These changes (thestatus_mapO(n) to O(1) optimisation and thestop_flagin-flight cancellation guard) belong to issue #7582, not #10496.Why this is a blocker: Per CONTRIBUTING.md, each PR must be atomic — addressing exactly one scope. Bundling unrelated service changes makes it impossible to revert the
auto_debugfix without also reverting unrelated work.How to fix: Remove these changes from this branch via
git rebase -iand submit them in a separate PR for their own issue.Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
22076b7cef2c515cedd8Re-Review Summary
Commit reviewed:
2c515cedd8a8cc85b13f29b7192832344393054cThank you for addressing the feedback from the first review. Several major blockers have been resolved.
✅ Prior Feedback ADDRESSED
auto_debug.py,features/tdd_auto_debug_state_mutation.feature, andfeatures/steps/tdd_auto_debug_state_mutation_steps.py. All unrelated changes (subplan_execution_service.py, plan_lifecycle_service.py, .opencode/agents/ configs, benchmark files, and docs) have been removed. This is the most significant improvement and is correctly done.CI / lint,CI / typecheck,CI / security, andCI / integration_testsnow pass.auto_debug.pyproduction code fix is correct and complete. All four node functions (_analyze_error,_generate_fix,_validate_fix,_finalize) properly return partial state update dicts without mutating state in-place. The docstrings and return type annotations (dict[str, Any]) are accurate. This is well-implemented.❌ Still BLOCKING
BLOCKER 1 (residual) —
CI / unit_testsis still failingCI / unit_testsis failing after 5m57s.CI / coverageis skipped (depends on unit_tests). Per CONTRIBUTING.md all CI gates must pass before approval.How to fix: Run
nox -s unit_testslocally, identify the failing scenario(s), fix them, and push a corrected commit.BLOCKER 2 —
# type: ignore[typeddict-item]still present at line 65features/steps/tdd_auto_debug_state_mutation_steps.pyline 65 still containsstate.update(overrides) # type: ignore[typeddict-item]. This was explicitly flagged in the prior review as a zero-tolerance violation. It has not been removed.How to fix: Change
_base_statereturn type fromAutoDebugStatetodict[str, Any]and remove the suppression:BLOCKER 3 —
@tdd_issue @tdd_issue_10496tags still absentfeatures/tdd_auto_debug_state_mutation.featurehas no@tdd_issueor@tdd_issue_10496tags on any scenario. These are a permanent requirement for all bug regression tests. The CI push-validation gate checks for them.How to fix: Add
@tdd_issue @tdd_issue_10496before eachScenario:line. Do NOT add@tdd_expected_fail.BLOCKER 4 — No milestone assigned
The PR has no milestone. Issue #10496 is in v3.2.0. Per CONTRIBUTING.md requirement 12 the PR must be on the same milestone.
How to fix: Set the milestone to v3.2.0 on this PR.
BLOCKER 5 — No
Type/labelThe PR has no labels. Per CONTRIBUTING.md requirement 12, exactly one
Type/label is required. This is a bug fix.How to fix: Apply label
Type/Bugto this PR.BLOCKER 6 — Commit footer missing
ISSUES CLOSED: #10496The commit
2c515cedd8has no body and noISSUES CLOSED:footer. Every commit must reference its issue.How to fix: Amend the commit (it has not been merged) to add:
BLOCKER 7 — CHANGELOG not updated
No entry for the
auto_debugfix has been added toCHANGELOG.md. Per CONTRIBUTING.md requirement 7, one new entry per commit is required.How to fix: Add an entry such as:
BLOCKER 8 — Forgejo dependency link still not set
No Forgejo dependency exists between this PR and issue #10496. The correct direction is: PR blocks issue (PR → blocks → #10496).
How to fix: On this PR, add issue #10496 under the "Blocks" section in the sidebar.
Non-blocking Suggestions
Suggestion:
_MockLLM,_InvalidValidationLLM, and_MockResponseare defined inline in the steps file. Per project rules, mocks belong infeatures/mocks/only. Consider moving them tofeatures/mocks/auto_debug_mocks.py.Suggestion: Once
_base_statereturnsdict[str, Any], consider moving it tofeatures/mocks/as a shared test helper.Summary
The core production code fix is correct and the PR scope is now properly atomic. 8 blockers remain: unit_tests CI failure,
# type: ignore, missing@tdd_issue_10496tags, no milestone, noType/Buglabel, missing commit footer, missing CHANGELOG entry, and missing Forgejo dependency link.Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +62,4 @@"current_fix": {},"fix_validated": False,}state.update(overrides) # type: ignore[typeddict-item]BLOCKER —
# type: ignore[typeddict-item]still present (not addressed from prior review).This suppression was flagged as a zero-tolerance violation in the previous review. It remains in this commit.
Why:
_base_statedeclares its return type asAutoDebugState(a TypedDict) but callsstate.update(overrides)with**Any. Pyright cannot verify the TypedDict schema, hence the suppression.How to fix: Change the return type to
dict[str, Any]and remove the suppression:Step definitions passing the result to node methods will continue to work unchanged at runtime.
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +6,4 @@Background:Given the auto debug state mutation module is importedScenario: _analyze_error does not mutate the original state objectBLOCKER —
@tdd_issue @tdd_issue_10496tags still absent (not addressed from prior review).Every
Scenario:in this regression test file must carry@tdd_issue @tdd_issue_10496. These are a permanent requirement for all bug regression tests and the CI push-validation gate validates their presence.How to fix: Add
@tdd_issue @tdd_issue_10496immediately before eachScenario:line:(and so on for all 5 scenarios)
Do NOT add
@tdd_expected_fail— that tag only belongs on the TDD issue-capture branch before the fix is applied.Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
2c515cedd829c9be7aa2PR Fix — Success
Resolved all 8 review blockers from HAL9001:
@tdd_expected_failfrom pre-existing TDD test for #10494; the auto_debug fix resolved that issue too# type: ignoreremoved — Changed_base_state()return type todict[str, Any], eliminating the TypedDict suppression@tdd_issue @tdd_issue_10496tags added — All 5 BDD scenarios now tagged per TDD workflow requirementsISSUES CLOSED: #10496footerQuality gates: lint ✓, unit_tests ✓, integration_tests ✓, typecheck ✓
Automated by CleverAgents Bot
Supervisor: Implementation | Agent: task-implementor
Re-Review Summary
Commit reviewed:
29c9be7aa2ee95c4a83abd79c118ad7c36fa3800All 8 blocking issues from the prior reviews have been successfully resolved. This PR passes all review criteria.
Prior Feedback — All Addressed ✅
# type: ignore[typeddict-item]in step defs_base_state()now returnsdict[str, Any]@tdd_issue @tdd_issue_10496tagsISSUES CLOSED: #10496Full Review Checklist
CORRECTNESS ✅ — All four node functions (
_analyze_error,_generate_fix,_validate_fix,_finalize) returndict[str, Any]partial update dicts. No in-place mutations._validate_fixcorrectly returns two keys on failure.TEST QUALITY ✅ — 5 BDD regression scenarios with
@tdd_issue @tdd_issue_10496covering all four node functions and the retry branch. Usesdeepcopy/length snapshots for immutability verification. Pre-existing@tdd_expected_failfor #10494 correctly removed.TYPE SAFETY ✅ — Zero
# type: ignorein the PR. All signatures annotated.DOCUMENTATION ✅ — All four node functions have docstrings. CHANGELOG entry present.
COMMIT AND PR QUALITY ✅ — Single atomic commit, correct format,
ISSUES CLOSED: #10496footer, v3.2.0 milestone, Type/Bug label, proper dependency.Non-Blocking Suggestions
Suggestion:
_MockLLM,_InvalidValidationLLM, and_MockResponseare defined inline in the steps file. Per project rules, mocks belong infeatures/mocks/only. Considerfeatures/mocks/auto_debug_mocks.pyin a follow-up.Note: Branch name
fix/issue-10496-auto-debug-state-mutationdoes not match issue Metadata (fix/auto-debug-node-return-update-dicts) and usesfix/instead ofbugfix/m2-. Non-blocking cosmetic deviation documented in prior review.Verdict
All blocking issues resolved. Core fix correct. CI green. PR meets all 12 submission requirements. Ready for merge.
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker
[CONTROLLER-DEFER:Gate 1:needs_evaluation]
This PR has been deferred for re-evaluation. The controller has stepped back
from processing it. To resume, a human or scope-evaluator must clear the
deferral flag AND re-add the auto/sentinel label.
Decision:
To clear the deferral (SQL):
UPDATE workflows SET deferred_reason=NULL,
deferred_at=NULL,
deferred_target_workflow_id=NULL
WHERE workflow_id = 507;
Audit ID: 176869
Automated by the CleverAgents controller pipeline.
Identity: HAL9000 (pipeline action)
🌱 Grooming: proceed — PR cleared for processing.
(check
no_duplicates, categoryno_duplicates)PR #11155 addresses a specific LangGraph contract violation in AutoDebugAgent (issue #10496): node functions returning full state dicts instead of partial update dicts, causing double-appending and aliasing bugs. Scanned all 238 open PRs for overlapping scope (same issue, same agent, state mutation fixes). No PR references issue #10496, mentions auto_debug.py, or addresses AutoDebugAgent state semantics. Related agent work addresses different modules/agents. This is a focused, isolated bug fix with no duplicates in the pool.
📋 Estimate: tier 1.
Multi-file change (5 files, +349/-27) targeting 4 node functions in auto_debug.py to return partial update dicts instead of mutating state in-place, satisfying the LangGraph StateGraph contract. The logic change is well-bounded to one agent file but requires understanding LangGraph merge semantics (partial vs full-state returns). Substantial new BDD test coverage added (deepcopy/snapshot verification across all four functions including the validation retry branch). Fits Tier 1 cleanly: multi-file, new test files, cross-file context needed, standard engineering work with meaningful correctness implications.
(attempt #7, tier 1)
🔧 Implementer attempt —
rebase-failed.Blockers:
29c9be7aa25e71221f61(attempt #9, tier 1)
🔧 Implementer attempt —
blocked.Blockers:
fix/issue-10496-auto-debug-state-mutationHEAD is5e71221f6("fix(tui): resolve lint and AmbiguousStep errors in TuiMaterializer"), a master commit entirely unrelated to PR #11155.git log origin/master..HEADis empty — the branch has zero commits ahead of master. The conflict resolver appears to have reset or clobbered the branch to master HEAD, losing all auto_debug state-mutation commits (including the29c9be7aacommit that freemo approved). Cannot implement anything without the PR's changes present on the branch. The controller must restore the branch from the last known-good commit (29c9be7aa2ee95c4a83abd79c118ad7c36fa3800) and re-run conflict resolution if needed.(attempt #10, tier 2)
🔧 Implementer attempt —
blocked.Blockers:
fix/issue-10496-auto-debug-state-mutationHEAD is8ee9d5944c03ef2bb1ed0072ab502545574d6e1c— a master merge commit for PR #10772 ("feat(context): implement PriorityContextStrategy"), entirely unrelated to PR #11155.git log origin/master..HEADis empty: the branch has ZERO commits ahead of master. Two additional anomalies: (1) the prompt declaredhead_sha=5e71221f615e673d7dd410b6872c958100f822cabut actual HEAD is8ee9d5944c03ef2bb1ed0072ab502545574d6e1c— the controller's snapshot is stale or the branch was force-pushed between dispatch and now; (2) the diff summary shows0 files, +0, -0, consistent with an empty branch. The reviewer-approved commit29c9be7aa2ee95c4a83abd79c118ad7c36fa3800(per freemo's 2026-05-13 approval) is absent from the branch — all auto_debug state-mutation work for #10496 has been lost. There is nothing to verify (verified-cleaninappropriate), no CI verdict to wait for (ci-not-readyinappropriate — CI is meaningless on an empty branch), and no factual reviewer claim to dispute (reviewer feedback is moot when zero PR code exists). The git contract forbids me fromrebase/reset --hard/cherry-pick/restore --source=, which are the only operations that could restore the lost commit. Recommended controller actions: (a) restore the branch by force-pushing29c9be7aa2ee95c4a83abd79c118ad7c36fa3800(the last known-good reviewer-approved SHA) ontofix/issue-10496-auto-debug-state-mutation, OR (b) close PR #11155 and abandon the workflow if the upstream conflict-resolver is repeatedly clobbering the branch (root-cause investigation needed — this is the second tier attempt observing the same loss, suggesting a pipeline-level bug, not a per-PR transient). Until either action is taken, the implementer cannot make progress within the git contract.🌱 Grooming: proceed — PR cleared for processing.
(check
no_duplicates, categoryno_duplicates)PR #11155 fixes a specific LangGraph StateGraph contract violation in auto_debug.py (issue #10496) where four node functions were mutating input state dicts in-place instead of returning partial update dicts. Scanned all 218 open PRs: no other PR mentions auto_debug, issue #10496, or addresses the same state mutation problem. The only tangentially related PR (#11239) is a broader langgraph library extraction refactor with different scope and issue targets.
📋 Estimate: tier 1.
4-file change (+117/-42) touching auto_debug.py source and adding a new BDD feature file with tests covering all four node functions. The fix pattern is consistent but requires understanding LangGraph's StateGraph merge contract and the aliasing/mutation semantics — not purely mechanical. Multi-file, new test code, non-trivial logic: solidly tier 1. CI is green. No architectural or cross-subsystem impact warrants tier 2.
a854b006880330889b1d✅ Approved
Reviewed at commit
0330889.Confidence: high.
Claimed by
merge_drive.py(pid 2202036) until2026-06-17T07:13:49.332241+00:00.This claim is advisory and will be released when the cycle ends, or after the TTL by a sibling driver's expired-claim sweep.
0330889b1d7feab6d29dApproved by the controller reviewer stage (workflow 507).