Clarify verification handoff
Authored by
mfwolffe <wolffemf@dukes.jmu.edu>
- SHA
8b1407bbd52358cb2def7df0e12fc4de777de73b- Parents
-
d22c38c - Tree
72f8922
8b1407b
8b1407bbd52358cb2def7df0e12fc4de777de73bd22c38c
72f8922| Status | File | + | - |
|---|---|---|---|
| M |
src/loader/runtime/hooks.py
|
2 | 2 |
| M |
src/loader/runtime/parsing.py
|
3 | 1 |
| M |
src/loader/runtime/tool_batches.py
|
29 | 20 |
| M |
tests/test_tool_batches.py
|
26 | 19 |
src/loader/runtime/hooks.pymodified@@ -964,8 +964,8 @@ class LateReferenceDriftHook(BaseToolHook): | ||
| 964 | 964 | message=( |
| 965 | 965 | "[Blocked - post-build audit loop: all explicitly planned artifacts " |
| 966 | 966 | "already exist and the current output set has already been inspected " |
| 967 | - "several times.] Suggestion: move to verification now or make one " | |
| 968 | - "concrete edit for a specific mismatch inside " | |
| 967 | + "several times.] Suggestion: finish with a final response so Loader " | |
| 968 | + "can verify automatically, or make one concrete edit for a specific mismatch inside " | |
| 969 | 969 | f"{roots_preview} instead of more rereads." |
| 970 | 970 | ), |
| 971 | 971 | terminal_state="blocked", |
src/loader/runtime/parsing.pymodified@@ -443,7 +443,9 @@ def format_tool_result(tool_name: str, result: str, is_error: bool = False) -> s | ||
| 443 | 443 | if next_pending: |
| 444 | 444 | summary_parts.append(f"next pending: {next_pending}") |
| 445 | 445 | if payload.get("verification_nudge_needed") is True: |
| 446 | - summary_parts.append("verification should be reviewed next") | |
| 446 | + summary_parts.append( | |
| 447 | + "final response should be provided next for Loader verification" | |
| 448 | + ) | |
| 447 | 449 | result = "; ".join(summary_parts) |
| 448 | 450 | |
| 449 | 451 | prefix = "Error" if is_error else "Result" |
src/loader/runtime/tool_batches.pymodified@@ -140,6 +140,13 @@ _MUTATING_BASH_FRAGMENTS = ( | ||
| 140 | 140 | ) |
| 141 | 141 | |
| 142 | 142 | |
| 143 | +def _verification_handoff_instruction() -> str: | |
| 144 | + return ( | |
| 145 | + "Finish with a final response now so Loader can run verification automatically. " | |
| 146 | + "Do not run more ad hoc audit commands unless you know a specific mismatch to repair." | |
| 147 | + ) | |
| 148 | + | |
| 149 | + | |
| 143 | 150 | @dataclass |
| 144 | 151 | class ToolBatchResult: |
| 145 | 152 | """Outcome of running one assistant-proposed tool batch.""" |
@@ -439,12 +446,12 @@ class ToolBatchRunner: | ||
| 439 | 446 | guidance = ( |
| 440 | 447 | "The remaining work is review/verification of the generated files. " |
| 441 | 448 | "Do not ask the user for more clarification about the reference pattern now. " |
| 442 | - "Use the generated files as the source of truth and move to verification or " | |
| 443 | - "repair from concrete failures in those files." | |
| 449 | + "Use the generated files as the source of truth and repair any concrete failures " | |
| 450 | + f"in those files. {_verification_handoff_instruction()}" | |
| 444 | 451 | ) |
| 445 | 452 | if verification_commands: |
| 446 | 453 | self.context.workflow_mode = "verify" |
| 447 | - guidance += " Verification should run next." | |
| 454 | + guidance += " Do not run more ad hoc audit commands." | |
| 448 | 455 | |
| 449 | 456 | self.context.queue_steering_message(guidance) |
| 450 | 457 | message = Message.tool_result_message( |
@@ -591,7 +598,7 @@ class ToolBatchRunner: | ||
| 591 | 598 | supplement_existing=True, |
| 592 | 599 | ) |
| 593 | 600 | verification_suffix = ( |
| 594 | - "Move to verification or final confirmation using the files already on disk." | |
| 601 | + _verification_handoff_instruction() | |
| 595 | 602 | if verification_commands |
| 596 | 603 | else "Finish the current review using the files already on disk." |
| 597 | 604 | ) |
@@ -729,7 +736,7 @@ class ToolBatchRunner: | ||
| 729 | 736 | |
| 730 | 737 | if next_pending and _todo_is_consistency_review_step(next_pending): |
| 731 | 738 | verification_suffix = ( |
| 732 | - " If no specific mismatch remains, move to verification now." | |
| 739 | + " If no specific mismatch remains, finish with a final response so Loader can verify." | |
| 733 | 740 | if verification_commands |
| 734 | 741 | else " If no specific mismatch remains, finish the task now." |
| 735 | 742 | ) |
@@ -748,12 +755,13 @@ class ToolBatchRunner: | ||
| 748 | 755 | "All explicitly planned artifacts already exist. " |
| 749 | 756 | f"Use the generated files under {roots_preview} as the source of truth and stop broad rereads. " |
| 750 | 757 | "If you already know a concrete mismatch, fix it directly. " |
| 751 | - "Verification should run next. Do not reopen reference materials or keep auditing the same files." | |
| 758 | + f"{_verification_handoff_instruction()} Do not reopen reference materials " | |
| 759 | + "or keep auditing the same files." | |
| 752 | 760 | ) |
| 753 | 761 | return |
| 754 | 762 | |
| 755 | 763 | verification_suffix = ( |
| 756 | - "Move to verification or final confirmation using the files already on disk." | |
| 764 | + _verification_handoff_instruction() | |
| 757 | 765 | if verification_commands |
| 758 | 766 | else "Finish the task using the files already on disk." |
| 759 | 767 | ) |
@@ -946,7 +954,7 @@ class ToolBatchRunner: | ||
| 946 | 954 | f"with `{next_pending}` using the generated files as the source of truth. " |
| 947 | 955 | "Do not reopen earlier reference materials." |
| 948 | 956 | + ( |
| 949 | - " Verification should run next using those generated files." | |
| 957 | + " Finish with a final response so Loader can verify those generated files." | |
| 950 | 958 | if verification_commands |
| 951 | 959 | else "" |
| 952 | 960 | ) |
@@ -956,7 +964,7 @@ class ToolBatchRunner: | ||
| 956 | 964 | self.context.queue_steering_message( |
| 957 | 965 | "All explicitly planned artifacts already exist. " |
| 958 | 966 | f"Stay within the current output roots under {roots_preview} " |
| 959 | - "and move to verification or final confirmation using the generated files. " | |
| 967 | + "and finish with a final response so Loader can verify the generated files. " | |
| 960 | 968 | "Do not reopen earlier reference materials." |
| 961 | 969 | ) |
| 962 | 970 | |
@@ -992,7 +1000,7 @@ class ToolBatchRunner: | ||
| 992 | 1000 | ) |
| 993 | 1001 | if all_planned_artifacts_exist(dod, project_root=self.context.project_root): |
| 994 | 1002 | verification_suffix = ( |
| 995 | - " Move to verification or final confirmation using the files already on disk." | |
| 1003 | + " " + _verification_handoff_instruction() | |
| 996 | 1004 | if verification_commands |
| 997 | 1005 | else " If no concrete mismatch remains, stop editing and finish from the files already on disk." |
| 998 | 1006 | ) |
@@ -1110,7 +1118,7 @@ class ToolBatchRunner: | ||
| 1110 | 1118 | supplement_existing=True, |
| 1111 | 1119 | ) |
| 1112 | 1120 | verification_suffix = ( |
| 1113 | - " Move to verification or final confirmation using the files already on disk." | |
| 1121 | + " " + _verification_handoff_instruction() | |
| 1114 | 1122 | if verification_commands |
| 1115 | 1123 | else " Finish the task using the files already on disk." |
| 1116 | 1124 | ) |
@@ -1169,7 +1177,7 @@ class ToolBatchRunner: | ||
| 1169 | 1177 | supplement_existing=True, |
| 1170 | 1178 | ) |
| 1171 | 1179 | verification_suffix = ( |
| 1172 | - " Move to verification or final confirmation using the files already on disk." | |
| 1180 | + " " + _verification_handoff_instruction() | |
| 1173 | 1181 | if verification_commands |
| 1174 | 1182 | else " Finish the task using the files already on disk." |
| 1175 | 1183 | ) |
@@ -1410,7 +1418,7 @@ class ToolBatchRunner: | ||
| 1410 | 1418 | project_root=self.context.project_root, |
| 1411 | 1419 | ) |
| 1412 | 1420 | ): |
| 1413 | - summary_parts.append("verification should be reviewed next") | |
| 1421 | + summary_parts.append("final response should be provided next for Loader verification") | |
| 1414 | 1422 | |
| 1415 | 1423 | result = "; ".join(summary_parts) |
| 1416 | 1424 | content = f"Observation [TodoWrite]: Result: {result}" |
@@ -1559,7 +1567,7 @@ class ToolBatchRunner: | ||
| 1559 | 1567 | |
| 1560 | 1568 | if next_pending and _todo_is_consistency_review_step(next_pending): |
| 1561 | 1569 | verification_suffix = ( |
| 1562 | - " Move to verification once no specific mismatch remains." | |
| 1570 | + " Finish with a final response once no specific mismatch remains so Loader can verify." | |
| 1563 | 1571 | if verification_commands |
| 1564 | 1572 | else " Avoid another full reread unless one specific inconsistency is still unknown." |
| 1565 | 1573 | ) |
@@ -1576,8 +1584,8 @@ class ToolBatchRunner: | ||
| 1576 | 1584 | self.context.queue_steering_message( |
| 1577 | 1585 | "All explicitly planned artifacts now exist on disk. " |
| 1578 | 1586 | "Do not expand the artifact set or restart discovery unless a specific gap is " |
| 1579 | - "still known. Move to verification or final confirmation using the files that " | |
| 1580 | - "already exist." | |
| 1587 | + "still known. Finish with a final response now so Loader can verify the files " | |
| 1588 | + "that already exist." | |
| 1581 | 1589 | ) |
| 1582 | 1590 | |
| 1583 | 1591 | def _queue_missing_artifact_progress_nudge( |
@@ -1818,7 +1826,7 @@ class ToolBatchRunner: | ||
| 1818 | 1826 | ) |
| 1819 | 1827 | if next_pending and _todo_is_consistency_review_step(next_pending): |
| 1820 | 1828 | verification_suffix = ( |
| 1821 | - " Move to verification once no specific mismatch remains." | |
| 1829 | + " Finish with a final response once no specific mismatch remains so Loader can verify." | |
| 1822 | 1830 | if verification_commands |
| 1823 | 1831 | else " Finish the targeted consistency pass without reopening reference materials." |
| 1824 | 1832 | ) |
@@ -1835,14 +1843,15 @@ class ToolBatchRunner: | ||
| 1835 | 1843 | self.context.set_workflow_mode("verify") |
| 1836 | 1844 | self.context.queue_steering_message( |
| 1837 | 1845 | "Todo tracking is updated. All explicitly planned artifacts now exist on disk. " |
| 1838 | - "Verification should run next. Use the current output files as the source of truth, " | |
| 1839 | - "and do not restart discovery, reopen reference materials, or spend another turn " | |
| 1846 | + "Finish with a final response now so Loader can run verification automatically. " | |
| 1847 | + "Use the current output files as the source of truth, and do not restart discovery, " | |
| 1848 | + "reopen reference materials, run more ad hoc audit commands, or spend another turn " | |
| 1840 | 1849 | "on TodoWrite alone." |
| 1841 | 1850 | ) |
| 1842 | 1851 | return |
| 1843 | 1852 | |
| 1844 | 1853 | verification_suffix = ( |
| 1845 | - " Move to verification or final confirmation using the files already on disk." | |
| 1854 | + " " + _verification_handoff_instruction() | |
| 1846 | 1855 | if verification_commands |
| 1847 | 1856 | else " Finish the task using the files already on disk." |
| 1848 | 1857 | ) |
tests/test_tool_batches.pymodified@@ -1957,7 +1957,7 @@ async def test_tool_batch_runner_duplicate_read_after_plan_complete_pushes_verif | ||
| 1957 | 1957 | assert len(persistent_messages) == 1 |
| 1958 | 1958 | assert "All explicitly planned artifacts already exist on disk." in persistent_messages[0] |
| 1959 | 1959 | assert ( |
| 1960 | - "Move to verification or final confirmation using the files already on disk." | |
| 1960 | + "Finish with a final response now so Loader can run verification automatically." | |
| 1961 | 1961 | in persistent_messages[0] |
| 1962 | 1962 | ) |
| 1963 | 1963 | assert "Create 07-performance-tuning.html" not in persistent_messages[0] |
@@ -2078,7 +2078,7 @@ async def test_tool_batch_runner_duplicate_read_after_plan_complete_ignores_stal | ||
| 2078 | 2078 | assert len(persistent_messages) == 1 |
| 2079 | 2079 | assert "All explicitly planned artifacts already exist on disk." in persistent_messages[0] |
| 2080 | 2080 | assert ( |
| 2081 | - "Move to verification or final confirmation using the files already on disk." | |
| 2081 | + "Finish with a final response now so Loader can run verification automatically." | |
| 2082 | 2082 | in persistent_messages[0] |
| 2083 | 2083 | ) |
| 2084 | 2084 | assert "Create 01-getting-started.html" not in persistent_messages[0] |
@@ -2196,7 +2196,7 @@ async def test_tool_batch_runner_successful_read_after_plan_complete_pushes_revi | ||
| 2196 | 2196 | assert "Ensure all files are properly linked and formatted consistently" in message |
| 2197 | 2197 | assert "Create 01-getting-started.html" not in message |
| 2198 | 2198 | assert "do not keep broad-rereading the output set" in message |
| 2199 | - assert "If no specific mismatch remains, move to verification now." in message | |
| 2199 | + assert "If no specific mismatch remains, finish with a final response so Loader can verify." in message | |
| 2200 | 2200 | |
| 2201 | 2201 | |
| 2202 | 2202 | @pytest.mark.asyncio |
@@ -2289,7 +2289,7 @@ async def test_tool_batch_runner_successful_read_after_plan_complete_switches_to | ||
| 2289 | 2289 | |
| 2290 | 2290 | assert len(persistent_messages) == 1 |
| 2291 | 2291 | assert "All explicitly planned artifacts already exist." in persistent_messages[0] |
| 2292 | - assert "Verification should run next." in persistent_messages[0] | |
| 2292 | + assert "Finish with a final response now so Loader can run verification automatically." in persistent_messages[0] | |
| 2293 | 2293 | assert "stop broad rereads" in persistent_messages[0] |
| 2294 | 2294 | assert ephemeral_messages == [] |
| 2295 | 2295 | assert context.workflow_mode == "verify" |
@@ -3377,7 +3377,8 @@ async def test_tool_batch_runner_hands_off_to_verification_once_planned_artifact | ||
| 3377 | 3377 | for message in persistent_messages |
| 3378 | 3378 | ) |
| 3379 | 3379 | assert any( |
| 3380 | - "Move to verification once no specific mismatch remains." in message | |
| 3380 | + "Finish with a final response once no specific mismatch remains so Loader can verify." | |
| 3381 | + in message | |
| 3381 | 3382 | for message in persistent_messages |
| 3382 | 3383 | ) |
| 3383 | 3384 | |
@@ -4025,7 +4026,10 @@ async def test_tool_batch_runner_todowrite_after_artifacts_exist_pushes_verifica | ||
| 4025 | 4026 | message = queued_messages[-1] |
| 4026 | 4027 | assert "Todo tracking is updated. All explicitly planned artifacts now exist on disk." in message |
| 4027 | 4028 | assert "Verify all guide files are linked and complete" in message |
| 4028 | - assert "Move to verification once no specific mismatch remains." in message | |
| 4029 | + assert ( | |
| 4030 | + "Finish with a final response once no specific mismatch remains so Loader can verify." | |
| 4031 | + in message | |
| 4032 | + ) | |
| 4029 | 4033 | assert "reopen reference materials" in message |
| 4030 | 4034 | assert "Fortran guide structure" not in message |
| 4031 | 4035 | assert context.workflow_mode == "execute" |
@@ -4163,7 +4167,7 @@ async def test_tool_batch_runner_todowrite_after_outputs_exist_but_links_missing | ||
| 4163 | 4167 | assert queued_messages |
| 4164 | 4168 | message = queued_messages[-1] |
| 4165 | 4169 | assert "Todo tracking is updated. All explicitly planned artifacts now exist on disk." in message |
| 4166 | - assert "Verification should run next." in message | |
| 4170 | + assert "Finish with a final response now so Loader can run verification automatically." in message | |
| 4167 | 4171 | assert "Repair or verify the current files instead of expanding the artifact set." not in message |
| 4168 | 4172 | assert context.workflow_mode == "verify" |
| 4169 | 4173 | |
@@ -4285,7 +4289,7 @@ async def test_tool_batch_runner_preempts_post_build_audit_after_todowrite_verif | ||
| 4285 | 4289 | assert len(summary.tool_result_messages) == 1 |
| 4286 | 4290 | assert context.workflow_mode == "verify" |
| 4287 | 4291 | assert queued_messages |
| 4288 | - assert "Verification should run next." in queued_messages[-1] | |
| 4292 | + assert "Finish with a final response now so Loader can run verification automatically." in queued_messages[-1] | |
| 4289 | 4293 | |
| 4290 | 4294 | |
| 4291 | 4295 | @pytest.mark.asyncio |
@@ -4409,12 +4413,15 @@ async def test_tool_batch_runner_todowrite_complete_directory_plan_does_not_rein | ||
| 4409 | 4413 | assert result.continue_after_batch is True |
| 4410 | 4414 | assert queued_messages |
| 4411 | 4415 | message = queued_messages[-1] |
| 4412 | - assert "Verification should run next." in message | |
| 4416 | + assert "Finish with a final response now so Loader can run verification automatically." in message | |
| 4413 | 4417 | assert "01-introduction.html" not in message |
| 4414 | 4418 | assert "chapter files" not in message.lower() |
| 4415 | 4419 | assert context.workflow_mode == "verify" |
| 4416 | 4420 | assert summary.tool_result_messages |
| 4417 | - assert "verification should be reviewed next" in summary.tool_result_messages[-1].content | |
| 4421 | + assert ( | |
| 4422 | + "final response should be provided next for Loader verification" | |
| 4423 | + in summary.tool_result_messages[-1].content | |
| 4424 | + ) | |
| 4418 | 4425 | assert "fortran guide structure" not in summary.tool_result_messages[-1].content.lower() |
| 4419 | 4426 | |
| 4420 | 4427 | |
@@ -4532,7 +4539,7 @@ async def test_tool_batch_runner_preempts_post_build_observation_batch_for_verif | ||
| 4532 | 4539 | assert [call.id for call in executor.calls] == ["bash-post-build-audit"] |
| 4533 | 4540 | assert context.workflow_mode == "verify" |
| 4534 | 4541 | assert queued_messages |
| 4535 | - assert "Verification should run next." in queued_messages[-1] | |
| 4542 | + assert "Finish with a final response now so Loader can run verification automatically." in queued_messages[-1] | |
| 4536 | 4543 | |
| 4537 | 4544 | |
| 4538 | 4545 | @pytest.mark.asyncio |
@@ -4759,7 +4766,7 @@ async def test_tool_batch_runner_skips_post_build_user_question_during_consisten | ||
| 4759 | 4766 | assert queued_messages |
| 4760 | 4767 | assert "The remaining work is review/verification of the generated files." in queued_messages[-1] |
| 4761 | 4768 | assert "Do not ask the user for more clarification about the reference pattern now." in queued_messages[-1] |
| 4762 | - assert "Verification should run next." in queued_messages[-1] | |
| 4769 | + assert "Finish with a final response now so Loader can run verification automatically." in queued_messages[-1] | |
| 4763 | 4770 | assert context.workflow_mode == "verify" |
| 4764 | 4771 | assert summary.tool_result_messages |
| 4765 | 4772 | assert "Skipped - stale post-build user question" in summary.tool_result_messages[-1].content |
@@ -4878,7 +4885,7 @@ async def test_tool_batch_runner_rewrites_stale_todowrite_summary_from_reconcile | ||
| 4878 | 4885 | assert summary.tool_result_messages |
| 4879 | 4886 | message = summary.tool_result_messages[-1].content |
| 4880 | 4887 | assert "updated todo list" in message |
| 4881 | - assert "verification should be reviewed next" in message | |
| 4888 | + assert "final response should be provided next for Loader verification" in message | |
| 4882 | 4889 | assert "next pending:" not in message |
| 4883 | 4890 | assert "fortran guide structure" not in message.lower() |
| 4884 | 4891 | |
@@ -5034,7 +5041,7 @@ async def test_tool_batch_runner_todowrite_drops_unplanned_expansion_after_outpu | ||
| 5034 | 5041 | assert queued_messages |
| 5035 | 5042 | message = queued_messages[-1] |
| 5036 | 5043 | assert "Todo tracking is updated. All explicitly planned artifacts now exist on disk." in message |
| 5037 | - assert "Verification should run next." in message | |
| 5044 | + assert "Finish with a final response now so Loader can run verification automatically." in message | |
| 5038 | 5045 | assert "Repair or verify the current files instead of expanding the artifact set." not in message |
| 5039 | 5046 | assert "08-troubleshooting.html" not in message |
| 5040 | 5047 | assert context.workflow_mode == "verify" |
@@ -6369,7 +6376,7 @@ def test_tool_batch_runner_blocked_noop_edit_after_full_build_prefers_verificati | ||
| 6369 | 6376 | |
| 6370 | 6377 | assert queued |
| 6371 | 6378 | assert "All explicitly planned artifacts already exist." in queued[0] |
| 6372 | - assert "Move to verification or final confirmation using the files already on disk." in queued[0] | |
| 6379 | + assert "Finish with a final response now so Loader can run verification automatically." in queued[0] | |
| 6373 | 6380 | assert "replace the surrounding block" not in queued[0] |
| 6374 | 6381 | |
| 6375 | 6382 | |
@@ -6950,7 +6957,7 @@ def test_tool_batch_runner_blocked_completed_artifact_scope_nudge_prefers_verifi | ||
| 6950 | 6957 | assert "All explicitly planned artifacts already exist." in queued[0] |
| 6951 | 6958 | assert "Verify all guide files are linked and complete" in queued[0] |
| 6952 | 6959 | assert "Do not reopen earlier reference materials." in queued[0] |
| 6953 | - assert "Verification should run next" in queued[0] | |
| 6960 | + assert "Finish with a final response so Loader can verify" in queued[0] | |
| 6954 | 6961 | |
| 6955 | 6962 | |
| 6956 | 6963 | def test_tool_batch_runner_blocked_post_build_audit_nudge_switches_to_verify( |
@@ -7021,7 +7028,7 @@ def test_tool_batch_runner_blocked_post_build_audit_nudge_switches_to_verify( | ||
| 7021 | 7028 | assert queued |
| 7022 | 7029 | assert context.workflow_mode == "verify" |
| 7023 | 7030 | assert "All explicitly planned artifacts already exist." in queued[0] |
| 7024 | - assert "move to verification or final confirmation" in queued[0] | |
| 7031 | + assert "finish with a final response so Loader can verify" in queued[0] | |
| 7025 | 7032 | |
| 7026 | 7033 | |
| 7027 | 7034 | @pytest.mark.asyncio |
@@ -7130,7 +7137,7 @@ async def test_tool_batch_runner_does_not_halt_on_repeated_post_build_audit_bloc | ||
| 7130 | 7137 | assert result.consecutive_errors == 0 |
| 7131 | 7138 | assert context.workflow_mode == "verify" |
| 7132 | 7139 | assert queued |
| 7133 | - assert any("move to verification or final confirmation" in message for message in queued) | |
| 7140 | + assert any("finish with a final response so Loader can verify" in message for message in queued) | |
| 7134 | 7141 | |
| 7135 | 7142 | |
| 7136 | 7143 | def test_tool_batch_runner_blocked_html_declared_target_nudge_uses_closest_declared_target( |
@@ -7374,7 +7381,7 @@ def test_tool_batch_runner_blocked_html_declared_file_creation_after_outputs_exi | ||
| 7374 | 7381 | assert queued |
| 7375 | 7382 | assert "All explicitly planned artifacts already exist on disk." in queued[0] |
| 7376 | 7383 | assert "Do not expand the output set with `chapters/08-advanced-configuration.html`." in queued[0] |
| 7377 | - assert "Move to verification or final confirmation using the files already on disk." in queued[0] | |
| 7384 | + assert "Finish with a final response now so Loader can run verification automatically." in queued[0] | |
| 7378 | 7385 | assert "update the guide root" not in queued[0] |
| 7379 | 7386 | |
| 7380 | 7387 | |