From 7a648792c97e5779564c1d190584a465f9e58bf8 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 12 Oct 2026 14:18:55 +0800 Subject: [PATCH 1/7] feat(replan): add opt-in versioned structured stride control Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../src/data/capability-configuration.ts | 4 +- .../capability-localization.ts | 6 +- .../src/features/personal-workspace/i18n.tsx | 4 +- loopx/capabilities/configuration_ui.py | 4 + .../todo_replan_cadence/goal_configuration.py | 3 + .../todo_replan_cadence/machine_defaults.py | 29 ++-- loopx/chat_goal_configuration_api.py | 7 +- loopx/cli_commands/registry_admin.py | 2 + .../cli_commands/registry_admin_configure.py | 9 ++ loopx/configuration_catalog.py | 9 +- loopx/configure_goal.py | 3 + .../goals/goal_frontier/__init__.py | 1 + loopx/control_plane/goals/goal_vision.py | 5 + .../goals/goal_vision_read_model.py | 2 + .../control_plane/goals/vision_checkpoint.ts | 21 +++ loopx/control_plane/quota/turn_envelope.ts | 2 +- .../control_plane/stride_decision_schema.json | 7 + .../control_plane/stride_strategy_schema.json | 7 + .../work_items/progress_observation.py | 5 +- .../work_items/replan_context.ts | 126 ++++++++++++++++- .../work_items/replan_context_codec.py | 24 +++- .../work_items/replan_semantics.ts | 27 +++- .../control_plane/work_items/stride_policy.ts | 130 ++++++++++++++++++ .../work_items/stride_policy_codec.py | 23 ++++ loopx/execution_profile.py | 23 +++- .../project_registry_io_manifest_v1.json | 4 +- loopx/state_refresh.py | 2 +- 27 files changed, 449 insertions(+), 40 deletions(-) create mode 100644 loopx/control_plane/stride_decision_schema.json create mode 100644 loopx/control_plane/stride_strategy_schema.json create mode 100644 loopx/control_plane/work_items/stride_policy.ts create mode 100644 loopx/control_plane/work_items/stride_policy_codec.py diff --git a/apps/presentation/dashboard/src/data/capability-configuration.ts b/apps/presentation/dashboard/src/data/capability-configuration.ts index a33931a0a7..c87ceb214e 100644 --- a/apps/presentation/dashboard/src/data/capability-configuration.ts +++ b/apps/presentation/dashboard/src/data/capability-configuration.ts @@ -56,9 +56,9 @@ export function parseEditableCapabilityJson( export function replanCadenceEditorValue(value: unknown): unknown { const record = configurationObject(value); if (Object.hasOwn(record, "completed_todos") && !Object.hasOwn(record, "count_unit")) { - return { count_unit: "completed_todos", count: record.completed_todos }; + return { count_unit: "completed_todos", count: record.completed_todos, stride_strategy: "off" }; } - return value; + return { ...record, stride_strategy: record.stride_strategy ?? "off" }; } /** A v0 storage selector did not enable creation; opening Settings must not. */ diff --git a/apps/presentation/dashboard/src/features/personal-workspace/capability-localization.ts b/apps/presentation/dashboard/src/features/personal-workspace/capability-localization.ts index df82a8e38e..235c44f1d6 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/capability-localization.ts +++ b/apps/presentation/dashboard/src/features/personal-workspace/capability-localization.ts @@ -22,7 +22,7 @@ const capabilityCopy: Record> = { displayName: "Model and executor", description: "Guides the steward executor, model, and selection boundary for this machine. A pinned route blocks substitution; a flexible pool permits only authorized fallback.", }, - todo_replan_cadence: { displayName: "Goal review cadence", description: "Configures the Goal review cadence." }, + todo_replan_cadence: { displayName: "Goal review and stride", description: "Set review frequency and optionally choose a versioned stride strategy for work scope and route changes." }, change_quality_qualification: { displayName: "Change quality qualification", description: "Prepares a provider-neutral review packet, allows at most one policy-authorized safe-fix pass, and can require an exact-diff receipt.", @@ -89,7 +89,7 @@ const capabilityCopy: Record> = { displayName: "模型与执行器", description: "配置本机管家的执行器、模型与选择边界;锁定路径禁止替代,灵活池只允许在已授权范围内回退。", }, - todo_replan_cadence: { displayName: "Goal 复核周期", description: "配置 Goal 的复核周期。" }, + todo_replan_cadence: { displayName: "Goal 复盘与步幅", description: "设置复盘周期,可选用带版本的步幅策略,调节工作大小与路线变化。" }, change_quality_qualification: { displayName: "变更质量验证", description: "生成与 Provider 无关的审阅包,最多允许一次策略授权的安全修复,并可要求精确 diff 回执。", @@ -159,6 +159,7 @@ const fieldCopy: Record = { executor_model: { label: "Model", description: "Optional model for the selected executor. Leave blank to keep the executor's own default." }, executor_reasoning_effort: { label: "Reasoning effort", description: "Optional reasoning effort for the selected executor. Leave blank to keep the executor's own default." }, count_unit: { label: "Review after", description: "Work Turns require accepted settlement; polls and retries do not count.", options: { completed_todos: "Completed Todos", effective_turns: "Settled work Turns" } }, + stride_strategy: { label: "Stride strategy", description: "Structured work scope, route and validation proposals are required for enabled fresh Vision reviews. Does not grant execution authority.", options: { off: "Off", evidence_conditioned_v1: "Evidence-conditioned · v1" } }, count: { label: "Number between reviews", description: "Settled work Turns: 1–6; completed Todos: 1–5. Goal overrides take precedence over device defaults." }, allowed_domains: { label: "Allowed responsibility domains", description: "Enter one bounded, public-safe domain per line." }, coordinator_agent_id: { label: "Coordinator Agent", description: "Use an already registered Agent id; leave blank to disable coordination." }, @@ -191,6 +192,7 @@ const fieldCopy: Record = { executor_model: { label: "模型", description: "所选执行器使用的模型,可留空;留空表示沿用执行器自身的默认模型。" }, executor_reasoning_effort: { label: "推理档位", description: "所选执行器使用的推理档位,可留空;留空表示沿用执行器自身的默认档位。" }, count_unit: { label: "复核计数依据", description: "有效工作 Turn 须完成结算;轮询和重复重试不计数。", options: { completed_todos: "已完成 Todo", effective_turns: "已结算工作 Turn" } }, + stride_strategy: { label: "步幅策略", description: "启用后,新的 Vision 路线复盘须提交工作大小、路线及验证范围的结构化提案,不授予执行权限。", options: { off: "关闭", evidence_conditioned_v1: "依据证据调整 · v1" } }, count: { label: "两次复核间的数量", description: "已结算工作 Turn 为 1–6,已完成 Todo 为 1–5;Goal 显式设置优先于设备默认值。" }, allowed_domains: { label: "允许的职责域", description: "每行填写一个有边界、可公开的职责域。" }, coordinator_agent_id: { label: "协调 Agent", description: "填写一个已经注册的 Agent ID;留空表示关闭协调。" }, diff --git a/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx b/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx index 7b940507c9..a240b624cd 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx @@ -1064,7 +1064,7 @@ const en = { "machine.periodicReportActivationDescription": "This is not a weekly timer. When LoopX validates a Goal stage completion, an Agent prepares and freezes the report, then automatically delivers it through the configured Goal Channel. The enabled subscription is standing delivery authority; failures and route drift stop closed for repair.", "machine.changeQualityActivation": "Qualification is a quality gate, not new authority", "machine.changeQualityActivationDescription": "Goals that inherit this policy qualify their exact final diff. safe_fix allows at most one bounded fix pass inside existing write authority; this setting never grants file, permission, or merge authority.", - "machine.replanCadenceActivation": "Review cadence changes timing, not execution authority", + "machine.replanCadenceActivation": "Review timing and stride policy do not grant execution authority", "machine.replanCadenceActivationDescription": "Goals without an explicit override read this threshold before the next review decision. It does not create Turns, spend quota, or grant authority.", "machine.preview": "Review exact machine change", "machine.previewChanges": "Preview changes", @@ -2467,7 +2467,7 @@ const zhCN: Record = { "machine.periodicReportActivationDescription": "这不是每周定时器。当 LoopX 验证 Goal 已完成一个阶段时,Agent 会生成并冻结报告,随后通过配置的 Goal Channel 自动发送。启用此订阅即授予持续投递权;发送失败或路由漂移会 fail closed 并进入修复。", "machine.changeQualityActivation": "质量验证是质量门禁,不是新增授权", "machine.changeQualityActivationDescription": "继承该策略的 Goal 会验证最终精确 diff。safe_fix 只允许在既有写入权限内执行至多一次有界修复;此设置不会授予文件、权限或合并权。", - "machine.replanCadenceActivation": "复核周期只改变时机,不改变执行权限", + "machine.replanCadenceActivation": "复盘周期与步幅策略,不扩大执行权限", "machine.replanCadenceActivationDescription": "没有显式覆盖的 Goal 会在下一次复核决策前读取此阈值;它不会创建 Turn、消耗配额或授予权限。", "machine.preview": "审阅机器配置变更", "machine.previewChanges": "预览变更", diff --git a/loopx/capabilities/configuration_ui.py b/loopx/capabilities/configuration_ui.py index b88a7ad7ef..c0487b9f35 100644 --- a/loopx/capabilities/configuration_ui.py +++ b/loopx/capabilities/configuration_ui.py @@ -6,6 +6,7 @@ from ..configuration_transaction import configuration_payload_revision from ..control_plane.goals.goal_vision_policy import MAX_EFFECTIVE_TURN_REPLAN_THRESHOLD +from ..control_plane.work_items.stride_policy_codec import stride_strategy_options from .progress_review.policy import ( PROGRESS_REVIEW_MAX_DRIFT_THRESHOLD, @@ -114,6 +115,9 @@ def capability_configuration_editor( _field("count", "Review interval", "number", minimum=1, maximum=MAX_EFFECTIVE_TURN_REPLAN_THRESHOLD, required=True, description="Effective Turns: 1–6; completed Todos: 1–5. Effective Turns require accepted work settlement. Retries and observation-only polls do not count."), + _field("stride_strategy", "Stride strategy", "select", + options=list(stride_strategy_options()), + description="Off retains ordinary review. Evidence-conditioned v1 independently reviews work-slice size, route changes and validation scope; fresh Vision path reviews require a structured proposal, without automatic execution."), ], }, "periodic_report": { diff --git a/loopx/capabilities/todo_replan_cadence/goal_configuration.py b/loopx/capabilities/todo_replan_cadence/goal_configuration.py index 01a64245ce..92550ae244 100644 --- a/loopx/capabilities/todo_replan_cadence/goal_configuration.py +++ b/loopx/capabilities/todo_replan_cadence/goal_configuration.py @@ -12,15 +12,18 @@ def configuration_summary(goal: Mapping[str, Any]) -> dict[str, Any] | None: profile = goal.get("execution_profile") if not isinstance(profile, Mapping): return None + strategy = {"stride_strategy": profile["stride_strategy"]} if "stride_strategy" in profile else {} if "replan_after_effective_turns" in profile: return { "count_unit": "effective_turns", "count": profile["replan_after_effective_turns"], + **strategy, } if "replan_after_completed_todos" in profile: return { "count_unit": "completed_todos", "count": completed_todo_replan_threshold(dict(profile)), + **strategy, } return None diff --git a/loopx/capabilities/todo_replan_cadence/machine_defaults.py b/loopx/capabilities/todo_replan_cadence/machine_defaults.py index 5ca81990a6..e281494cfd 100644 --- a/loopx/capabilities/todo_replan_cadence/machine_defaults.py +++ b/loopx/capabilities/todo_replan_cadence/machine_defaults.py @@ -27,6 +27,7 @@ class ReplanCadenceUnit(str, Enum): TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V1 = "todo_replan_cadence_machine_defaults_v1" +TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V2 = "todo_replan_cadence_machine_defaults_v2" def normalize_replan_cadence_configuration(raw: Mapping[str, Any]) -> dict[str, Any]: @@ -35,7 +36,7 @@ def normalize_replan_cadence_configuration(raw: Mapping[str, Any]) -> dict[str, "count_unit": ReplanCadenceUnit.COMPLETED_TODOS.value, "count": normalize_completed_todo_replan_threshold(raw["completed_todos"]), } - if set(raw) != {"count_unit", "count"}: + if set(raw) not in ({"count_unit", "count"}, {"count_unit", "count", "stride_strategy"}): raise ValueError("review cadence requires count_unit and count") try: unit = ReplanCadenceUnit(raw["count_unit"]) @@ -48,7 +49,11 @@ def normalize_replan_cadence_configuration(raw: Mapping[str, Any]) -> dict[str, count = normalize_completed_todo_replan_threshold(count) else: count = normalize_effective_turn_replan_threshold(count) - return {"count_unit": unit.value, "count": count} + result = {"count_unit": unit.value, "count": count} + if "stride_strategy" in raw: + from ...control_plane.work_items.stride_policy_codec import normalize_stride_strategy + result["stride_strategy"] = normalize_stride_strategy(raw["stride_strategy"]) + return result def normalize_todo_replan_cadence_machine_defaults( @@ -64,10 +69,13 @@ def normalize_todo_replan_cadence_machine_defaults( raw.get("completed_todos") ), } - if version != TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V1: - raise ValueError("todo_replan_cadence must use a supported v0 or v1 schema") - if set(raw) != {"schema_version", "count_unit", "count"}: - raise ValueError("v1 review cadence requires count_unit and count") + if version not in (TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V1, TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V2): + raise ValueError("todo_replan_cadence must use a supported v0, v1 or v2 schema") + expected = {"schema_version", "count_unit", "count"} + if version == TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V2: + expected.add("stride_strategy") + if set(raw) != expected: + raise ValueError("review configuration fields do not match its schema version") return { "schema_version": version, **normalize_replan_cadence_configuration( @@ -100,21 +108,24 @@ def todo_replan_cadence_machine_configuration_namespace() -> ( { TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_SCHEMA, TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V1, + TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V2, } ), normalize=normalize_todo_replan_cadence_machine_defaults, project_public=lambda value: dict(value), apply_public_update=lambda _current, update: dict(update), - title="Goal review cadence", + title="Goal review and stride", description=( "Live review threshold for Goals without an explicit cadence override. " "Defaults to six settled work Turns; completed Todos remain an explicit option. " + "The optional versioned stride strategy is disabled by default; enabled fresh Vision reviews require a bounded structured proposal. " "It does not create " "turns, spend quota, or grant authority." ), default_configuration={ - "schema_version": TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V1, + "schema_version": TODO_REPLAN_CADENCE_MACHINE_DEFAULTS_V2, **default_replan_cadence_configuration(), + "stride_strategy": "off", }, ) @@ -164,6 +175,8 @@ def apply_todo_replan_cadence_machine_default( else "replan_after_completed_todos" ) profile[field] = cadence["count"] + if cadence.get("stride_strategy", "off") != "off": + profile["stride_strategy"] = cadence["stride_strategy"] projected["execution_profile"] = profile return projected diff --git a/loopx/chat_goal_configuration_api.py b/loopx/chat_goal_configuration_api.py index 0367e6c164..5295d7e997 100644 --- a/loopx/chat_goal_configuration_api.py +++ b/loopx/chat_goal_configuration_api.py @@ -189,7 +189,7 @@ def _goal_capability_options( if capability_id == "periodic_report": return {"clear_periodic_report_configuration": True} if capability_id == "todo_replan_cadence": - return {"clear_execution_replan_after_todos": True, "clear_execution_replan_after_turns": True} + return {"clear_execution_replan_after_todos": True, "clear_execution_replan_after_turns": True, "clear_execution_stride_strategy": True} if capability_id == "pull_request_review": return {"clear_pull_request_review_configuration": True} if capability_id == "change_quality_qualification": @@ -202,7 +202,7 @@ def _goal_capability_options( config = dict(configuration) allowed: dict[str, set[str]] = { "goal_capability_organization": {"mode", "discovery_budget_minutes", "max_trials"}, - "todo_replan_cadence": {"completed_todos", "count_unit", "count"}, + "todo_replan_cadence": {"completed_todos", "count_unit", "count", "stride_strategy"}, "multi_subagent": { "enabled", "max_children", @@ -240,7 +240,8 @@ def _goal_capability_options( cadence = normalize_replan_cadence_configuration(config) option = ("execution_replan_after_turns" if cadence["count_unit"] == "effective_turns" else "execution_replan_after_todos") - return {option: cadence["count"]} + return {option: cadence["count"], **({"execution_stride_strategy": cadence["stride_strategy"]} + if "stride_strategy" in cadence else {})} if capability_id == "periodic_report": return {"periodic_report_configuration": config} if capability_id == "reward_memory": diff --git a/loopx/cli_commands/registry_admin.py b/loopx/cli_commands/registry_admin.py index 5932658ff6..3d44c9b284 100644 --- a/loopx/cli_commands/registry_admin.py +++ b/loopx/cli_commands/registry_admin.py @@ -452,6 +452,8 @@ def handle_registry_admin_command( execution_turn_granularity=args.execution_turn_granularity, execution_replan_after_todos=args.execution_replan_after_todos, execution_replan_after_turns=args.execution_replan_after_turns, + execution_stride_strategy=args.execution_stride_strategy, + clear_execution_stride_strategy=args.clear_execution_stride_strategy, clear_execution_replan_after_turns=args.clear_execution_replan_after_turns, clear_execution_replan_after_todos=bool( args.clear_execution_replan_after_todos diff --git a/loopx/cli_commands/registry_admin_configure.py b/loopx/cli_commands/registry_admin_configure.py index 8690b8215f..ece249b284 100644 --- a/loopx/cli_commands/registry_admin_configure.py +++ b/loopx/cli_commands/registry_admin_configure.py @@ -70,6 +70,15 @@ def register_configure_goal_command(subparsers: argparse._SubParsersAction) -> N "--clear-execution-replan-after-turns", action="store_true", help="Remove the Goal effective-Turn override and restore device/default inheritance.", ) + from ..control_plane.work_items.stride_policy_codec import stride_strategy_options + configure_goal_parser.add_argument( + "--execution-stride-strategy", choices=stride_strategy_options(), + help="Choose a versioned Agent stride strategy. Off preserves ordinary review; no automatic execution or authority change.", + ) + configure_goal_parser.add_argument( + "--clear-execution-stride-strategy", action="store_true", + help="Remove the strategy from the Goal review override (off). Clear the review cadence too to restore device defaults.", + ) configure_goal_parser.add_argument( "--quota-compute", type=float, diff --git a/loopx/configuration_catalog.py b/loopx/configuration_catalog.py index df5801d930..353fbc08f2 100644 --- a/loopx/configuration_catalog.py +++ b/loopx/configuration_catalog.py @@ -162,13 +162,14 @@ def build_goal_configuration_catalog( }, { "feature_id": "todo_replan_cadence", - "display_name": "Goal review cadence", + "display_name": "Goal review and stride", "availability": "supported_explicit_override", "default": default_replan_cadence_configuration(), "consider_when": "Direction needs regular review even while the same Todo remains open.", "effect": ( "Choose 1–6 settled work Turns or 1–5 completed Todos per Agent. " - "Legacy settings retain their completed-Todo units until explicitly changed." + "Legacy settings retain their completed-Todo units until explicitly changed. " + "The optional versioned stride strategy proposes work-slice and route adjustments; off retains ordinary review." ), "does_not": [ "create host continuation turns or interrupt running work", @@ -185,10 +186,10 @@ def build_goal_configuration_catalog( str(default_replan_cadence_configuration()["count"]), execute=True ), "preview_disable": _configure_command( - goal_id, "--clear-execution-replan-after-todos", "--clear-execution-replan-after-turns" + goal_id, "--clear-execution-replan-after-todos", "--clear-execution-replan-after-turns", "--clear-execution-stride-strategy" ), "apply_disable": _configure_command( - goal_id, "--clear-execution-replan-after-todos", "--clear-execution-replan-after-turns", execute=True + goal_id, "--clear-execution-replan-after-todos", "--clear-execution-replan-after-turns", "--clear-execution-stride-strategy", execute=True ), "verify": [inspect_command], }, diff --git a/loopx/configure_goal.py b/loopx/configure_goal.py index 8cf8732ae0..4ad3ea02b8 100644 --- a/loopx/configure_goal.py +++ b/loopx/configure_goal.py @@ -438,6 +438,8 @@ def configure_goal( execution_turn_granularity: str | None = None, execution_replan_after_todos: int | None = None, execution_replan_after_turns: int | None = None, + execution_stride_strategy: str | None = None, + clear_execution_stride_strategy: bool = False, clear_execution_replan_after_turns: bool = False, clear_execution_replan_after_todos: bool = False, self_repair_enabled: bool | None = None, @@ -826,6 +828,7 @@ def configure_goal( turn_granularity=execution_turn_granularity, replan_after_completed_todos=execution_replan_after_todos, replan_after_effective_turns=execution_replan_after_turns, + stride_strategy=execution_stride_strategy, clear_stride_strategy=clear_execution_stride_strategy, clear_replan_after_effective_turns=clear_execution_replan_after_turns, clear_replan_after_completed_todos=clear_execution_replan_after_todos, ) diff --git a/loopx/control_plane/goals/goal_frontier/__init__.py b/loopx/control_plane/goals/goal_frontier/__init__.py index f59e3b97be..80efacdf42 100644 --- a/loopx/control_plane/goals/goal_frontier/__init__.py +++ b/loopx/control_plane/goals/goal_frontier/__init__.py @@ -1781,6 +1781,7 @@ def build_goal_frontier_projection_context_from_status( goal_id=goal_id, agent_id=agent_id, newest_first_runs=(), source_status=status_payload, + stride_strategy=((project_asset or {}).get("execution_profile") or {}).get("stride_strategy", "off"), goal_acceptance_contract=(agent_todo_summary or {}).get("goal_acceptance_contract"), ) diff --git a/loopx/control_plane/goals/goal_vision.py b/loopx/control_plane/goals/goal_vision.py index 1a2f720789..7f92bda520 100644 --- a/loopx/control_plane/goals/goal_vision.py +++ b/loopx/control_plane/goals/goal_vision.py @@ -1,6 +1,7 @@ from __future__ import annotations from typing import Any +from copy import deepcopy from .vision_checkpoint import ( GOAL_VISION_BUDGET_ERROR as GOAL_VISION_BUDGET_ERROR, @@ -150,6 +151,10 @@ def compact_goal_vision_packet(value: Any) -> dict[str, Any] | None: if todo_delta: compact["todo_delta"] = todo_delta + # Preserve the TS-normalized, bounded control proposal; no Python policy. + if isinstance(value.get("stride_decision"), dict): + compact["stride_decision"] = deepcopy(value["stride_decision"]) + declarations = _compact_fallback_declarations(value.get("fallback_declarations")) if declarations: compact["fallback_declarations"] = declarations diff --git a/loopx/control_plane/goals/goal_vision_read_model.py b/loopx/control_plane/goals/goal_vision_read_model.py index 4d6e6a58fb..87e7db4dba 100644 --- a/loopx/control_plane/goals/goal_vision_read_model.py +++ b/loopx/control_plane/goals/goal_vision_read_model.py @@ -83,6 +83,8 @@ def latest_agent_vision_from_runs( else None, "generated_at": run.get("generated_at"), } + if isinstance(vision.get("stride_decision"), dict): + result["stride_decision"] = vision["stride_decision"] if isinstance(vision.get("path_delta"), dict): result["path_delta"] = vision["path_delta"] if isinstance(vision.get("fallback_declarations"), list): diff --git a/loopx/control_plane/goals/vision_checkpoint.ts b/loopx/control_plane/goals/vision_checkpoint.ts index f350101128..4a2a93671b 100644 --- a/loopx/control_plane/goals/vision_checkpoint.ts +++ b/loopx/control_plane/goals/vision_checkpoint.ts @@ -11,6 +11,8 @@ import { type DeliveryOutcome, } from "../work_items/delivery_outcome.ts"; +import {normalizeStrideDecision, STRIDE_DECISION_SCHEMA, STRIDE_PROBE_LIMITS} from "../work_items/stride_policy.ts"; + export const VISION_REFRESH_REQUEST_SCHEMA = "loopx_vision_refresh_request_v0"; export const VISION_REFRESH_PREPARED_SCHEMA_VERSION = "vision_refresh_prepared_v0"; @@ -565,6 +567,13 @@ function prepareVisionRefresh(request: VisionRefreshPrepareRequest): JsonObject if (typeof container !== "object" || container === null || Array.isArray(container)) continue; for (const [field, value] of Object.entries(container)) { if (prefix === "agent_vision" && field === "path_delta") continue; + if (prefix === "agent_vision" && field === "stride_decision") continue; + if (field === STRIDE_DECISION_SCHEMA || + (prefix === "agent_vision.vision_patch" && field === "stride_decision") || + (typeof value === "object" && value !== null && !Array.isArray(value) && + (value as JsonObject).schema_version === STRIDE_DECISION_SCHEMA)) { + throw new EffectRuntimeRequestError(`${prefix}.${field} must be supplied as agent_vision.stride_decision`); + } if (field === GOAL_PATH_DELTA_SCHEMA_VERSION || (prefix === "agent_vision.vision_patch" && field === "path_delta") || (typeof value === "object" && value !== null && !Array.isArray(value) && @@ -631,6 +640,12 @@ function prepareVisionRefresh(request: VisionRefreshPrepareRequest): JsonObject const [pathDelta, pathDeltaUsage] = normalizeGoalPathDelta(updatePacket.path_delta); Object.assign(fieldUsage, pathDeltaUsage); + const [strideDecision, strideUsage] = normalizeStrideDecision(updatePacket.stride_decision, boundedPublicText); + if (strideDecision && (!pathDelta || !["continue", "no_change", "replan"].includes(String(pathDelta.outcome)) || + !Array.isArray(pathDelta.evidence_refs) || !pathDelta.evidence_refs.length)) { + throw new EffectRuntimeRequestError("stride_decision requires a fresh evidence-linked path decision"); + } + Object.assign(fieldUsage, strideUsage); const [fallbackDeclarations, fallbackUsage] = normalizeFallbackDeclarations( updatePacket.fallback_declarations, ) ?? [null, {}]; @@ -672,6 +687,11 @@ function prepareVisionRefresh(request: VisionRefreshPrepareRequest): JsonObject for (const [field, [, itemLimit]] of Object.entries(GOAL_PATH_DELTA_LIST_LIMITS)) { fieldLimits[`path_delta.${field}[]`] = itemLimit; } + if (strideDecision) { + for (const [field, limit] of Object.entries(STRIDE_PROBE_LIMITS)) { + fieldLimits[`stride_decision.next_probe.${field}`] = limit; + } + } fieldLimits["fallback_declarations"] = VISION_FALLBACK_DECLARATION_ENTRY_LIMIT; fieldLimits["fallback_declarations[]"] = VISION_FALLBACK_DECLARATION_ID_LIMIT; @@ -693,6 +713,7 @@ function prepareVisionRefresh(request: VisionRefreshPrepareRequest): JsonObject validation, }; if (pathDelta !== null) agentVision.path_delta = pathDelta; + if (strideDecision !== null) agentVision.stride_decision = strideDecision; if (fallbackDeclarations !== null) { agentVision.fallback_declarations = fallbackDeclarations; } diff --git a/loopx/control_plane/quota/turn_envelope.ts b/loopx/control_plane/quota/turn_envelope.ts index d8a10230f1..9c993ff041 100644 --- a/loopx/control_plane/quota/turn_envelope.ts +++ b/loopx/control_plane/quota/turn_envelope.ts @@ -237,7 +237,7 @@ function replanActionPacket(payload: JsonObject): JsonObject | null { if (Object.keys(source).length === 0) return null; const compact = compactFields(source, [ "schema_version", "decision", "obligation_id", "uncovered_frontier", - "required_outcome", "allowed_terminal", "bounded_frontier", "settlement_only", "successor_todo_id", + "required_outcome", "allowed_terminal", "bounded_frontier", "settlement_only", "successor_todo_id", "stride_control", ]); // The typed replan owner supplies bounded instructions; do not truncate their // authority/stop qualifiers through generic diagnostic compaction. diff --git a/loopx/control_plane/stride_decision_schema.json b/loopx/control_plane/stride_decision_schema.json new file mode 100644 index 0000000000..71ae73733a --- /dev/null +++ b/loopx/control_plane/stride_decision_schema.json @@ -0,0 +1,7 @@ +{ + "schema_version": "stride_decision_v1", + "basis_options": ["supported_progress", "unexplained_gap", "uncertain_evidence", "useful_new_route", "decision_failure"], + "axis_names": ["work_slice", "route_distance", "validation_scope"], + "adjustments": ["grow", "hold", "shrink"], + "probe_field_limits": {"scope": 120, "prediction": 120, "adoption_criterion": 120, "cost_bound": 100} +} diff --git a/loopx/control_plane/stride_strategy_schema.json b/loopx/control_plane/stride_strategy_schema.json new file mode 100644 index 0000000000..af086af5dc --- /dev/null +++ b/loopx/control_plane/stride_strategy_schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Stride strategy version", + "type": "string", + "enum": ["off", "evidence_conditioned_v1"], + "default": "off" +} diff --git a/loopx/control_plane/work_items/progress_observation.py b/loopx/control_plane/work_items/progress_observation.py index 31c5169c14..1700f9daa0 100644 --- a/loopx/control_plane/work_items/progress_observation.py +++ b/loopx/control_plane/work_items/progress_observation.py @@ -483,6 +483,7 @@ def build_replan_context( obligation: Mapping[str, Any], *, goal_id: str, agent_id: str | None, newest_first_runs: Iterable[Mapping[str, Any]], source_status: Mapping[str, Any] | None = None, + stride_strategy: str = "off", goal_acceptance_contract: Mapping[str, Any] | None = None, ) -> dict[str, Any]: from .replan_context_codec import project_replan_context @@ -490,7 +491,7 @@ def build_replan_context( return project_replan_context( goal_id=goal_id, agent_id=agent_id or obligation.get("agent_id"), runs=newest_first_runs, obligation=obligation, source_status=source_status, - goal_acceptance_contract=goal_acceptance_contract, + goal_acceptance_contract=goal_acceptance_contract, stride_strategy=stride_strategy, ) @@ -602,6 +603,8 @@ def build_replan_action_packet( ProgressResultClass.NO_FOLLOWUP.value, ], } + if "stride_control" in requirements: + packet["stride_control"] = requirements["stride_control"] if isinstance(selected_gap, Mapping): packet["bounded_frontier"] = { key: selected_gap[key] diff --git a/loopx/control_plane/work_items/replan_context.ts b/loopx/control_plane/work_items/replan_context.ts index 29685d0585..3e0c1c01e9 100644 --- a/loopx/control_plane/work_items/replan_context.ts +++ b/loopx/control_plane/work_items/replan_context.ts @@ -4,8 +4,10 @@ import type {JsonObject} from "../effect_program.ts"; import {EffectRuntimeRequestError} from "../effect_runtime_errors.ts"; import {BARE_SHA256_PATTERN} from "../content_digest.ts"; import {requireJsonObject, requireNonEmptyString} from "../runtime_decode.ts"; -import {requiredSemanticOutcomes} from "./replan_semantics.ts"; +import {FRESH_PATH_DISPOSITIONS, requiredSemanticOutcomes} from "./replan_semantics.ts"; import {readReplanSnapshot} from "./replan_history_snapshot.ts"; +import {normalizeGoalPathDelta} from "../goals/vision_checkpoint.ts"; +import {normalizeStrideDecision, normalizeStrideStrategy} from "./stride_policy.ts"; const CONTEXT_SCHEMA = "replan_context_v0"; // Replan is an infrequent decision, not the ordinary guard's display window. @@ -102,6 +104,97 @@ function coreGoal(value: unknown): JsonObject { objective_missing: objective === null, acceptance_contract: acceptance}; } +function acceptedDecisionSource(row: JsonObject): boolean { + const source = objectOrNull(row._source_facts); + const identity = objectOrNull(source?.settlement_identity); + const vision = objectOrNull(source?.agent_vision); + const ack = objectOrNull(source?.autonomous_replan_ack); + const delta = objectOrNull(ack?.semantic_delta); + return !!source && identity?.schema_version === "quota_settlement_identity_v0" && + ["goal_id", "agent_id", "todo_id"].every(key => identity[key] === row[key]) && + identity.turn_instance_id === source.turn_instance_id && + typeof identity.turn_instance_id === "string" && ID.test(identity.turn_instance_id) && + !objectOrNull(source.quota_spend_commit) && + vision?.schema_version === "goal_vision_replan_contract_v0" && vision.agent_id === row.agent_id && + (vision.goal_id == null || vision.goal_id === row.goal_id) && + ack?.schema_version === "autonomous_replan_ack_v0" && ack.recorded === true && + delta?.schema_version === "replan_semantic_delta_v0" && delta.accepted === true && + Array.isArray(delta.satisfying_outcomes) && delta.satisfying_outcomes.includes("fresh_vision_path_outcome"); +} + +function recordedDecision(row: JsonObject): JsonObject | null { + if (!acceptedDecisionSource(row)) return null; + const source = objectOrNull(row._source_facts)!; + let path: JsonObject | null; + try { + [path] = normalizeGoalPathDelta(objectOrNull(source.agent_vision)?.path_delta); + } catch { return null; } + if (!path || !FRESH_PATH_DISPOSITIONS.has(String(path.outcome)) || + !Array.isArray(path.evidence_refs) || !path.evidence_refs.length) return null; + const ref = objectOrNull(source.goal_ref); + if (source.goal_ref != null && (!ref || ref.goal_id !== row.goal_id || + typeof ref.goal_instance_id !== "string" || !ID.test(ref.goal_instance_id))) return null; + let stride: JsonObject | null; + try { [stride] = normalizeStrideDecision(objectOrNull(source.agent_vision)?.stride_decision); } + catch { return null; } + const decision = {history_evidence_ref: "replan-evidence-" + digest(publicEvidenceRow(row)), + generated_at: row.generated_at, todo_id: row.todo_id, turn_instance_id: source.turn_instance_id, + goal_ref: ref ? {goal_id: ref.goal_id, goal_instance_id: ref.goal_instance_id} : null, + path_delta: path, ...(stride ? {stride_decision: stride} : {})}; + // Existing history refs keep their identity. This derived ref additionally + // binds the path itself, so a changed decision cannot resolve old evidence. + return {evidence_ref: "replan-decision-" + digest(decision), ...decision}; +} + +/** Return a recorded decision to the next review, without judging its utility. + * Append order belongs to the captured history, not timestamps or prose. A + * progress observation proves neither execution nor scientific improvement. + */ +function decisionFollowthrough(rows: JsonObject[], goalFacts: unknown, fromFullIndex: boolean): JsonObject | null { + const currentRef = objectOrNull(objectOrNull(goalFacts)?.goal_ref); + const scoped = rows.filter(row => { + const source = objectOrNull(row._source_facts); + const ref = objectOrNull(source?.goal_ref); + return source && Number.isSafeInteger(source.history_position) && + Number(source.history_position) >= 0 && + (!currentRef || (ref?.goal_id === currentRef.goal_id && + ref?.goal_instance_id === currentRef.goal_instance_id)); + }).sort((a, b) => Number(objectOrNull(b._source_facts)!.history_position) - + Number(objectOrNull(a._source_facts)!.history_position)); + const previous = scoped.find(acceptedDecisionSource); + if (!previous) return null; + // Do not fall back to an older decision when the latest basis is corrupt. + const decision = recordedDecision(previous); + if (!decision) return null; + const source = objectOrNull(previous._source_facts)!; + const subsequent = new Map(); + for (const row of scoped) { + const facts = objectOrNull(row._source_facts)!; + if (Number(facts.history_position) <= Number(source.history_position) || !row.progress_observation) continue; + const progress = row.progress_observation as JsonObject; + if (!subsequent.has(String(progress.fingerprint))) subsequent.set(String(progress.fingerprint), row); + } + // The complete denominator is retained even when the review details are capped. + const observations = [...subsequent.values()]; + return { + previous_decision: decision, + source_history_complete: fromFullIndex, + unsequenced_progress_count: rows.filter(row => row.progress_observation && + !Number.isSafeInteger(objectOrNull(row._source_facts)?.history_position)).length, + recorded_progress_count: observations.length, + observations: observations.slice(0, 6).map(row => ({ + evidence_ref: "replan-evidence-" + digest(publicEvidenceRow(row)), + generated_at: row.generated_at, todo_id: row.todo_id, + coverage_ref: (row.progress_observation as JsonObject).fingerprint, + })), + omitted_observation_count: Math.max(0, observations.length - 6), + execution_and_goal_gain: "unknown", + guidance: "Compare the previous path decision with subsequent work and authoritative outcomes. " + + "Recorded progress and changed identifiers do not prove execution, a new mechanism, or goal gain. " + + "Resolve evidence before deciding what to retain, change, or test next.", + }; +} + export function validateReplanContext(value: unknown): JsonObject { const context = requireJsonObject(value, "replan_context"); if (context.schema_version !== CONTEXT_SCHEMA) { @@ -125,6 +218,26 @@ export function validateReplanContext(value: unknown): JsonObject { if (!Array.isArray(frontier.required_any_of)) { throw new EffectRuntimeRequestError("replan_context uncovered_frontier requires required_any_of"); } + if (context.stride_strategy !== undefined) normalizeStrideStrategy(context.stride_strategy); + if (context.decision_followthrough !== undefined) { + const follow = requireJsonObject(context.decision_followthrough, "decision_followthrough"); + if (context.stride_strategy !== "evidence_conditioned_v1" || follow.execution_and_goal_gain !== "unknown") { + throw new EffectRuntimeRequestError("decision followthrough requires the enabled strategy and unknown utility"); + } + const observations = objects(follow.observations, "decision_followthrough.observations"); + if (observations.length > 6 || typeof follow.source_history_complete !== "boolean" || + ["recorded_progress_count", "omitted_observation_count", "unsequenced_progress_count"].some( + key => !Number.isSafeInteger(follow[key]) || Number(follow[key]) < 0) || + Number(follow.recorded_progress_count) !== observations.length + Number(follow.omitted_observation_count)) { + throw new EffectRuntimeRequestError("decision followthrough requires bounded detail and explicit coverage counts"); + } + const previous = requireJsonObject(follow.previous_decision, "decision_followthrough.previous_decision"); + identifier(previous.evidence_ref, "previous_decision.evidence_ref"); + identifier(previous.history_evidence_ref, "previous_decision.history_evidence_ref"); + identifier(previous.turn_instance_id, "previous_decision.turn_instance_id"); + normalizeGoalPathDelta(previous.path_delta); + normalizeStrideDecision(previous.stride_decision); + } return context; } @@ -173,7 +286,7 @@ export function projectReplanContext(value: unknown): JsonObject { if (request.operation === "resolve") { if (!agent) throw new EffectRuntimeRequestError("evidence resolution requires agent_id"); const ref = identifier(request.evidence_ref, "evidence_ref"); - const match = unique.get(ref); + const match = unique.get(ref) ?? rows.map(recordedDecision).find(decision => decision?.evidence_ref === ref); if (!match) throw new EffectRuntimeRequestError( "evidence reference is unavailable in this Goal and Agent history window; refresh replan_context", "replan_evidence_unavailable"); @@ -252,7 +365,12 @@ export function projectReplanContext(value: unknown): JsonObject { ? [String((row.progress_observation as JsonObject).fingerprint)] : [])); const ledger = [...coverage].filter(([key]) => selectedCoverage.has(key)).map(([, value]) => value); const core = coreGoal(request.goal_facts); - const contextId = "replan-context-" + digest({goal, agent, obligationId, core, ledger, shown, frontier}); + const strideStrategy = normalizeStrideStrategy(request.stride_strategy); + const followthrough = agent && strideStrategy !== "off" + ? decisionFollowthrough(rows, request.goal_facts, request.from_full_index === true) : null; + const contextId = "replan-context-" + digest({goal, agent, obligationId, core, ledger, shown, frontier, + ...(strideStrategy !== "off" ? {stride_strategy: strideStrategy} : {}), + ...(followthrough ? {decision_followthrough: followthrough} : {})}); const context: JsonObject = { schema_version: CONTEXT_SCHEMA, context_id: contextId, goal_id: goal, agent_id: agent, obligation_id: obligationId, evidence_source: "compact_run_history", delivery: "host_projected", @@ -263,6 +381,8 @@ export function projectReplanContext(value: unknown): JsonObject { coverage_ledger: ledger, coverage_count: coverage.size, coverage_truncated: coverage.size > ledger.length, uncovered_frontier: frontier, }; + if (strideStrategy !== "off") context.stride_strategy = strideStrategy; + if (followthrough) context.decision_followthrough = followthrough; if (omitted.length) context.omitted_evidence = { distinct_observation_count: omitted.length, newest_at: omitted[0].row.generated_at, oldest_at: omitted.at(-1)!.first, diff --git a/loopx/control_plane/work_items/replan_context_codec.py b/loopx/control_plane/work_items/replan_context_codec.py index 019f5b255e..5c964d5c81 100644 --- a/loopx/control_plane/work_items/replan_context_codec.py +++ b/loopx/control_plane/work_items/replan_context_codec.py @@ -29,11 +29,11 @@ def replan_history_from_status(status: Mapping[str, Any], goal_id: str) -> list[ return snapshot -def replan_evidence_rows(runs: Iterable[Mapping[str, Any]], *, goal_id: str, agent_id: str | None) -> list[dict[str, Any]]: +def replan_evidence_rows(runs: Iterable[Mapping[str, Any]], *, goal_id: str, agent_id: str | None, include_decisions: bool = False) -> list[dict[str, Any]]: from .progress_observation import normalize_progress_observation rows = [] - for run in runs: + for position, run in enumerate(runs): if not isinstance(run, Mapping): raise ValueError("replan history row must be an object") # Legacy compact records may omit the enclosing Goal id. Agent attribution @@ -63,12 +63,20 @@ def replan_evidence_rows(runs: Iterable[Mapping[str, Any]], *, goal_id: str, age text = public_safe_compact_text(run.get(key), limit=240) if text: row[key] = text - if "settlement_identity" in run or "quota_spend_commit" in run: + if "settlement_identity" in run or "quota_spend_commit" in run or (include_decisions and "agent_vision" in run): # Transport facts, not a Python eligibility decision. Complete-text # digests prevent a shared display prefix from erasing distinct tails. # This private wire metadata is excluded from public reference identity. source: dict[str, Any] = {key: run.get(key) for key in ( "goal_id", "agent_id", "todo_id", "turn_instance_id")} + # Facts only: the typed replan owner qualifies the prior decision + # and orders subsequent observations. Do not classify research + # progress or infer adoption from prose in this transport codec. + if include_decisions: + source["history_position"] = position + source["goal_ref"] = run.get("goal_ref") + source["agent_vision"] = run.get("agent_vision") + source["autonomous_replan_ack"] = run.get("autonomous_replan_ack") for key, fields in (("settlement_identity", ( "schema_version", "goal_id", "agent_id", "todo_id", "turn_instance_id", "effect_id")), ("quota_spend_commit", ("schema_version", "effect_id"))): @@ -98,6 +106,8 @@ def goal_text(value: Any) -> str | None: goal = load_goal_from_registry(Path(str(status["registry"])), goal_id) if goal: + if goal.get("goal_instance_id"): + facts["goal_ref"] = {"goal_id": goal_id, "goal_instance_id": goal["goal_instance_id"]} facts["registry_objective"] = goal_text(goal.get("objective")) path = goal_state_path(goal) if path and path.exists(): @@ -119,8 +129,12 @@ def project_replan_context( obligation: Mapping[str, Any] | None = None, evidence_ref: str | None = None, source_status: Mapping[str, Any] | None = None, goal_acceptance_contract: Mapping[str, Any] | None = None, + stride_strategy: str = "off", ) -> dict[str, Any]: from .replan_history_codec import project_replan_request + from .stride_policy_codec import normalize_stride_strategy + + strategy = normalize_stride_strategy(stride_strategy) prefix = ["loopx"] if source_status is not None: @@ -133,7 +147,9 @@ def project_replan_context( "operation": "resolve" if evidence_ref is not None else "project", "goal_id": goal_id, "agent_id": agent_id, "obligation": dict(obligation) if obligation is not None else None, - "rows": replan_evidence_rows(runs, goal_id=goal_id, agent_id=agent_id), + "rows": replan_evidence_rows(runs, goal_id=goal_id, agent_id=agent_id, + include_decisions=strategy != "off" or bool(evidence_ref and evidence_ref.startswith("replan-decision-"))), + "stride_strategy": strategy, "evidence_ref": evidence_ref, "read_prefix": shlex.join(prefix), "goal_facts": _goal_facts(source_status, goal_id, goal_acceptance_contract) if evidence_ref is None else {}, diff --git a/loopx/control_plane/work_items/replan_semantics.ts b/loopx/control_plane/work_items/replan_semantics.ts index 4f2cfb11f6..45d6eab60f 100644 --- a/loopx/control_plane/work_items/replan_semantics.ts +++ b/loopx/control_plane/work_items/replan_semantics.ts @@ -3,6 +3,7 @@ import { EffectRuntimeRequestError } from "../effect_runtime_errors.ts"; import { optionalNonEmptyString, requireJsonObject, requireNonEmptyString } from "../runtime_decode.ts"; import { visionAuthoringContract } from "../goals/vision_checkpoint.ts"; import { parseTodoTimestampMicros } from "../runtime_timestamp.ts"; +import {normalizeStrideDecision, normalizeStrideStrategy, strideControlContract, stridePlanningGuidance} from "./stride_policy.ts"; const PROGRESS_OUTCOMES = [ "new_surface", "new_hypothesis", "new_probe_family", "new_runnable_successor", @@ -24,7 +25,7 @@ const VISION_TRIGGERS = new Set([ "vision_successor_required", "required_agent_vision_missing", ]); const EXTERNAL_REVIEW_TRIGGERS = new Set(["external_progress_review_drift"]); -const FRESH_PATH_DISPOSITIONS = new Set(["continue", "no_change", "replan"]); +export const FRESH_PATH_DISPOSITIONS = new Set(["continue", "no_change", "replan"]); const PROGRESS_CLI_ARGS = "--progress-result-class --progress-surface-id --progress-hypothesis-id --progress-probe-kind --progress-evidence-id "; const VISION_CLI_ARGS = "--agent-vision-json ''"; @@ -325,7 +326,10 @@ export function projectReplanSemantics(value: unknown): JsonObject { const required = requiredSemanticOutcomes(obligation); const externalReview = isExternalReview(obligation); if (request.operation === "requirements") { - return {required_any_of: required, planning_guidance: [...REPLAN_PLANNING_GUIDANCE], + const strideControl = strideControlContract(object(obligation.replan_context), obligation.obligation_id); + return {required_any_of: required, planning_guidance: [...REPLAN_PLANNING_GUIDANCE, + ...stridePlanningGuidance(object(obligation.replan_context).stride_strategy)], + ...(strideControl ? {stride_control: strideControl} : {}), ...writebackProjection(required, externalReview)}; } if (request.operation !== "qualify") { @@ -337,6 +341,14 @@ export function projectReplanSemantics(value: unknown): JsonObject { const vision = object(request.agent_vision); const patch = object(vision.vision_patch); const path = object(vision.path_delta); + const context = object(obligation.replan_context); + const [strideDecision] = normalizeStrideDecision(vision.stride_decision); + const structuredReview = normalizeStrideStrategy(context.stride_strategy) !== "off"; + const freshPath = Boolean(String(patch.acceptance_summary ?? "").trim() && + FRESH_PATH_DISPOSITIONS.has(String(path.outcome ?? "").trim()) && strings(path.evidence_refs).length); + const missingStride = structuredReview && freshPath && !strideDecision; + const staleStride = !!strideDecision && structuredReview && + strideDecision.reference_obligation_id !== obligation.obligation_id; let outcomes = strings(observation.delta_kinds); if (outcomes.some(outcome => !KNOWN_OUTCOMES.has(outcome))) { throw new EffectRuntimeRequestError("observation_delta contains an unknown typed outcome"); @@ -359,11 +371,10 @@ export function projectReplanSemantics(value: unknown): JsonObject { const inconsistentTerminal = outcomes.includes("coverage_backed_no_followup") && (vision.state !== "no_followup" || path.outcome !== "stop"); if (inconsistentTerminal) outcomes = outcomes.filter(outcome => outcome !== "coverage_backed_no_followup"); - if (String(patch.acceptance_summary ?? "").trim() && - FRESH_PATH_DISPOSITIONS.has(String(path.outcome ?? "").trim()) && - strings(path.evidence_refs).length && !outcomes.includes("fresh_vision_path_outcome")) { + if (freshPath && !missingStride && !staleStride && !outcomes.includes("fresh_vision_path_outcome")) { outcomes.push("fresh_vision_path_outcome"); } + if (staleStride || missingStride) outcomes = outcomes.filter(outcome => outcome !== "fresh_vision_path_outcome"); const satisfying = inconsistentTerminal ? [] : outcomes.filter(outcome => required.includes(outcome as SemanticOutcome)); const replayRefused = (replayed || knownBlocker) && !satisfying.length && !inconsistentTerminal; const identityRefused = identityWithoutEvidence && !satisfying.length && !inconsistentTerminal; @@ -372,13 +383,17 @@ export function projectReplanSemantics(value: unknown): JsonObject { outcomes, satisfying_outcomes: satisfying, required_any_of: required, observation_fingerprint: observation.observation_fingerprint ?? null, reason: satisfying.length ? "writeback changes an outcome accepted by this obligation source" + : missingStride ? "enabled stride review requires agent_vision.stride_decision from the delivered control contract" + : staleStride ? "stride decision must reference the admitted replan obligation; reassess against its evidence" : inconsistentTerminal ? "coverage-backed no-follow-up requires agent_vision.state=no_followup and path_delta.outcome=stop" : replayRefused ? (knownBlocker ? "replan does not accept a blocker already recorded in its baseline, window or coverage ledger" : "external progress review does not accept a typed observation already claimed in the obligation window") : identityRefused ? "external progress review accepts a new surface, hypothesis or probe family only with evidence ids absent from the evaluated baseline and every claim in the obligation window" : "writeback does not satisfy this obligation's typed outcomes", - ...(inconsistentTerminal ? {reason_code: "no_followup_vision_path_inconsistent"} + ...(missingStride && !satisfying.length ? {reason_code: "stride_decision_required"} + : staleStride && !satisfying.length ? {reason_code: "stride_reference_obligation_mismatch"} + : inconsistentTerminal ? {reason_code: "no_followup_vision_path_inconsistent"} : replayRefused ? {reason_code: "progress_observation_replayed"} : identityRefused ? {reason_code: "progress_identity_without_new_evidence"} : {}), }; diff --git a/loopx/control_plane/work_items/stride_policy.ts b/loopx/control_plane/work_items/stride_policy.ts new file mode 100644 index 0000000000..154db87671 --- /dev/null +++ b/loopx/control_plane/work_items/stride_policy.ts @@ -0,0 +1,130 @@ +/** Optional stride strategy: proposes model decisions, never execution authority. + * Configuration tokens have one shared schema. Add a strategy implementation + * and qualify its behavior before making another version selectable. + */ +import schema from "../stride_strategy_schema.json" with {type: "json"}; +import {EffectRuntimeRequestError} from "../effect_runtime_errors.ts"; + +export function normalizeStrideStrategy(value: unknown): string { + if (value === undefined) return schema.default; + if (typeof value !== "string" || !schema.enum.includes(value)) { + throw new EffectRuntimeRequestError("stride_strategy must be off or evidence_conditioned_v1"); + } + return value; +} + +export function stridePlanningGuidance(value: unknown): string[] { + const version = normalizeStrideStrategy(value); + if (version === "off") return []; + if (version === "evidence_conditioned_v1") return [ + "Review the previous path decision against subsequent work and authoritative outcomes. " + + "Adjust work-slice size, mechanism distance and validation breadth independently: a bold new " + + "route can start with a small probe; a supported route can justify a larger coherent slice. " + + "If local tuning leaves the goal gap unexplained, compare an alternative with continuation or replication; " + + "do not force a pivot from elapsed time or one noisy result. Preserve the best qualified artifact. " + + "State the next probe's distinguishing prediction, adoption criterion and bounded cost; review its " + + "actual execution and outcome next. Use the live stride_control contract to declare a bounded " + + "agent_vision.stride_decision; its strategy derives the three axes from the evidence basis. " + + "Use existing Todo/path/successor boundaries without changing authority or acceptance.", + ]; + throw new EffectRuntimeRequestError("stride strategy version has no qualified implementation"); +} + +// This is a model-assessed evidence basis, not a classifier of prose or scores. +// The versioned TS policy owns the three independently adjustable coordinates. +import decisionSchema from "../stride_decision_schema.json" with {type: "json"}; +import type {JsonObject} from "../effect_program.ts"; +import {requireJsonObject, requireNonEmptyString} from "../runtime_decode.ts"; + +const V1_VECTORS: Record = { + supported_progress: {work_slice: "grow", route_distance: "hold", validation_scope: "hold"}, + unexplained_gap: {work_slice: "shrink", route_distance: "grow", validation_scope: "shrink"}, + uncertain_evidence: {work_slice: "shrink", route_distance: "hold", validation_scope: "grow"}, + useful_new_route: {work_slice: "grow", route_distance: "hold", validation_scope: "grow"}, + decision_failure: {work_slice: "shrink", route_distance: "hold", validation_scope: "shrink"}, +}; + +export const STRIDE_DECISION_SCHEMA = decisionSchema.schema_version; +export const STRIDE_PROBE_LIMITS = decisionSchema.probe_field_limits; + +type BoundedText = (field: string, value: unknown, limit: number) => string; +function text(field: string, value: unknown, limit: number): string { + const result = requireNonEmptyString(value, field).trim(); + if (result.length > limit) throw new EffectRuntimeRequestError(`${field} exceeds ${limit} characters`); + return result; +} +function exactFields(value: JsonObject, fields: string[], label: string): void { + if (Object.keys(value).some(key => !fields.includes(key))) { + throw new EffectRuntimeRequestError(`${label} contains unsupported fields`); + } +} + +/** Normalize a declared control decision; derive the vector in the strategy + * owner rather than trusting an arbitrary model-supplied vector. The basis and + * predicted utility remain Agent claims, not certified evidence or authority. + */ +export function normalizeStrideDecision(value: unknown, bounded: BoundedText = text): + [JsonObject | null, Record] { + if (value === undefined) return [null, {}]; + const input = requireJsonObject(value, "stride_decision"); + exactFields(input, ["schema_version", "strategy_version", "reference_context_id", "reference_obligation_id", "basis", "axes", "next_probe"], "stride_decision"); + if (input.schema_version !== decisionSchema.schema_version || + normalizeStrideStrategy(input.strategy_version) !== "evidence_conditioned_v1") { + throw new EffectRuntimeRequestError("stride_decision requires stride_decision_v1 and evidence_conditioned_v1"); + } + const context = requireNonEmptyString(input.reference_context_id, "stride_decision.reference_context_id"); + if (!/^replan-context-[a-f0-9]{24}$/.test(context)) { + throw new EffectRuntimeRequestError("stride_decision requires the delivered replan context id"); + } + const obligation = requireNonEmptyString(input.reference_obligation_id, "stride_decision.reference_obligation_id"); + if (!/^replan-[a-f0-9]{16}$/.test(obligation)) { + throw new EffectRuntimeRequestError("stride_decision requires the admitted replan obligation id"); + } + if (typeof input.basis !== "string" || !decisionSchema.basis_options.includes(input.basis)) { + throw new EffectRuntimeRequestError("stride_decision.basis must be a registered model-assessed evidence basis"); + } + const axes = V1_VECTORS[input.basis]; + if (!axes) throw new EffectRuntimeRequestError("stride basis has no qualified strategy implementation"); + if (input.axes !== undefined) { + const proposed = requireJsonObject(input.axes, "stride_decision.axes"); + exactFields(proposed, decisionSchema.axis_names, "stride_decision.axes"); + if (decisionSchema.axis_names.some(axis => proposed[axis] !== axes[axis])) { + throw new EffectRuntimeRequestError("stride_decision axes do not match the selected version and basis"); + } + } + const probe = requireJsonObject(input.next_probe, "stride_decision.next_probe"); + exactFields(probe, Object.keys(decisionSchema.probe_field_limits), "stride_decision.next_probe"); + const normalized: JsonObject = {}; + const usage: Record = {}; + for (const [field, limit] of Object.entries(decisionSchema.probe_field_limits)) { + const label = `stride_decision.next_probe.${field}`; + normalized[field] = bounded(label, requireNonEmptyString(probe[field], label), limit); + usage[label] = String(normalized[field]).length; + } + for (const [field, entry] of Object.entries({strategy_version: input.strategy_version, + reference_context_id: context, reference_obligation_id: obligation, basis: input.basis, ...axes})) { + usage[`stride_decision.${decisionSchema.axis_names.includes(field) ? "axes." : ""}${field}`] = String(entry).length; + } + return [{schema_version: decisionSchema.schema_version, strategy_version: input.strategy_version, + reference_context_id: context, reference_obligation_id: obligation, basis: input.basis, axes: {...axes}, next_probe: normalized}, usage]; +} + +export function strideControlContract(context: JsonObject, obligationId: unknown = null): JsonObject | null { + if (normalizeStrideStrategy(context.stride_strategy) === "off") return null; + return {schema_version: decisionSchema.schema_version, strategy_version: context.stride_strategy, + reference_context_id: context.context_id ?? null, reference_obligation_id: obligationId, + basis_vectors: V1_VECTORS, + minimal_example: {schema_version: decisionSchema.schema_version, strategy_version: context.stride_strategy, + reference_context_id: context.context_id ?? null, reference_obligation_id: obligationId, + basis: "uncertain_evidence", next_probe: {scope: "One discriminating probe.", + prediction: "Distinguish the remaining explanations.", adoption_criterion: "Applicable evidence supports the next slice.", + cost_bound: "One bounded comparison before another review."}}, + probe_field_limits: decisionSchema.probe_field_limits, + attachment: "agent_vision.stride_decision", requires_structured_fresh_path: true, + rule: "Enabled fresh Vision path reviews require this structured proposal. Other source-specific exits remain unchanged. " + + "Assess the evidence basis using the delivered context. The strategy derives the axes; " + + "declare the next probe's scope, prediction, adoption criterion and cost bound. " + + "The declaration is a structured control proposal, not execution permission or proof of utility. " + + "Todo/Next Action governs admitted work; review actual execution and results before expanding.", + }; +} diff --git a/loopx/control_plane/work_items/stride_policy_codec.py b/loopx/control_plane/work_items/stride_policy_codec.py new file mode 100644 index 0000000000..f911b4041e --- /dev/null +++ b/loopx/control_plane/work_items/stride_policy_codec.py @@ -0,0 +1,23 @@ +"""Configuration transport codec; stride decisions belong to the TS component. + +The root package asset is shared with TypeScript and already included in wheels. +Reading these lexical options does not start Node or introduce a Python policy. +""" +from __future__ import annotations + +import json +from functools import lru_cache +from importlib.resources import files +from typing import Any + + +@lru_cache(maxsize=1) +def stride_strategy_options() -> tuple[str, ...]: + contract = json.loads(files("loopx.control_plane").joinpath("stride_strategy_schema.json").read_text()) + return tuple(contract["enum"]) + + +def normalize_stride_strategy(value: Any) -> str: + if not isinstance(value, str) or value not in stride_strategy_options(): + raise ValueError("stride_strategy must be off or evidence_conditioned_v1") + return value diff --git a/loopx/execution_profile.py b/loopx/execution_profile.py index 987d9c92ea..b13bca3c4d 100644 --- a/loopx/execution_profile.py +++ b/loopx/execution_profile.py @@ -154,6 +154,12 @@ def compact_execution_profile(value: Any) -> dict[str, Any]: if not isinstance(value, dict): return profile + if "stride_strategy" in value: + from .control_plane.work_items.stride_policy_codec import normalize_stride_strategy + profile["stride_strategy"] = normalize_stride_strategy(value["stride_strategy"]) + if not any(key in value for key in ("replan_after_effective_turns", "replan_after_completed_todos")): + raise ValueError("a Goal stride strategy requires an explicit review cadence in the same profile") + if "replan_after_effective_turns" in value and "replan_after_completed_todos" in value: raise ValueError("choose one review cadence unit") if "replan_after_effective_turns" in value: @@ -243,6 +249,8 @@ def apply_goal_execution_profile_change( clear_replan_after_completed_todos: bool, replan_after_effective_turns: int | None = None, clear_replan_after_effective_turns: bool = False, + stride_strategy: str | None = None, + clear_stride_strategy: bool = False, ) -> None: if ( clear_replan_after_completed_todos @@ -256,16 +264,24 @@ def apply_goal_execution_profile_change( replan_after_completed_todos is not None or clear_replan_after_effective_turns ): raise ValueError("choose one review cadence override or clear operation") + if stride_strategy is not None and clear_stride_strategy: + raise ValueError("choose a stride strategy override or clear operation") raw = goal.get("execution_profile") profile = dict(raw) if isinstance(raw, dict) else {} if ( - turn_granularity is None + stride_strategy is None + and not clear_stride_strategy + and turn_granularity is None and replan_after_completed_todos is None and replan_after_effective_turns is None and not clear_replan_after_effective_turns and not (clear_replan_after_completed_todos and "replan_after_completed_todos" in profile) ): return + if clear_stride_strategy: + profile.pop("stride_strategy", None) + if stride_strategy is not None: + profile["stride_strategy"] = stride_strategy if clear_replan_after_effective_turns or replan_after_completed_todos is not None: profile.pop("replan_after_effective_turns", None) if replan_after_effective_turns is not None: @@ -273,6 +289,11 @@ def apply_goal_execution_profile_change( profile.pop("replan_after_completed_todos", None) if clear_replan_after_completed_todos: profile.pop("replan_after_completed_todos", None) + if stride_strategy is None and (clear_replan_after_completed_todos or clear_replan_after_effective_turns) and not any( + key in profile for key in ("replan_after_effective_turns", "replan_after_completed_todos") + ): + # This capability is one review configuration, not per-field inheritance. + profile.pop("stride_strategy", None) goal["execution_profile"] = configure_execution_profile( profile, turn_granularity=turn_granularity, diff --git a/loopx/semantics/project_registry_io_manifest_v1.json b/loopx/semantics/project_registry_io_manifest_v1.json index f11803304e..777dc4fafa 100644 --- a/loopx/semantics/project_registry_io_manifest_v1.json +++ b/loopx/semantics/project_registry_io_manifest_v1.json @@ -1031,7 +1031,7 @@ }, { "site": "loopx/configure_goal.py::.configure_goal::codec_transaction:project_registry_transaction#1", - "line": 521, + "line": 523, "column": 14, "kind": "codec_transaction", "api": "project_registry_transaction", @@ -1039,7 +1039,7 @@ }, { "site": "loopx/configure_goal.py::.configure_goal::codec_read:load_project_registry#1", - "line": 731, + "line": 733, "column": 14, "kind": "codec_read", "api": "load_project_registry", diff --git a/loopx/state_refresh.py b/loopx/state_refresh.py index ba416d7b3a..fa4be004b1 100644 --- a/loopx/state_refresh.py +++ b/loopx/state_refresh.py @@ -444,7 +444,7 @@ def _build_state_refresh_output_projections( field: agent_vision.get(field) for field in ( "schema_version", "agent_id", "state", "vision_patch", - "todo_delta", "fallback_declarations", "vision_budget", + "todo_delta", "fallback_declarations", "stride_decision", "vision_budget", ) } if isinstance(agent_vision.get("path_delta"), dict): From 0c2974d916bee783835e5c5aacb99e90a6d9bf8d Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 12 Oct 2026 14:24:16 +0800 Subject: [PATCH 2/7] docs(stride): define structured research scope and qualified continuation Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../hierarchical-agent-stride-control-v0.md | 263 ++++++++++++++++-- ...rarchical-agent-stride-control-v0.zh-CN.md | 197 +++++++++++-- .../rfcs/loopx-overall-roadmap-v0.md | 2 +- .../rfcs/loopx-overall-roadmap-v0.zh-CN.md | 2 +- .../research-exploration-control-plane-v0.md | 35 +++ ...arch-exploration-control-plane-v0.zh-CN.md | 27 ++ docs/quota-allocation.md | 10 +- .../assets/stride-strategy-editor.png | Bin 0 -> 110302 bytes .../goal-vision-replan-contract-v0.md | 174 +++++++++++- 9 files changed, 646 insertions(+), 64 deletions(-) create mode 100644 docs/reference/protocols/assets/stride-strategy-editor.png diff --git a/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.md b/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.md index e290d5629d..5b12d0d130 100644 --- a/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.md +++ b/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.md @@ -6,9 +6,9 @@ | Supersedes / closes | none | | Date | 2026-08-15 | | Authors | LoopX maintainers | -| Scope | Effect feedback, bounded delivery, authority escalation, model qualification, and long-horizon efficiency | +| Scope | Effect feedback, bounded delivery, research scope, authority escalation, and long-horizon outcome/cost | | Tracking issue | [#3203](https://github.com/huangruiteng/loopx/issues/3203) | -| Source baseline | LoopX `8b8e7b248` | +| Source baseline | LoopX `d03863fd0`; source-level decision followthrough refinement below | > Language note: the > [Chinese version](./hierarchical-agent-stride-control-v0.zh-CN.md) and this @@ -39,11 +39,22 @@ gate, and human authority. An inner result may force an early delivery settlement; a delivery result may force an early authority escalation. A scheduler tick alone must not manufacture either semantic transition. -This RFC proposes a measurement-first program. The smallest useful slice is a -read-only, provider-neutral stride observation derived from existing receipts. -It should characterize current standard and fine-grained execution before any -runtime automatically widens or narrows a stride. Adaptive control begins in -shadow mode and is promoted only after repeated, stable qualification. +Research makes delivery stride a **vector**: work-slice size, distance from the +current mechanism, and validation breadth. These coordinates can move +independently. A long +slice can perform many correct local checks without obtaining new information +about the remaining goal gap. Fewer control events cannot fix that failure. +Conversely, a small late gain near a task's attainable limit may be useful; +elapsed time or a flat score alone cannot select a larger experiment. + +The delivery controller therefore closes **decision -> actual work -> evidence +-> next decision**, while the existing owners retain execution and settlement. +The current bounded implementation returns the previous accepted Vision path +and subsequent recorded progress to replan, with goal gain explicitly unknown. +This is decision input and Agent guidance, not adaptive scheduling, a result +adoption gate or proof of research utility. Automatic policies remain opt-in +proposals requiring repeated qualification. Research-state branches provide the +counterfactual test without discarding the accumulated work. The core judgment is: @@ -162,6 +173,7 @@ the research direction. | Delivery | Execution profiles distinguish standard and fine-grained Todo contracts; fine-grained mode uses a coherent-slice turn budget and evidence-sensitive successor creation. Every admitted heartbeat still performs full durable settlement. | | Continuation | In addition to same-Turn controller dispositions, a typed delivery-continuity reducer can preserve the latest accountable `outcome_progress` Todo across heartbeat wakes while that same Todo remains open, actionable, capability-ready, and owned by the same agent. | | Progress | Typed progress observations, repeat detection, semantic replan closure, and evidence projections can distinguish material delta from maintenance. | +| Review feedback | The replan context source implementation can return the last accepted evidence-linked Vision path and subsequent recorded progress references. History append order and Goal/Agent/Turn lineage bind this input; missing execution and goal gains remain unknown. It does not certify that a proposed intervention ran. | | Research | The [Research Exploration Control Plane RFC](./research-exploration-control-plane-v0.md) defines an optional typed knowledge frontier and composition experiments. | | Authority | Goal vision, user gates, permission policy, and peer/supervisor boundaries remain separate from execution and scheduling. | @@ -169,12 +181,13 @@ the research direction. | Gap | Consequence | |---|---| -| No shared stride vocabulary | Host, Todo, scheduler, and human-attention changes are discussed as one generic "turn length" problem. | -| No cross-layer observation | LoopX cannot tell whether low throughput came from model/tool roundtrips, over-frequent settlement, or authority churn. | +| Incomplete outcome-linked observations | Read-only M1 counts and review followthrough exist, but they cannot explain task gains, model/tool cost, settlement cost or authority churn without provider evidence. | +| No qualified research-scope policy | Continued local tuning can be mistaken for broad exploration; generic progress identifiers do not establish mechanism novelty or useful information. | | No model capability profile for stride | A fast tool-using model and a slower protocol-reliable model receive mostly static execution contracts. | | No semantic split/merge qualification | Todo granularity is configured or prompted, but not evaluated against observed decision changes and settlement cost. | | No interruption-value model | Periodic reports and genuine authority changes are not measured separately. | -| No adaptive promotion path | There is no shadow recommendation -> bounded experiment -> promoted policy lifecycle for stride tuning. | +| No qualified adaptive promotion path | Shadow input does not yet establish model adoption, matched continuation benefit or a promoted model/work-class policy. | +| No qualified research-state branch | Code snapshots alone cannot preserve conversation, accumulated evidence and evaluation opportunities for a fair continuation comparison. | ## 5. The Three-Layer Model @@ -482,6 +495,188 @@ through existing task/capability surfaces. CLI readback alone is a partial slice. Scientific usefulness follows the independent qualification in [research decisions](research-exploration-control-plane-v0.md#115-evidence-conditioned-experiment-decisions-proposed-refinement). +### 7.6 Research scope and evidence-conditioned control + +Research stride has three independently chosen coordinates. The first two are +the main controls; the third bounds the evidence and cost needed to act: + +- **Work-slice size:** the coherent outcome, scope and cost admitted before the + next decision. This includes Todo granularity, splitting a broad experiment + and continuing a supported route across a larger slice. Todo text length or + number of files is not size; a larger slice must retain an observable + postcondition and normal per-Turn settlement. + +- **Mechanism distance:** local parameter/implementation tuning versus a + materially different representation, model, search neighborhood or causal + explanation. A renamed hypothesis, a new file or more tests is not distance. +- **Evidence breadth:** a cheap discriminating probe, a comparable pilot, then + the validation needed for actual adoption. More coverage is useful only when + it resolves an uncertainty that matters to the next decision. + +Replan reviews this vector without becoming another authority owner. +Changing an agent-created method or provisional candidate rule inside the +authorized goal is an ordinary research decision. Changing the task, acceptance, +feedback protocol, budget, permission or stop conditions requires its existing +owner. A request to explore more broadly never grants access to hidden data or +permits rewriting the metric after failure. + +| Observed basis | Next decision to compare | +|---|---| +| A new result is missing, invalid or incomparable | Repair the observation or choose a probe with known coverage; keep utility unknown. | +| One valid candidate loses or results conflict within uncertainty | Protect the incumbent; scope the negative evidence and compare replication, another uncovered condition and a different mechanism. Do not retire a family from one loss. | +| Local checks succeed but do not explain the authoritative goal gap | Compare a bounded mechanism-changing probe with continued tuning. Name the distinguishing prediction and how it reaches the executed candidate. | +| Known headroom is small or variance dominates the expected effect | Prefer a justified uncertainty reduction or a low-cost improvement; require evidence before spending a large new search budget. A theoretical ceiling is not a feasible optimum. | +| No reasonable in-scope probe remains under the current evidence and stops | Record scoped exhaustion or a concrete hold through the existing owner; do not manufacture activity or claim the goal achieved. | + +The model chooses; generic code must not derive these scientific rows from prose +substrings, a score slope, elapsed hours or a fixed failure count. The provider +owns metric meaning, comparison validity, noise and task-specific headroom. +Explore retains explicitly declared mechanism relations and scoped findings. +The existing typed replan owner delivers the goal, evidence and prior path; +ordinary task/successor and Vision writeback own the decision and its adoption. + +At each decision boundary: + +1. Reconcile the prior path with subsequent work, current artifact and + authoritative outcomes. Identify what actually ran, what changed knowledge, + what was adopted and what remains unknown. A progress receipt is insufficient. +2. Compare continuation, a discriminating alternative and justified replication + when relevant. Rank expected goal/information gain against complete marginal + cost: model input/output, tool work, validation, control and opportunity cost. +3. Choose one bounded next probe with its distinguishing prediction, comparison, + incumbent protection, adoption criterion and cost/stop bounds. A larger + mechanism change can start with a small pilot; it need not start with a large + validation sweep. +4. Execute through the normal admitted task. Bind evidence to the tested input + and exact candidate; retain failed, negative and uncertain results distinctly. +5. At the next review, use the new observation to retain, revise or stop the + scoped route. State why a repeat can resolve a new uncertainty. Do not reset + other trigger counters merely because the prompt was read. + +The source-level `replan_context.decision_followthrough` is the first reusable +feedback slice. It references the last accepted evidence-linked Vision path and +at most six later distinct progress fingerprints, retaining complete recorded +counts and omissions. It uses immutable append order rather than timestamps, +excludes other agents and explicitly retired Goal instances, and resolves refs +through the existing history read. An absent or corrupt basis is not replaced +with invented evidence. The field never qualifies execution, scientific novelty, +utility, effective-Turn counts or acceptance; these remain independent checks. +No new scheduler, selection rule, quota debit or per-result settlement is added. + +#### An iterative strategy and engineering boundary + +The first strategy is **model-guided, evidence-conditioned vector adjustment**. +It proposes increasing, retaining or reducing each coordinate, with a reason +and a falsifiable next probe. It does not optimize a universal novelty score: +mechanism distance is relative to a declared reference method and goal, while +slice size is relative to the next useful postcondition and decision risk. + +| Basis | Work slice | Mechanism distance | Evidence breadth | +|---|---|---|---| +| A supported method yields repeatable useful progress | Increase coherent work when decision risk permits | Retain unless a remaining gap justifies alternatives | Keep required checks; avoid redundant sweeps | +| Current method leaves a substantive gap under applicable evidence | Start with a small discriminating pilot | Compare a larger departure with continuation | Narrow to the observation that distinguishes the routes | +| Results conflict or expected gains are below uncertainty | Reduce work until the decision is clearer | Retain or compare alternatives without declaring refutation | Increase only a justified replication/uncertainty probe | +| A larger departure produces attributable useful results | Expand the adopted method's next slice | Retain the useful departure, not novelty for its own sake | Expand validation needed for adoption | +| Decision-relevant failure or an authority boundary appears | End/split the current slice through its owner | Reassess within the existing goal | Validate the specific failure; never widen authority | + +This table guides a model decision; it is not a prose classifier or a fixed +numeric policy. The engineering design has four replaceable boundaries: + +1. **Observation adapters** produce exact candidate/result, validity/uncertainty, + coverage and cost facts. Domain providers own their meanings; they cannot + write generic policy or confer execution permission. +2. **Strategy** consumes one source-bound review basis and proposes the stride + vector, next probe and expected benefit/cost. Version and record the strategy + with the experiment. Start with the table above; deterministic heuristics or + a learned strategy can later replace this function under the same inputs. + Do not build a plugin registry or train a controller before a second real + qualified strategy needs that seam. +3. **Admission/adoption** validates the proposal through existing Todo, Vision, + replan, budget and authority owners. Work-slice changes use normal split/ + continuation/successor operations. A route decision cannot execute a + successor during an original Turn's outstanding settlement. +4. **Feedback** returns actual execution, results, retained artifact and complete + cost to the next review. Proposal, adoption and utility remain separately + replayable; missing feedback never becomes success. + +The present source slice implements the fourth boundary's recorded-decision +input and the optional TypeScript strategy component `evidence_conditioned_v1`. +The first version accepts a model-assessed evidence basis and deterministically +derives three relative `grow | hold | shrink` coordinates. A versioned +`agent_vision.stride_decision` carries that vector, the admitted obligation and +observed context ids, and the next probe/adoption/cost commitments. Vision +authoring validates the declared shape and vector before mutation. Enabled fresh +Vision path reviews require the structured proposal; other source-specific exits +remain unchanged. Existing +Todo/Next Action admits work, and the next review returns the decision with +actual observations. This is structured proposal control, not an automatic +executor or a machine classifier of research merit. Its shared configuration +vocabulary is `off | evidence_conditioned_v1`; unknown +versions fail before mutation. The existing Goal review capability editor and +CLI expose the version for a whole Goal override or inherited device default. +`off` preserves ordinary evidence identity/selection and the five existing review +instructions. Enablement adds the source-bound followthrough input and separate +work-slice/mechanism-distance/validation-breadth advice. It has no automatic +vector actuator. Use the existing bounded `path_delta` and task Next Action to +record the first proposals; do not create another policy/state database. The explicit versioned attachment prevents parsing prose as a control vector. +Future strategy versions preserve default-off parity, bounded fields and +separate proposal/adoption authority; do not silently reinterpret old decisions. Promote each strategy after same-state ablations establish +adoption and full-cost benefit; change one coordinate before studying their +interaction. Six effective work Turns remains the existing review default, +not the size of a Todo, experiment or mechanism change. + +Exploratory iteration may run only strategy-enabled test arms and reuse historical +baselines as descriptive references. A fresh concurrent baseline is not required +for every iteration; such runs establish route adoption and useful iteration +signals, not an isolated causal effect or promotion qualification. Reserve +matched continuation and replication for decisions that need those claims. + +### 7.7 Research-state branching and matched continuation + +A restorable research point combines **conversation position, research evidence, +code/candidate artifacts and observation opportunities**. A code archive or +trajectory prefix alone is not that point. Capture and verification reuse the +existing [backup/recovery owners](complete-state-recovery-v0.md), Host session +owner and artifact provider. This RFC supplies the research experiment's +consistency and comparison requirements, not a second restore authority. + +Before capture, declare the point by elapsed research budget or a semantic event; +do not choose it retrospectively for a favorable score. A later point such as +ten hours is an experiment setting, not a product default or automatic pivot. +Record the actual boundary and any skew: + +- native conversation cursor and a Host-qualified export/fork path; copied log + text does not establish a resumable session; +- settled LoopX research evidence, original goal/priorities, prior decisions, + scoped negative results and unresolved questions; +- exact working code, necessary authorized untracked files, incumbent artifact + and its qualifying result, kept separately from unmeasured candidates; +- source/model/tool/evaluator pins and solver-visible feedback already consumed; +- remaining total budget, accepted submission history and next feedback + opportunity under the original protocol. + +An inert verification unit grants no execution authority. The destination uses +fresh experiment/Host identities and the existing Goal/session/state admission +paths. Historical leases, quota, timers, pending effects and submission tokens +cannot become destination authority. Reconcile unknown effects by original +identity before any replay. A Host without a qualified fork reports that gap; +an evidence-summary restart is a different treatment, not exact continuation. + +Validate digest/cursor/artifact consistency, partial capture, missing files, +changed inputs, duplicate restore, conflicting writer, stopped source and lost +result delivery before running a matched study. Resume must demonstrate actual +use of the captured evidence and code, then useful new work. Successful tar +verification or session opening alone is not acceptance. + +For the research ablation, branch the **same** qualified point into unchanged +continuation and evidence-conditioned scope review, with equal continuation +budgets and resources. Change one control factor; preserve feedback opportunity +counts and cooldown timing through the evaluator owner. Label session restart, +summary replacement, source upgrades or policy bundles as additional factors. +Keep all branches and invalid/negative results; compare adopted native outcomes, +information gained and full continuation cost. The result qualifies the scoped +intervention, not all LoopX behavior or an optimal universal stride. + ## 8. Measurement Model The first implementation should measure before it controls. @@ -673,6 +868,18 @@ The first study should avoid a full three-dimensional combinatorial grid. - event-driven authority escalation; - identical effect and delivery contracts. +**Stage E: compare research scope from the same captured state** + +- unchanged continuation versus the §7.6 evidence-conditioned scope review; +- the same qualified §7.7 conversation/evidence/code point and feedback history; +- equal continuation resources, budget and evaluation opportunities; +- distinct native outcome, information/adoption and complete-cost measures; +- a small recovery/adoption pilot first, repeated cells before promotion. + +Choose tasks with room for a genuinely different mechanism and retain a +near-ceiling or noisy case as a limit check. Do not select checkpoints or omit +branches after observing their scores. + Only after these stages identify interactions should a factorial experiment combine promoted profiles. @@ -687,21 +894,18 @@ keyword. ## 11. Smallest Useful Implementation Slice -The first implementation is deliberately narrow and reversible: - -1. Add one public architecture vocabulary for effect, delivery, and authority - stride. -2. Derive a read-only stride observation from existing Turn, settlement, Todo, - quota, and gate receipts where available. -3. Add an offline evaluator that reports layer metrics and mismatch signals. -4. Characterize standard and fine-grained LoopX profiles with public-safe - fixtures and at least one real model behavior qualification path. -5. Emit shadow recommendations only. Do not alter Todo selection, scheduler - frequency, effect execution, or user notification. +M1 read-only observation remains available. The next complete, reversible slice +returns prior accepted decisions and subsequent evidence to the existing replan +entry, with the guidance in §7.6. It does not add a classifier, scheduler or +acceptance gate. Qualify the real CLI/Host projection, immutable reference +readback, missing/corrupt/stale inputs and unchanged semantic discharge first. -The first slice should extend the nearest existing Turn/status read model. It -should not create a new built-in capability, executor, scheduler, or generic -policy framework. +Then qualify one research-state capture/continuation profile under §7.7. Keep +verification, executable continuation, model adoption and scientific benefit as +separate outcomes. Matched continuation pilots judge whether scope review +produces discriminating experiments and adopted improvements; repeated studies +and full-cost evidence precede adaptive-policy promotion. A partial Host export +or a read-only decision projection does not close this implementation program. ## 12. Milestones @@ -730,6 +934,9 @@ policy framework. transitions; - validate recommendations against independent acceptance rules; - retain Todo and replan as the only execution authorities. +- qualify §7.6 decision followthrough at the real replan entry and observe + whether the next probe changes relevant information, rather than identifiers; +- qualify one §7.7 research-state branch and matched continuation profile; - qualify the proposed §7.5 provider checkpoint/monitor binding in shadow; distinguish model decisions from experiment completion and Turn settlement. @@ -768,6 +975,14 @@ The research program is qualified only when it can prove: 9. promoted profiles improve end-to-end quality or cost across repeated runs, not only one layer-local count; 10. failure cases remain honestly terminal and recoverable. +11. research scope changes preserve the original task and acceptance; evidence + breadth is justified by decision value rather than repeated-check count; +12. a restored research point retains conversation/evidence/code and equivalent + feedback opportunities without reviving source execution authority; +13. prior decision, actual experiment, result interpretation and adopted action + are distinguishable; missing execution or utility remains unknown; +14. matched continuation comparisons retain incumbent, uncertainty, failures and + full model/tool/control costs; a local proxy gain is not native goal gain. ## 14. Non-Goals diff --git a/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.zh-CN.md b/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.zh-CN.md index 15997e658b..700d47dae6 100644 --- a/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.zh-CN.md +++ b/docs/architecture/rfcs/hierarchical-agent-stride-control-v0.zh-CN.md @@ -6,9 +6,9 @@ | 替代 / 关闭 | 无 | | 日期 | 2026-08-15 | | 作者 | LoopX maintainers | -| 范围 | Effect 反馈、有界交付、权限升级、模型资格验证与长程效率 | +| 范围 | Effect 反馈、有界交付、研究范围、权限升级与长程效果/成本 | | Tracking issue | [#3203](https://github.com/huangruiteng/loopx/issues/3203) | -| 源码基线 | LoopX `8b8e7b248` | +| 源码基线 | LoopX `d03863fd0`;下文包含源码层面的决策接续修订 | > 语言说明: > [英文版](./hierarchical-agent-stride-control-v0.md)与本文档是语义镜像, @@ -33,10 +33,16 @@ interpreter 拥有,中层由 LoopX Turn/Todo/settlement 生命周期拥有, goal、vision、gate 与人类权限拥有。内层结果可以迫使中层提前结算;中层结果 可以迫使外层提前升级权限。一次 scheduler tick 本身不能制造任何一种语义迁移。 -本 RFC 提出一项 measurement-first 研究计划。最小有用切片是从现有 receipt -派生只读、provider-neutral 的 stride observation。在任何 runtime 自动扩大或 -缩小步幅前,先刻画现有 standard 与 fine-grained execution。Adaptive control -先进入 shadow mode,只有反复、稳定的资格验证成立后才 promotion。 +研究使 delivery stride 成为**向量**:工作切片大小、相对当前机制的距离与验证 +广度。各坐标可独立调节。很长的工作切片可以完成大量正确的局部检查,却未增加关于 +目标缺口的信息;减少控制事件不能修好这个问题。反过来,接近题目可达极限时, +中后期的小收益也可能有价值;单凭时长或分数持平不能决定扩大实验。 + +因此交付控制闭合**决定 -> 实际工作 -> 证据 -> 下一决定**,执行和结算仍归原 +owner。当前有界源码实现把上次被接受的 Vision 路线和后续记录进度返回给 replan, +目标收益明确保持 unknown。这是决策输入和 Agent 指引,不是自适应调度、结果 +采用门禁或研究收益证明。自动策略仍是需要重复资格验证的 opt-in 提案;研究 +状态分支为反事实验证提供起点,而不丢弃已积累的工作。 核心判断是: @@ -146,6 +152,7 @@ bounded delivery slice。它必须诚实终止于以下之一: | Delivery | Execution profile 已区分 standard 与 fine-grained Todo contract;fine-grained mode 使用 coherent-slice turn budget,并基于 fresh evidence 创建 successor。每个获准 heartbeat 仍执行完整 durable settlement。 | | Continuation | 除同一 Turn 的 controller disposition 外,typed delivery-continuity reducer 可在 heartbeat wake 之间保留最近一次 accountable `outcome_progress` Todo,前提是同一 Todo 仍 open、actionable、capability-ready,且仍由同一 agent 拥有。 | | Progress | Typed progress observation、repeat detection、semantic replan closure 与 evidence projection 能区分 material delta 和 maintenance。 | +| 复盘反馈 | replan context 源码实现可返回上次被接受、绑定证据的 Vision 路线与后续进度引用;按历史追加顺序和 Goal/Agent/Turn lineage 绑定输入。缺失的执行与目标收益仍为 unknown,不证明拟议干预实际运行。 | | Research | [研究型探索控制面 RFC](./research-exploration-control-plane-v0.zh-CN.md) 定义了可选的 typed knowledge frontier 与 composition experiment。 | | Authority | Goal vision、user gate、permission policy 与 peer/supervisor boundary 和 execution、scheduler 保持分离。 | @@ -153,12 +160,13 @@ bounded delivery slice。它必须诚实终止于以下之一: | 缺口 | 后果 | |---|---| -| 没有共享的 stride vocabulary | Host、Todo、scheduler 与 human-attention 的变化都被当成一个泛化的“turn length”问题。 | -| 没有跨层 observation | LoopX 无法判断低吞吐究竟来自 model/tool 往返、过度频繁的 settlement,还是 authority churn。 | +| 缺少与 outcome 绑定的完整观测 | 已有 M1 只读计数和决策接续输入,但仍需 provider 证据解释目标收益、model/tool、结算与权限变化成本。 | +| 研究范围策略尚未资格化 | 持续局部调参可能被误认为广泛探索;通用进度标识不证明机制创新或有效信息。 | | 没有面向步幅的 model capability profile | 快速 tool-using model 与较慢但协议可靠的模型大体收到静态 execution contract。 | | 没有语义 split/merge qualification | Todo 粒度由配置或 prompt 决定,却不按真实 decision change 与 settlement cost 评估。 | | 没有 intervention value model | Periodic report 与真正 authority change 没有分开测量。 | -| 没有 adaptive promotion path | 还没有 shadow recommendation -> bounded experiment -> promoted policy 生命周期。 | +| adaptive promotion 尚未资格化 | shadow 输入尚不能证明模型采用、匹配接续收益或已 promotion 的 model/work-class 策略。 | +| 研究状态分支尚未资格化 | 单独源码快照不能保留会话、积累证据及评测机会,无法建立公平接续对照。 | ## 5. 三层模型 @@ -433,6 +441,139 @@ readback 属于 partial slice。科学效用遵循 [研究决策](research-exploration-control-plane-v0.zh-CN.md#115-由证据驱动的实验决策修订提案) 的独立资格验证。 +### 7.6 研究范围与证据驱动控制 + +研究步幅包含三个独立选择的坐标。前两个是主要控制量,第三个限定采取行动所需 +证据与成本: + +- **工作切片大小**:下次决定前获准执行的连贯 outcome、范围和成本,包括 Todo + 粒度、拆分过大的实验、在已支持路线上扩大连贯切片。Todo 文本长度和文件数 + 不是大小;扩大仍要有可观察 postcondition 和正常逐 Turn 结算。 + +- **机制距离**:局部参数/实现微调,或明显不同的表示、模型、搜索邻域、因果 + 解释。假设改名、新文件和更多测试不构成距离。 +- **证据广度**:低成本的判别性探针、可比 pilot,再到真正采用所需的验证。 + 只有解决与下一决定有关的不确定性,扩大覆盖才有价值。 + +replan 复查这个向量,不成为新的权限 owner。在授权目标内改变 Agent 自建方法 +或暂定候选规则是正常研究决定;改变题目、验收、反馈协议、预算、权限或停止 +条件仍要经过原 owner。扩大探索不授权读取隐藏数据,也不允许失败后重写指标。 + +| 已观察依据 | 应比较的下一决定 | +|---|---| +| 新结果缺失、无效或不可比 | 修复观测,或选覆盖已知的探针;收益保持 unknown。 | +| 单个有效候选退步,或结果在不确定性内冲突 | 保留 incumbent,限定负证据范围,比较重复测量、未覆盖条件与不同机制;不能因一次失败退休整个 family。 | +| 局部检查通过,却不能解释权威目标缺口 | 比较有界的机制变化与继续微调,说明判别性预测以及它如何进入真实执行候选。 | +| 已知空间很小,或方差大于预期效应 | 优先有理由的不确定性消减或低成本改进;大量新增搜索预算要有依据。理论上界不是可行最优解。 | +| 现有证据与停止条件下已无合理范围内探针 | 通过原 owner 记录有范围的耗尽或具体 hold;不制造活动,也不因此宣布目标达成。 | + +由模型选择;通用代码不得根据文案子串、分数斜率、已过小时数或固定失败次数 +推导这些科学判断。指标含义、可比性、噪声和题目空间归 provider;显式机制关系 +与有范围 finding 归 Explore。既有 typed replan owner 投递目标、证据及上次路线; +正常 task/successor 与 Vision 写回拥有决定和采用。 + +每个决策边界执行: + +1. 将上次路线与后续工作、当前产物和权威结果对照;区分实际运行、知识变化、 + 真实采用与 unknown。进度回执不足以证明这些关系。 +2. 按需要比较原路线接续、判别性替代与有理由的重复测量,权衡预期目标/信息 + 收益及完整边际成本:模型输入输出、工具、验证、控制与机会成本。 +3. 选择一个有界探针,说明判别性预测、比较对象、incumbent 保护、采用条件和 + 成本/停止界限。较大机制变化可从小 pilot 开始,不必先做大范围验证。 +4. 通过正常获准 task 执行,证据绑定到受测输入与精确候选;失败、负结果及 + 不确定结果分别保留。 +5. 下次复盘用新观测保留、修订或停止有范围路线;重复必须说明能解决什么新 + 不确定性。不因 prompt 已读就重置其他触发计数。 + +源码层面的 `replan_context.decision_followthrough` 是首个可复用反馈切片:引用 +上次被接受、绑定证据的 Vision 路线,以及最多六个后续不同进度 fingerprint, +保留完整记录计数与遗漏信息。按不可变追加顺序而非时间戳关联,排除其他 Agent +及显式退休的 Goal 实例;引用由现有 history 入口解析。依据缺失或损坏时不虚构 +替代证据。此字段不资格化执行、科学创新、收益、有效 Turn 计数或验收,后者仍 +独立验证;不增加 scheduler、选择规则、quota 消耗或逐结果结算。 + +#### 可迭代策略与工程边界 + +第一版策略是**模型依据证据调节向量**:为各坐标提出扩大、保持或缩小,附上理由 +和可证伪的下一探针。不优化一个通用 novelty 分数:机制距离相对于明确的参照 +方法和目标,切片大小相对于下一有用 postcondition 与决策风险。 + +| 依据 | 工作切片 | 机制距离 | 证据广度 | +|---|---|---|---| +| 已支持方法持续产生可复现的有用进展 | 决策风险允许时扩大连贯工作 | 保持,除非剩余缺口支持替代方案 | 保留必需检查,避免冗余扫测 | +| 适用证据下当前方法仍有明显目标缺口 | 从小型判别性 pilot 开始 | 比较更大偏离与原路线接续 | 缩到能区分路线的观测 | +| 结果冲突或预期收益小于不确定性 | 决策明确前缩小工作 | 保持或比较替代,不宣布已反驳 | 仅扩大有理由的重复/不确定性探针 | +| 较大偏离产生可归因的有用结果 | 扩大已采用方法的下一切片 | 保留有效偏离,不为新颖而新颖 | 扩大采用所需验证 | +| 决策相关失败或权限边界出现 | 经原 owner 结束/拆分当前切片 | 在原目标内重新审视 | 验证具体失败,不扩大权限 | + +此表指导模型决定,不是文案分类器或固定数字策略。工程设计保留四个可替换边界: + +1. **观测适配器**提供精确候选/结果、有效性/不确定性、覆盖与成本事实;含义归 + 垂域 provider,不能写通用策略或授予执行权。 +2. **策略**消费一份绑定来源的复盘依据,提出步幅向量、下一探针与预期收益/ + 成本;实验记录策略版本。先采用上表,后续确定性启发式或学习策略可在相同 + 输入下替换此函数。第二个真实、已资格化策略需要接缝前,不建 plugin registry + 或训练 controller。 +3. **准入/采用**通过既有 Todo、Vision、replan、预算和权限 owner 验证提案。 + 工作大小变化使用正常 split/continuation/successor;原 Turn 结算未完时, + 路线决定不能执行 successor。 +4. **反馈**将实际执行、结果、保留产物与完整成本返回下次复盘。提案、采用和 + 收益分别可回放;缺失反馈不能变成成功。 + +当前源码切片实现第四个边界的已记录决定输入和可选 TypeScript 策略组件 +`evidence_conditioned_v1`。第一版消费 Agent 判断的证据 basis,确定性计算三个 +坐标的 grow/hold/shrink;versioned `agent_vision.stride_decision` 保存向量、当轮 +义务与观测 context 引用、下一探针及采用/成本条件。Vision authoring 在写入前 +校验声明的结构和向量;启用后的新 Vision 路线复盘必须提交结构化提案,其他 +来源专属出口保留。正常 Todo/Next Action 接续执行,下轮对照真实观测。 +这是结构化提案调控,不是自动执行器或研究效果分类器。共享配置词表为 `off | evidence_conditioned_v1`,未知 +版本在写入前拒绝。通过既有 Goal 复盘能力的编辑器与 CLI 设置完整 Goal 覆盖 +或沿用设备默认;off 保持普通证据身份、选择和原有五条指引,启用时才增加 +决定回读及工作大小、机制距离、验证范围的独立建议。没有 +自动向量执行器。先用既有有界 `path_delta` 与 task Next Action 记录提案,不新建 +策略/状态数据库。显式 versioned attachment 避免从文案解析控制向量。未来策略版本继续验证 +default-off parity 与字段界限,不静默重释旧决定;提案与采用权限保持分离。每版策略经同起点 +消融证明采用和完整成本收益再 promotion;先改一个坐标,再研究交互。六个有效 +工作 Turn 仍是现有复盘默认周期,不是 Todo、实验或机制变化的大小。 + +敏捷探索可只跑启用策略的测试组,以历史基线作描述性参照;不要求每次迭代都 +重启并发基线。这类运行用于观察路线采用与迭代收益,不单独证明因果净收益或 +promotion 资格。需要相应结论时,再执行匹配接续与重复验证。 + +### 7.7 研究状态分支与匹配接续 + +可恢复研究点包含**会话位置、研究证据、代码/候选产物与观测机会**。单独源码 +归档或轨迹前缀不是完整研究点。捕获与验证复用既有[备份/恢复 owner](complete-state-recovery-v0.zh-CN.md)、 +Host 会话 owner 和 artifact provider;本 RFC 定义研究实验的一致性及可比性要求, +不新建 restore 权威。 + +捕获前按已分配研究预算或语义事件声明位置,不事后挑分数有利的点。十小时等 +中后期位置属于实验设置,不是产品默认值或自动转向条件。记录实际边界与 skew: + +- 原生会话 cursor 和已资格化的 Host export/fork 路径;复制日志不证明能恢复 + session; +- 已结算的 LoopX 研究证据、原目标/优先级、既有决定、有范围负结果及未解问题; +- 精确工作源码、必要且获授权的未跟踪文件、incumbent 与其 qualifying result; + 尚未测量的候选与 incumbent 分开保留; +- source/model/tool/evaluator pins 与已消费的 solver-visible feedback; +- 剩余总预算、已受理提交历史及原协议下的下一次反馈机会。 + +inert verification unit 不授予执行权。目标侧使用新的实验/Host 身份,通过既有 +Goal/session/state admission 进入。历史租约、quota、timer、pending effect 和 +submission token 不能变成目标侧权限;未知效果先按原身份 reconcile,再决定 +是否 replay。Host 尚无已资格化 fork 就报告缺口;证据摘要重启是另一种 treatment, +不能称为精确接续。 + +匹配实验前先验证 digest/cursor/artifact 一致性、partial capture、缺失文件、 +输入变化、重复恢复、竞争 writer、来源停止和结果丢失投递。恢复要证明实际采用 +所保存的证据和代码,并完成新工作;tar 验证或打开 session 本身不是验收。 + +研究消融从**同一份**已资格化研究点分成原策略接续与证据驱动范围复盘,使用 +等额接续预算与资源,只改变一个控制因素;通过 evaluator owner 保留反馈机会数 +与冷却时机。Session 重启、摘要替换、版本升级或策略组合属于额外变量。保留 +所有分支及无效/负结果,比较实际采用的原生成绩、新信息与完整接续成本。结果 +只资格化这项有范围干预,不证明整个 LoopX 或一个通用最优 stride。 + ## 8. 测量模型 第一版实现应先测量,再控制。 @@ -613,6 +754,17 @@ Stride qualification 至少应区分: - event-driven authority escalation; - effect 与 delivery contract 保持一致。 +**Stage E:从同一捕获状态比较研究范围** + +- 原策略接续与 §7.6 的证据驱动范围复盘; +- 同一份经 §7.7 资格化的会话/证据/代码研究点与反馈历史; +- 等额接续资源、预算与评测机会; +- 原生目标结果、新信息/采用及完整成本分别测量; +- 先做小规模恢复/采用 pilot,重复 cell 之后才 promotion。 + +选取确有不同机制空间的任务,同时保留接近上界或噪声较大的 case 检查适用界限。 +不能在看到分数后挑 checkpoint 或省略分支。 + 只有这些阶段识别出 interaction 后,factorial experiment 才组合已 promotion 的 profile。 @@ -625,19 +777,14 @@ authority。测试不能仅因输出包含某个关键词就通过。 ## 11. 最小有用实现切片 -第一版实现有意保持窄小、可逆: - -1. 为 effect、delivery、authority stride 增加一套 public architecture vocabulary。 -2. 在可用处从现有 Turn、settlement、Todo、quota 与 gate receipt 派生只读 stride - observation。 -3. 增加 offline evaluator,报告各层 metric 与 mismatch signal。 -4. 用 public-safe fixture 刻画 standard/fine-grained profile,并至少保留一条真实 - model behavior qualification 路径。 -5. 只输出 shadow recommendation,不改变 Todo selection、scheduler frequency、 - effect execution 或 user notification。 +M1 只读观测仍可用。下一完整、可逆切片把既有被接受的决定与后续证据投递到现有 +replan 入口,配合 §7.6 指引;不新增分类器、调度器或验收门。先验证真实 CLI/Host +投影、不可变引用回读、缺失/损坏/陈旧输入及不变的语义 discharge。 -第一版应扩展最近的现有 Turn/status read model,不能新建 built-in capability、 -executor、scheduler 或 generic policy framework。 +随后按 §7.7 资格化一个研究状态捕获/接续 profile,区分归档验证、可执行接续、 +模型采用和科学收益。匹配接续 pilot 判断范围复盘能否产生判别性实验与真实采用 +的改进;重复研究及完整成本证据先于自适应策略 promotion。部分 Host export 或 +只读决定投影都不闭合整项实现计划。 ## 12. Milestone @@ -665,6 +812,9 @@ executor、scheduler 或 generic policy framework。 - 从 typed postcondition/evidence transition 建议 split、keep 或 merge; - 用独立 acceptance rule 验证建议; - Todo 与 replan 仍是唯一 execution authority。 +- 在真实 replan 入口资格化 §7.6 决策接续,观察下一探针是否改变有用信息, + 而非仅改变标识; +- 资格化一个 §7.7 研究状态分支与匹配接续 profile; - 在 shadow 中验证 §7.5 的 provider checkpoint/monitor binding,区分模型 决策、实验完成与 Turn settlement。 @@ -702,6 +852,11 @@ executor、scheduler 或 generic policy framework。 8. shadow mode 不改变 scheduling、quota spend、notification、gate 或 execution; 9. promoted profile 在 repeated run 中改善 end-to-end quality/cost,而不只是局部计数; 10. failure case 保持 honest terminal 且可恢复。 +11. 研究范围变化保留原题目与验收,证据广度由决策价值而非重复检查数解释; +12. 恢复研究点保留会话/证据/代码及等价反馈机会,不复活来源执行权; +13. 既有决定、真实实验、结果解释与采用动作分别可观察;缺失执行/收益保持 unknown; +14. 匹配接续比较保留 incumbent、不确定性、失败及完整 model/tool/control 成本, + 局部代理指标收益不当作原生目标收益。 ## 14. 非目标 diff --git a/docs/architecture/rfcs/loopx-overall-roadmap-v0.md b/docs/architecture/rfcs/loopx-overall-roadmap-v0.md index 365248c256..c47aadc0fe 100644 --- a/docs/architecture/rfcs/loopx-overall-roadmap-v0.md +++ b/docs/architecture/rfcs/loopx-overall-roadmap-v0.md @@ -345,7 +345,7 @@ subsystem was not performed. Section 8 records the focused audit. | [Human-confirmed domain operations (v0)](human-confirmed-domain-operations-v0.md) | S8/S9 + R2/R3 | Accepted; canonical operation seam exists, managed native transport under owner review | Qualify source-context vs admitted-executor separation, exact human approval→one-shot consumption→domain evidence→original-route return; owned Turn/delegation need not await Desktop authentication. Live approval/effect/wakeup remain unqualified; finance provider stays separate | | [Provider-side authorization at effect acceptance (v0)](provider-effect-acceptance-v0.md) | S8/S9, supporting S2/S4 | Accepted design only; no runtime integration or qualified provider | M1: controlled provider and deterministic revoke/crash/replay conformance; strict production wiring remains gated by exact Goal lifetime, receipt retention and independent provider qualification | | [Research Exploration Control Plane v0](research-exploration-control-plane-v0.md) | S11/S3 | Accepted; partial M2 composition/successor; §11.5 result/adoption refinement proposed | P1: one real provider result -> scoped interpretation -> adopted step/successor, exact lineage/shared write gate and packaged readback; qualify shadow before opt-in, retain composition gaps; defer inference and M4 portfolio ranking | -| [Hierarchical Agent Stride Control v0](hierarchical-agent-stride-control-v0.md) | S11/S7 | Accepted; M1 read-only observation; §7.5 checkpoint/monitor binding proposed | P2: matched shadow decision timing with observer/model costs and lost-result recovery; preserve per-Turn settlement, no default cadence change | +| [Hierarchical Agent Stride Control v0](hierarchical-agent-stride-control-v0.md) | S11/S7 | Accepted; M1 observation and source-level replan decision followthrough; adaptive policy/continuation unqualified | P2: §7.6 mechanism/evidence scope review -> actual probe/adoption/full cost; §7.7 same-state continuation and recovery before adaptive promotion. Preserve per-Turn settlement and authority; no forced-hour pivot or default cadence change | | [Goal-scoped Capability Portfolio v0](goal-scoped-capability-portfolio-v0.md) | S1/S3/S6/S8/S11 | Accepted; read-only settings/context inspection slice | P1: correction→fresh-session decision across existing owners, then demand-driven composition and measured method evolution; no universal memory database or second opt-in | | [Post-Outcome Memory Utility Attribution v0](post-outcome-memory-utility-attribution-v0.md) | S6/S11 | Accepted; Stage 1 verified-outcome binding | P1 read-only reducer→P2 pilot: distinguish recalled/applied/utility, no automatic ranking change | | [Obelisk Session Evidence Provider v0](obelisk-session-evidence-provider-v0.md) | S6/S8 | Accepted; optional read-only evaluation | P2: explicit gap recall with resolvable provenance/access, off-path parity; no work authority | diff --git a/docs/architecture/rfcs/loopx-overall-roadmap-v0.zh-CN.md b/docs/architecture/rfcs/loopx-overall-roadmap-v0.zh-CN.md index 7a7ee368fb..b37ba09788 100644 --- a/docs/architecture/rfcs/loopx-overall-roadmap-v0.zh-CN.md +++ b/docs/architecture/rfcs/loopx-overall-roadmap-v0.zh-CN.md @@ -279,7 +279,7 @@ Muse 设计页在浏览器超时,其文章通过网页检索读取。本次调 | [Human-confirmed domain operations (v0)](human-confirmed-domain-operations-v0.zh-CN.md) | S8/S9 + R2/R3 | 已接受;规范操作接缝存在,受管原生传输待 owner review | 验收来源上下文与已准入执行者分离、精确用户批准→单次消费→垂域证据→原路返回;自有 Turn/delegation 不等待 Desktop 认证。真实批准/效果/唤醒仍未资格化;金融 provider 保持独立 | | [Provider 在效果接受点执行授权(v0)](provider-effect-acceptance-v0.zh-CN.md) | S8/S9,S2/S4 支撑 | 已接受设计;尚未接入 runtime,也未准入 provider | M1:controlled provider 与 deterministic revoke/crash/replay conformance;strict production 接线仍需精确 Goal 生命周期、receipt retention 与独立 provider 资格 | | [Research Exploration Control Plane v0](research-exploration-control-plane-v0.zh-CN.md) | S11/S3 | 已接受;M2 composition/successor 局部实现;§11.5 result/adoption 修订为提案 | P1:一条真实 provider result -> 有范围 interpretation -> adopted step/successor,精确 lineage/shared write gate 与 packaged readback;shadow 资格先于 opt-in,保留 composition gap;推断与 M4 portfolio 排序继续 defer | -| [Hierarchical Agent Stride Control v0](hierarchical-agent-stride-control-v0.zh-CN.md) | S11/S7 | 已接受;M1 只读观测;§7.5 checkpoint/monitor binding 为提案 | P2:matched shadow 决策时机、observer/model 成本与 lost-result recovery;保留每 Turn settlement,不改变默认 cadence | +| [Hierarchical Agent Stride Control v0](hierarchical-agent-stride-control-v0.zh-CN.md) | S11/S7 | 已接受;M1 观测及源码层面的 replan 决策接续;自适应策略/恢复接续未资格化 | P2:§7.6 机制/证据范围复盘 -> 真实探针/采用/完整成本;§7.7 同起点接续及恢复验证先于自适应 promotion。保留每 Turn 结算与权限,不按固定小时强制转向、不改变默认 cadence | | [Goal-scoped Capability Portfolio v0](goal-scoped-capability-portfolio-v0.zh-CN.md) | S1/S3/S6/S8/S11 | 已接受;只读配置/上下文检查切片 | P1:复用既有 owner 验收纠正→新会话决策,再做按需组合与可测方法演化;不建万能记忆库或第二个启用开关 | | [Post-Outcome Memory Utility Attribution v0](post-outcome-memory-utility-attribution-v0.zh-CN.md) | S6/S11 | 已接受;Stage 1 verified-outcome 绑定 | P1 只读 reducer→P2 pilot:区分 recalled/applied/utility,归因不自动改 ranking | | [Obelisk Session Evidence Provider v0](obelisk-session-evidence-provider-v0.zh-CN.md) | S6/S8 | 已接受;可选只读评估 | P2:显式 gap recall、来源与权限可解析、关闭不影响主流程;不当 work authority | diff --git a/docs/architecture/rfcs/research-exploration-control-plane-v0.md b/docs/architecture/rfcs/research-exploration-control-plane-v0.md index 843a615439..a2ff789e96 100644 --- a/docs/architecture/rfcs/research-exploration-control-plane-v0.md +++ b/docs/architecture/rfcs/research-exploration-control-plane-v0.md @@ -715,6 +715,41 @@ valid same-family probes and default-off parity. Then independently qualify model adoption and scientific utility under matched total budgets. Lower control cost must not come from hiding useful negative evidence. +### 11.6 Research scope review at the shared replan boundary + +The [stride control loop](hierarchical-agent-stride-control-v0.md#76-research-scope-and-evidence-conditioned-control) +complements result adoption. It asks whether the next experiment should change +the mechanism, the validation coverage, or the uncertainty being resolved. +More correct tests and more named hypotheses cannot establish broader research. +Native/provider outcomes, noise and headroom remain domain evidence, not kernel +classifications. In-scope method changes do not require a new user gate; task, +acceptance, permission, feedback and budget changes retain their existing owners. + +The bounded source prerequisite reuses accepted `goal_path_delta_v0` decisions +and subsequent typed progress in `replan_context.decision_followthrough`, delivered +at the existing review entry. It adds no mandatory Explore attachment or capture, +works independently of Explore activation, and cannot satisfy or discharge any +extra obligation. Progress is recorded evidence, never an execution/adoption or +scientific novelty verdict. §11.5's opt-in result-adoption gate and composition +lineage are still separate, unqualified work. + +The Agent should preserve the qualified incumbent, identify the unexplained +goal gap and compare a discriminating alternative with continuation or justified +replication. Bind the chosen probe's prediction, adoption criterion and cost to +normal task/Vision continuation, then examine actual candidate execution and +result at the next review. A changed input can reopen a scoped negative finding; +unchanged conditions need a reason to repeat. No elapsed-hour or losing-score +rule forces a pivot or retires a family. + +Qualify this intervention through the [same-state continuation study](hierarchical-agent-stride-control-v0.md#77-research-state-branching-and-matched-continuation), +retaining conversation, negative evidence, code/incumbent and feedback +opportunities. Measure whether the next probe resolves an uncertainty and its +result enters an adopted artifact, then compare native outcomes and full cost. +Session opening, path writeback and context delivery are prerequisite facts, +not research effectiveness. Keep automatic ranking/enforcement default-off +until the scoped profile qualifies; neither this input slice nor a blog claim +closes M3/M4. + ## 12. Write-Time Enforcement The write gate must reuse the same current goal-frontier and Explore gap diff --git a/docs/architecture/rfcs/research-exploration-control-plane-v0.zh-CN.md b/docs/architecture/rfcs/research-exploration-control-plane-v0.zh-CN.md index d64273c1b7..787911621d 100644 --- a/docs/architecture/rfcs/research-exploration-control-plane-v0.zh-CN.md +++ b/docs/architecture/rfcs/research-exploration-control-plane-v0.zh-CN.md @@ -650,6 +650,33 @@ input 改变后重开 scope、合法同 family probe 与 default-off parity。 matched 总预算下独立验证模型 adoption 和科学效用;降低控制成本不能靠隐藏 有效负证据。 +### 11.6 共享 replan 边界的研究范围复盘 + +[步幅控制闭环](hierarchical-agent-stride-control-v0.zh-CN.md#76-研究范围与证据驱动控制) +补充结果采用:下一实验应改变机制、验证覆盖,还是需要解决的不确定性?更多 +正确测试和更多命名假设不证明研究更广。原生/provider outcome、噪声与收益空间 +仍是领域证据,不成为 kernel 分类。在原目标内改变方法不要求新的 user gate; +题目、验收、权限、反馈与预算变更仍由既有 owner 决定。 + +有界源码前置切片复用已接受的 `goal_path_delta_v0` 与后续 typed progress,在既有 +复盘入口投递 `replan_context.decision_followthrough`。不增加强制 Explore 附件或 +capture,独立于 Explore 是否启用,也不能满足或解除额外义务。Progress 是记录 +证据,不是执行/采用或科学创新的裁决。§11.5 的 opt-in 结果采用门禁与 composition +lineage 仍是独立、未资格化的工作。 + +Agent 应保留已资格化 incumbent、指出未解释的目标缺口,并比较判别性替代、 +原路线接续与有理由的重复测量。所选探针的预测、采用条件及成本绑定正常 task/ +Vision continuation,下次复盘检查实际候选执行与结果。输入变化可重新打开有范围 +负 finding;不变条件下重复要说明理由。没有按已过小时数或退步分数强制转向、 +退休 family 的规则。 + +通过[同起点接续实验](hierarchical-agent-stride-control-v0.zh-CN.md#77-研究状态分支与匹配接续) +资格化干预,保留会话、负证据、代码/incumbent 与反馈机会。观察下一探针是否 +解决不确定性、结果是否进入实际采用的产物,再比较原生目标结果和完整成本。 +打开 session、path 写回与 context 送达都是前置事实,不证明研究效果。自动排序/ +enforcement 在特定 profile 验证前保持 default-off;此输入切片或 blog 声明都不 +闭合 M3/M4。 + ## 12. 写时强制 Write gate 必须复用 quota 所用的同一 current goal-frontier 与 Explore gap diff --git a/docs/quota-allocation.md b/docs/quota-allocation.md index a4713d1739..9581f438e6 100644 --- a/docs/quota-allocation.md +++ b/docs/quota-allocation.md @@ -122,10 +122,14 @@ loopx configure-goal --goal-id example loopx configure-goal --goal-id example --clear-execution-replan-after-turns --execute ``` -The Dashboard exposes **Goal review cadence** in the Capability Center for +The Dashboard exposes **Goal review and stride** in the Capability Center for both the device and selected Goal. The existing machine namespace -`todo_replan_cadence_machine_defaults_v1` stores `count_unit` (`effective_turns` -or `completed_todos`) and `count`. It is built into the control plane and needs +`todo_replan_cadence_machine_defaults_v2` stores `count_unit` (`effective_turns` +or `completed_todos`), `count` and optional strategy selection. Existing v0/v1 +configurations remain readable without migrating them on inspection. The +strategy defaults off; `evidence_conditioned_v1` adds evidence-conditioned scope +and route advice, with unchanged admission and semantic exits. See the +[versioned strategy configuration and rollback](reference/protocols/goal-vision-replan-contract-v0.md#configure-and-roll-back-the-stride-strategy). It is built into the control plane and needs no provider installation. The CLI, settings readback, quota decision and writeback validation use the same effective configuration. diff --git a/docs/reference/protocols/assets/stride-strategy-editor.png b/docs/reference/protocols/assets/stride-strategy-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..50c570f7872808d90bc720656a51c3f94ee3ad1f GIT binary patch literal 110302 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%0D3=rF;D3YXDlU2p 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%0A!aM^I3HqXfwiWQ9^Z=bK5n1z+Z@oD_!d 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 AWdHyG literal 0 HcmV?d00001 diff --git a/docs/reference/protocols/goal-vision-replan-contract-v0.md b/docs/reference/protocols/goal-vision-replan-contract-v0.md index ecbc596a1c..8740b44a40 100644 --- a/docs/reference/protocols/goal-vision-replan-contract-v0.md +++ b/docs/reference/protocols/goal-vision-replan-contract-v0.md @@ -264,10 +264,39 @@ the same `agent_id` as the refresh run. This keeps `research-executor`, `evaluator-promoter`, and other roles from overwriting or satisfying each other's active vision. +### Decision followthrough in replan context + +With `evidence_conditioned_v1` enabled, when the captured history contains a prior +accepted evidence-linked Vision path, +`replan_context.decision_followthrough` returns that path with the later recorded +progress references. It uses the existing Goal/Agent/Turn binding and immutable +history append order; timestamps do not decide causality. An explicit current +Goal instance excludes retired-instance sources. The normal history read resolves +its evidence references; private transport facts are not returned. The derived +`replan-decision-*` reference binds the normalized path and its original +`replan-evidence-*` history reference. Changed paths cannot resolve an old +decision reference; existing history reference identities are unchanged. + +Details are bounded to six distinct progress fingerprints with the full recorded +count, omitted count, source completeness and missing-order count. These are +recorded observations, not settled-effective-Turn counts or independent trials. +`execution_and_goal_gain=unknown` stays explicit: a changed progress identifier, +accepted replan or serialized observation proves neither a new mechanism nor its +execution, candidate adoption, scientific improvement or Goal completion. A +missing, rejected or malformed basis adds no followthrough projection. No +selection, trigger, quota, acceptance, lease or scheduler rule changes. + +启用 `evidence_conditioned_v1` 且历史中已有被接受、绑定证据的 Vision 路线时,replan context 返回上次决定与之后的 +进度引用,按原历史追加顺序关联,而非根据时间戳或文案猜测因果。显式当前 Goal +实例排除已退休实例。详情最多六项,保留总数、遗漏数、源完整性与顺序缺失数; +正常 history 入口可读取引用,私有 transport facts 不公开。这些是记录中的观测, +不等于有效结算 Turn、独立试验或执行/收益证明;后者明确保持 unknown。缺失、 +拒绝或损坏的依据不产生投影;选择、触发、结算及权限规则不变。 + ### Replan planning guidance -The shared `replan_action_packet.planning_guidance` carries five Agent -instructions through full/compact quota and the host Turn envelope: +The shared `replan_action_packet.planning_guidance` carries five existing Agent +instructions and an optional sixth stride instruction through full/compact quota and the host Turn envelope: - Preserve the requested end state under current user direction. A bounded slice retains outstanding requirements; easier tests cannot redefine @@ -294,15 +323,24 @@ instructions through full/compact quota and the host Turn envelope: Prefer a discriminating probe, keep negative evidence scoped to tested conditions and proxies scoped to their coverage, and reuse still-applicable evidence when no new uncertainty warrants repetition. - -This guidance is included by default whenever a replan action packet is -projected. It is Agent judgment guidance, not a new machine-enforced acceptance -gate or a permission grant. Typed semantic outcomes, lifecycle transitions and -non-replan turns are unchanged. The existing TypeScript replan owner supplies -the text; CLI and host projections preserve it without a new setting or editor. -Transport tests prove delivery and unchanged gates, not improved model behavior. - -共享 replan action packet 默认携带五条指引,并在完整/精简 quota 与 +- **Only with `evidence_conditioned_v1`:** Review the previous path decision against subsequent work and authoritative + outcomes. When local tuning or repeated validation leaves the goal gap + unexplained, compare a bounded alternative mechanism with continuation or + replication. Elapsed time and one noisy result do not force a pivot. Protect + the best qualified artifact; name the next probe's distinguishing prediction, + adoption criterion and bounded cost, then check actual execution and outcome + at the next review. Research scope changes use existing paths or successors. + +The first five instructions remain the ordinary replan contract. The optional +TypeScript strategy component adds the sixth and the followthrough read model; +`off` (the default, including legacy configurations) preserves ordinary context +identity, evidence selection and guidance. Unknown versions fail before mutation. +This is Agent judgment advice, not a new machine-enforced acceptance gate, +permission, adaptive scheduler or automatic route actuator. Typed semantic +outcomes and non-replan Turns are unchanged. Tests prove delivery and isolation; +model adoption and utility require matched experiments. + +共享 replan action packet 保留五条默认指引,可选策略增加第六条,并在完整/精简 quota 与 Turn envelope 中保留: - 不能为了容易通过测试而缩小目标;阶段成果保留剩余要求,遵守用户范围、 @@ -319,10 +357,118 @@ Turn envelope 中保留: 确认改动进入实际执行路径和当前产物。优先选择能区分剩余解释的探针;负证据 只覆盖已测条件,局部代理指标只覆盖其代表的范围。没有新不确定性时复用 仍然适用的证据。 +- **仅启用 `evidence_conditioned_v1` 时:** 将上次路线决定与后续工作、权威结果对照。若局部调参或重复验证仍无法解释目标 + 缺口,比较有界的新机制、原路线接续与重复测量;不因固定时长或一次噪声结果 + 强制转向。保留最佳已验证产物,为下一探针说明判别性预测、采用条件与有界成本, + 下次复查真实执行和结果;实验范围通过现有 path/successor 改变,不改变权限或验收。 + +默认 `off` 及旧配置保持普通 context 身份、证据选择和前五条指引;启用策略时 +增加第六条与上次决定回读。未知版本在写入前拒绝。它提供 Agent 判断建议, +不新增机器验收门禁、执行权限、自动调度或路线执行器;送达和隔离测试不能 +证明模型采用及收益。 + +### Configure and roll back the stride strategy + +Use the existing **Goal review and stride** capability editor, selecting device +defaults or an explicit Goal target. Choose the review unit/count and strategy, +preview once, confirm and read back the effective configuration/source. The +whole Goal review override wins over the device review configuration; clearing +it restores current device defaults. A legacy override without a strategy means +`off`, even when the device strategy is enabled. No separate capability switch +or per-field inheritance is added. + +![Versioned stride strategy in the existing capability editor](assets/stride-strategy-editor.png) + +Isolated packaged editor with the real revision-checked configuration handler; +workspace discovery is synthetic. This demonstrates configuration readback, not +installed-App adoption or research utility. + +CLI preview/apply and readback (replace `GOAL`): + +```sh +loopx configure-goal --goal-id GOAL --execution-replan-after-turns 6 --execution-stride-strategy evidence_conditioned_v1 +loopx configure-goal --goal-id GOAL --execution-replan-after-turns 6 --execution-stride-strategy evidence_conditioned_v1 --execute +loopx --format json configure-goal --goal-id GOAL +loopx configure-goal --goal-id GOAL --execution-stride-strategy off --execute +``` -这是 Agent 判断指引,不新增机器验收门禁、配置或权限,不改变已有语义写回 -规则及非重规划 Turn。文本复用既有 TypeScript owner;投影测试证明送达和 -门禁保持,不能证明模型采用或效果提升。 +Turning the strategy off retains the review interval and ordinary review. To +restore device defaults for the entire review configuration, clear the cadence +and strategy through the editor or `--clear-execution-replan-after-turns +--clear-execution-replan-after-todos --clear-execution-stride-strategy --execute`. +Historical evidence remains readable after disabling. Activation cannot authorize +experiments, spend quota, clone a checkpoint, relax acceptance or rewrite a +frozen experiment. Configuration is versioned; preregister the selected version +and captured input scope for comparisons. + +在既有「Goal 复盘与步幅」能力中心中选择设备默认值或明确的 Goal,设置计数依据、 +周期和策略,预览、确认并回读生效来源。Goal 整体覆盖设备配置;旧 Goal 覆盖中 +没有策略则为 off。关闭策略保留复盘周期;清除整个覆盖恢复设备默认值。 +历史引用仍可读取。启用不会授权实验、消耗配额、复制 checkpoint、放宽验收或 +改写冻结实验;比较时预先记录策略版本与输入覆盖范围。 + +### Structured stride control + +The opt-in component exposes `replan_action_packet.stride_control` through full, +compact CLI and host envelopes. `evidence_conditioned_v1` consumes an explicitly +**Agent-assessed** evidence basis and derives three coordinates in TypeScript: + +| Evidence basis | Work slice | Route distance | Validation scope | +|---|---|---|---| +| `supported_progress` | grow | hold | hold | +| `unexplained_gap` | shrink | grow | shrink | +| `uncertain_evidence` | shrink | hold | grow | +| `useful_new_route` | grow | hold | grow | +| `decision_failure` | shrink | hold | shrink | + +These are relative adjustments to the declared current method and next useful +postcondition, not a universal novelty score, runtime budget or certified +research verdict. Reducing validation scope cannot remove required acceptance +checks. The model assesses the basis from applicable evidence; the strategy +owns the vector. For example, an unexplained method gap calls for a small probe +of a larger route departure, while conflicting evidence calls for more targeted +validation without automatically changing route. + +Declare a top-level `agent_vision.stride_decision` attachment with +`schema_version=stride_decision_v1`, the selected `strategy_version`, +`reference_context_id`, `reference_obligation_id`, `basis` and `next_probe` +(`scope`, `prediction`, `adoption_criterion`, `cost_bound`). Copy the actual +reference ids from the live control packet. `axes` may be omitted; the strategy +fills them. A supplied vector must match the version/basis. Unknown fields, +versions, mismatched vectors, missing probe commitments, private text and +oversized text are rejected during Vision authoring, before writeback. Attachment +text counts toward the existing 1,800-character Vision budget. + +Declared proposals are structurally validated. Under enabled review the fresh Vision path exit requires this structured +proposal; other source-specific successor, progress and terminal exits remain +available. Missing proposals or a proposal referencing a different obligation +cannot satisfy the fresh Vision path exit. The binding uses the admitted obligation, not the latest +context hash: legitimate shared-pool changes must not invalidate the original +Turn's settlement. The context id records the observed basis; it does not prove +that the Agent's assessment or predicted gain is correct. + +A valid schema/vector alone cannot discharge a review, execute a Todo, spend +quota or certify usefulness. The evidence-linked Path Delta and ordinary Todo/ +Next Action carry the proposal into authorized work. History and compact Vision +readback retain the normalized decision; the next review returns it with later +observations. Actual adoption, execution, gains and costs still need their +own evidence. Off/legacy inputs with no declared attachment preserve ordinary +projection and settlement. Explicit attachments are validated data even when +ordinary review is selected; they do not enable automatic strategy projection. + +可选策略通过完整/精简 CLI 和 Host packet 提供结构化控制契约。Agent 根据证据 +判断 basis,TypeScript 策略计算工作大小、路线距离、验证范围的 grow/hold/shrink。 +例如目标缺口仍无法解释时,采用“小实验+较大路线变化”;证据冲突时,“小实验+ +路线保持+扩大针对性验证”。它不依据运行时长或分数文案自动分类。 + +结构化提案绑定当轮义务及观察到的 context,说明下一探针的范围、预测、采用条件 +与成本边界。启用后的新 Vision 路线复盘必须带结构化提案;其他 typed progress、successor +和 terminal 出口保留。机器校验版本、向量、字段界限和来源绑定,沿用既有 Vision +文本预算; +只提交一个向量不能完成重规划。正常 Todo/Next Action 负责接续,下轮回读决定与 +真实观测。缩小验证范围不撤销硬验收;格式有效不证明实际采用或收益。关闭模式 +不自动投影策略;显式声明的附件仍须通过数据校验。策略建议与机器校验分别命名, +执行权限及结算归属不扩大。 ### Path Delta From e6eebd9e7d23b9c92719c0dc80840ac4ea17b56e Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 12 Oct 2026 14:24:16 +0800 Subject: [PATCH 3/7] test(stride): qualify proposal control, feedback and configuration rollback Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../assets/stride-strategy-editor.png | Bin 110302 -> 110144 bytes .../replan-cadence.mjs | 47 +++++-- ...est_machine_configuration_goal_defaults.py | 60 ++++++++ .../test_long_chain_projected_closeout.py | 66 +++++++++ tests/control_plane_ts/replan_context.test.ts | 128 ++++++++++++++++++ .../control_plane_ts/replan_semantics.test.ts | 21 +++ tests/control_plane_ts/stride_policy.test.ts | 68 ++++++++++ tests/test_chat_machine_configuration_api.py | 3 +- 8 files changed, 381 insertions(+), 12 deletions(-) create mode 100644 tests/control_plane_ts/stride_policy.test.ts diff --git a/docs/reference/protocols/assets/stride-strategy-editor.png b/docs/reference/protocols/assets/stride-strategy-editor.png index 50c570f7872808d90bc720656a51c3f94ee3ad1f..4b9c7c3d9b53aa50c88feddb35837989416862c5 100644 GIT binary patch literal 110144 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%0DU>z;}e=hUd- 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 z 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%0D3=rF;D3YXDlU2p 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%0A!aM^I3HqXfwiWQ9^Z=bK5n1z+Z@oD_!d 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 AWdHyG diff --git a/examples/personal-workspace-browser/replan-cadence.mjs b/examples/personal-workspace-browser/replan-cadence.mjs index e7a16198be..717fc60320 100644 --- a/examples/personal-workspace-browser/replan-cadence.mjs +++ b/examples/personal-workspace-browser/replan-cadence.mjs @@ -34,15 +34,25 @@ export const replanCadenceScenario = { }, }); const { page } = context; + async function applyGoalPreview(name = "应用此预览") { + const response = page.waitForResponse((value) => + value.url().includes("/api/chat/goal-configuration/apply") && value.request().method() === "POST"); + await page.getByRole("button", { name, exact: true }).click(); + const settled = await response; + if (!settled.ok()) throw new Error(await settled.text()); + } + async function openMachineCadence() { await page.getByRole("button", { name: "设置", exact: true }).click(); await page.locator(".personal-settings-tabs").getByRole("button", { name: "能力中心", exact: true }).click(); - await page.getByRole("navigation", { name: "机器能力目录" }).getByRole("button", { name: /Goal 复核周期/ }).click(); + await page.getByRole("navigation", { name: "机器能力目录" }).getByRole("button", { name: /Goal 复盘与步幅/ }).click(); } await openMachineCadence(); const unit = page.getByLabel(/^复核计数依据/); const count = page.getByLabel("两次复核间的数量", { exact: true }); + const strategy = page.getByLabel(/^步幅策略/); await waitForInputValue(count, "6"); + if (await strategy.inputValue() !== "off") throw new Error("Stride must default off"); if (await unit.inputValue() !== "effective_turns") throw new Error("Product default is not settled work Turns"); await page.screenshot({ path: resolve(outputDir, "replan-cadence-product-default.png"), animations: "disabled" }); const preview = await request(base + "/preview", legacy); @@ -60,34 +70,48 @@ export const replanCadenceScenario = { stored = (await request(base)).machine_configuration.namespaces.todo_replan_cadence; if (stored.completed_todos !== 2) throw new Error("Invalid preview mutated state"); await count.fill("3"); + await strategy.selectOption("evidence_conditioned_v1"); await page.getByRole("button", { name: "预览变更", exact: true }).click(); await page.getByRole("button", { name: "应用已审阅预览", exact: true }).click(); await page.getByRole("button", { name: "预览回滚", exact: true }).waitFor(); stored = (await request(base)).machine_configuration.namespaces.todo_replan_cadence; if (stored.count_unit !== "effective_turns" || stored.count !== 3 || "completed_todos" in stored) throw new Error("Migration did not persist the selected unit"); + if (stored.stride_strategy !== "evidence_conditioned_v1" || stored.schema_version !== "todo_replan_cadence_machine_defaults_v2") throw new Error("Machine stride version not recorded"); await page.screenshot({ path: resolve(outputDir, "replan-cadence-machine.png"), animations: "disabled" }); await page.getByRole("radio", { name: "单个 Goal", exact: true }).check(); await page.getByRole("combobox", { name: "目标 Goal", exact: true }).selectOption("multi-agent-projection"); - await page.getByRole("navigation", { name: "Goal 能力目录" }).getByRole("button", { name: /Goal 复核周期/ }).click(); + await page.getByRole("navigation", { name: "Goal 能力目录" }).getByRole("button", { name: /Goal 复盘与步幅/ }).click(); await waitForInputValue(count, "3"); if (await unit.inputValue() !== "effective_turns" || await count.inputValue() !== "3") throw new Error("Goal did not inherit effective-Turn device policy"); async function readGoalCadence() { const packet = await request("/api/chat/goal-configuration?goal_id=multi-agent-projection"); return packet.capability_catalog.capabilities.find((row) => row.capability_id === "todo_replan_cadence"); } + if (await strategy.inputValue() !== "evidence_conditioned_v1") throw new Error("Goal did not inherit strategy version"); await count.fill("2"); + await strategy.selectOption("off"); await page.getByRole("button", { name: "预览变更", exact: true }).click(); - await page.getByRole("button", { name: "应用此预览", exact: true }).click(); + await applyGoalPreview(); await page.getByRole("button", { name: "恢复沿用设备默认", exact: true }).waitFor(); let goalCadence = await readGoalCadence(); if (goalCadence.effective_configuration.source !== "goal_override" || goalCadence.current.count !== 2) throw new Error("Goal override readback failed"); + if (goalCadence.current.stride_strategy !== "off") throw new Error("Goal stride opt-out failed"); + if ((await request(base)).machine_configuration.namespaces.todo_replan_cadence.stride_strategy !== "evidence_conditioned_v1") throw new Error("Goal override changed machine strategy"); + await strategy.selectOption("evidence_conditioned_v1"); + await page.getByRole("button", { name: "预览变更", exact: true }).click(); + await applyGoalPreview(); + await page.getByRole("button", { name: "恢复沿用设备默认", exact: true }).waitFor(); + if ((await readGoalCadence()).current.stride_strategy !== "evidence_conditioned_v1") throw new Error("Goal strategy activation failed"); await page.getByRole("button", { name: "恢复沿用设备默认", exact: true }).click(); - await page.getByRole("button", { name: "应用此预览", exact: true }).click(); + await applyGoalPreview(); await page.getByRole("button", { name: "恢复沿用设备默认", exact: true }).waitFor({ state: "detached" }); goalCadence = await readGoalCadence(); if (goalCadence.effective_configuration.source !== "machine_default" || goalCadence.effective_configuration.configuration.count !== 3) throw new Error("Goal clear did not restore device policy"); await page.setViewportSize({ width: 390, height: 844 }); await unit.focus(); + await page.keyboard.press("Tab"); + await page.keyboard.press("Tab"); + if (!(await strategy.evaluate((element) => element === document.activeElement))) throw new Error("Strategy is not keyboard reachable"); await page.screenshot({ path: resolve(outputDir, "replan-cadence-goal-mobile.png"), animations: "disabled" }); if (await page.evaluate(() => document.documentElement.scrollWidth > innerWidth + 1)) throw new Error("Cadence editor overflowed"); await page.setViewportSize({ width: 1512, height: 982 }); @@ -97,19 +121,20 @@ export const replanCadenceScenario = { await page.locator(".personal-settings-tabs").getByRole("button", { name: "Capability Center", exact: true }).click(); await page.getByRole("radio", { name: "One Goal", exact: true }).check(); await page.getByRole("combobox", { name: "Target Goal", exact: true }).selectOption("multi-agent-projection"); - await page.getByRole("navigation", { name: "Goal capability catalog" }).getByRole("button", { name: /Goal review cadence/ }).click(); + await page.getByRole("navigation", { name: "Goal capability catalog" }).getByRole("button", { name: /Goal review and stride/ }).click(); const englishUnit = page.getByLabel(/^Review after/); const englishCount = page.getByLabel("Number between reviews", { exact: true }); + const englishStrategy = page.getByLabel(/^Stride strategy/); await waitForInputValue(englishCount, "3"); - if (await englishUnit.inputValue() !== "effective_turns") throw new Error("English editor lost the persisted unit"); + if (await englishUnit.inputValue() !== "effective_turns" || await englishStrategy.inputValue() !== "evidence_conditioned_v1") throw new Error("English editor lost the unit or strategy"); await englishCount.fill("1"); await page.getByRole("button", { name: "Preview changes", exact: true }).click(); - await page.getByRole("button", { name: "Apply preview", exact: true }).click(); + await applyGoalPreview("Apply preview"); await page.getByRole("button", { name: "Use device defaults", exact: true }).waitFor(); if ((await readGoalCadence()).current.count !== 1) throw new Error("English override was not applied"); await page.screenshot({ path: resolve(outputDir, "replan-cadence-goal-english.png"), animations: "disabled" }); await page.getByRole("button", { name: "Use device defaults", exact: true }).click(); - await page.getByRole("button", { name: "Apply preview", exact: true }).click(); + await applyGoalPreview("Apply preview"); await page.getByRole("button", { name: "Use device defaults", exact: true }).waitFor({ state: "detached" }); if ((await readGoalCadence()).effective_configuration.configuration.count !== 3) throw new Error("English clear did not restore device policy"); const remove = { namespace: "todo_replan_cadence", operation: "remove" }; @@ -122,10 +147,10 @@ export const replanCadenceScenario = { await page.locator(".personal-settings-tabs").getByRole("button", { name: "Capability Center", exact: true }).click(); await page.getByRole("radio", { name: "One Goal", exact: true }).check(); await page.getByRole("combobox", { name: "Target Goal", exact: true }).selectOption("multi-agent-projection"); - await page.getByRole("navigation", { name: "Goal capability catalog" }).getByRole("button", { name: /Goal review cadence/ }).click(); + await page.getByRole("navigation", { name: "Goal capability catalog" }).getByRole("button", { name: /Goal review and stride/ }).click(); await waitForInputValue(englishCount, "6"); - if (await englishUnit.inputValue() !== "effective_turns") throw new Error("Goal editor did not restore product unit"); - return { coverageEntries: context.coverageEntries, note: "Packaged default six effective Turns, machine v0→v1 migration, invalid preview, Goal override/clear and device removal through real handlers." }; + if (await englishUnit.inputValue() !== "effective_turns" || await englishStrategy.inputValue() !== "off") throw new Error("Goal editor did not restore product defaults"); + return { coverageEntries: context.coverageEntries, note: "Packaged default six effective Turns, machine v0→v2 migration and default-off/versioned stride activation/Goal opt-out, invalid preview, Goal override/clear and device removal through real handlers." }; } catch (error) { if (context) { await context.page.screenshot({ path: resolve(outputDir, "replan-cadence-failure.png"), animations: "disabled" }); diff --git a/tests/capabilities/test_machine_configuration_goal_defaults.py b/tests/capabilities/test_machine_configuration_goal_defaults.py index 95a8307eae..6dfe7b3fdd 100644 --- a/tests/capabilities/test_machine_configuration_goal_defaults.py +++ b/tests/capabilities/test_machine_configuration_goal_defaults.py @@ -329,3 +329,63 @@ def test_product_default_and_namespace_removal_use_six_settled_turns(tmp_path, m configure_goal(registry_path=registry_path, goal_id=GOAL_ID, clear_execution_replan_after_todos=True, execute=True) assert _history_goal(registry_path, runtime_root)["execution_profile"]["replan_after_effective_turns"] == 6 + + +def test_stride_version_inherits_as_one_review_configuration_and_rolls_back(tmp_path: Path) -> None: + from loopx.chat_goal_configuration_api import _goal_capability_options + from loopx.capabilities.goal_inspection import inspect_goal_capabilities + + _repo, registry_path, runtime_root = _fixture(tmp_path) + owner = build_builtin_machine_configuration_registry() + configuration = _machine_configuration() + configuration["namespaces"]["todo_replan_cadence"] = { + "schema_version": "todo_replan_cadence_machine_defaults_v2", + "count_unit": "effective_turns", "count": 6, + "stride_strategy": "evidence_conditioned_v1", + } + before = registry_path.read_bytes() + preview = configure_machine_configuration(runtime_root=runtime_root, + registry=owner, configuration=configuration) + assert registry_path.read_bytes() == before + configure_machine_configuration(runtime_root=runtime_root, registry=owner, + configuration=configuration, execute=True, expected_plan_revision=preview["plan_revision"]) + assert _history_goal(registry_path, runtime_root)["execution_profile"]["stride_strategy"] == "evidence_conditioned_v1" + # A legacy Goal override pins the whole review configuration, including off. + configure_goal(registry_path=registry_path, goal_id=GOAL_ID, + execution_replan_after_turns=3, execute=True) + assert "stride_strategy" not in _history_goal(registry_path, runtime_root)["execution_profile"] + enabled = _goal_capability_options("todo_replan_cadence", { + "count_unit": "effective_turns", "count": 3, "stride_strategy": "evidence_conditioned_v1"}) + configure_goal(registry_path=registry_path, goal_id=GOAL_ID, execute=True, **enabled) + inspected = inspect_goal_capabilities(registry_path=registry_path, runtime_root=runtime_root, + goal_id=GOAL_ID)["configuration"] + review = next(item for item in inspected["capability_catalog"]["capabilities"] + if item["capability_id"] == "todo_replan_cadence") + assert review["current"] == {"count_unit": "effective_turns", "count": 3, "stride_strategy": "evidence_conditioned_v1"} + assert review["effective_configuration"]["source"] == "goal_override" + configure_goal(registry_path=registry_path, goal_id=GOAL_ID, + execution_stride_strategy="off", execute=True) + assert _history_goal(registry_path, runtime_root)["execution_profile"]["stride_strategy"] == "off" + configure_goal(registry_path=registry_path, goal_id=GOAL_ID, + clear_execution_replan_after_turns=True, execute=True) + assert "stride_strategy" not in json.loads(registry_path.read_text())["goals"][0]["execution_profile"] + assert _history_goal(registry_path, runtime_root)["execution_profile"]["stride_strategy"] == "evidence_conditioned_v1" + # Unsupported versions fail before any registry mutation. + before = registry_path.read_bytes() + with pytest.raises(ValueError, match="stride_strategy"): + configure_goal(registry_path=registry_path, goal_id=GOAL_ID, + execution_replan_after_turns=3, execution_stride_strategy="future_v2", execute=True) + assert registry_path.read_bytes() == before + + +@pytest.mark.parametrize("schema_version, strategy", [ + ("todo_replan_cadence_machine_defaults_v1", "evidence_conditioned_v1"), + ("todo_replan_cadence_machine_defaults_v2", "future_v2"), + ("todo_replan_cadence_machine_defaults_v2", None), +]) +def test_stride_configuration_rejects_unsupported_or_ambiguous_versions(schema_version, strategy): + with pytest.raises(ValueError): + normalize_todo_replan_cadence_machine_defaults({ + "schema_version": schema_version, "count_unit": "effective_turns", + "count": 6, "stride_strategy": strategy, + }) diff --git a/tests/control_plane/test_long_chain_projected_closeout.py b/tests/control_plane/test_long_chain_projected_closeout.py index 51295bef74..525f56ca2c 100644 --- a/tests/control_plane/test_long_chain_projected_closeout.py +++ b/tests/control_plane/test_long_chain_projected_closeout.py @@ -91,6 +91,10 @@ def guard(turn): "--agent-id", AGENT_ID, "--turn-instance-id", turn, "--scan-path", str(project)) + call("configure-goal", "--goal-id", GOAL_ID, + "--execution-replan-after-turns", "6", + "--execution-stride-strategy", "evidence_conditioned_v1", "--execute") + shared = call("quota", "should-run", "--runtime-profile", "generic_cli", "--goal-id", GOAL_ID, "--agent-id", AGENT_ID) assert shared["goal_frontier_projection"]["replan_required"] is False @@ -114,6 +118,11 @@ def guard(turn): "kind": "autonomous_replan", "id": original["obligation_id"], "settlement_bound": False, "discharge": "todo_bound_writeback", } + control = before["replan_action_packet"]["stride_control"] + from loopx.control_plane.quota.turn_envelope import build_turn_envelope + from loopx.control_plane.quota.cli_projection import compact_quota_should_run_cli_payload + for transport in (build_turn_envelope(before), compact_quota_should_run_cli_payload(before)): + assert transport["replan_action_packet"]["stride_control"] == control refresh, spend = actions assert "--agent-vision-json" in refresh assert "--replan-obligation-id" not in refresh @@ -133,6 +142,19 @@ def guard(turn): "acceptance_summary": "Each slice has independent validation before dependent work proceeds.", "advancement_policy": "as_needed", }, + "stride_decision": { + "schema_version": "stride_decision_v1", + "strategy_version": "evidence_conditioned_v1", + "reference_context_id": before["replan_action_packet"]["stride_control"]["reference_context_id"], + "reference_obligation_id": before["replan_action_packet"]["stride_control"]["reference_obligation_id"], + "basis": "unexplained_gap", + "next_probe": { + "scope": "Execute one alternative mechanism probe.", + "prediction": "The alternative distinguishes the remaining explanation.", + "adoption_criterion": "Retain only a validated improvement on accepted requirements.", + "cost_bound": "One isolated probe before another scope decision.", + }, + }, "path_delta": { "schema_version": "goal_path_delta_v0", "outcome": "replan", "prior_assumption": "The long chain needed a bounded review.", @@ -143,6 +165,16 @@ def guard(turn): }, })) refresh = refresh.replace("", str(decision)) + # Opt-in control is a real validation rule, not only extra prompt text. + valid_packet = json.loads(decision.read_text()) + legacy_packet = {key: value for key, value in valid_packet.items() if key != "stride_decision"} + decision.write_text(json.dumps(legacy_packet)) + rc, refused = _run_cli(registry, runtime, + *_projected_cli_args(refresh, turn_instance_id=TURN_ID), cwd=project) + assert rc == 1 + assert "requires agent_vision.stride_decision" in refused["error"] + assert _spend_run_count(runtime) == 0 + decision.write_text(json.dumps(valid_packet)) refreshed = call(*_projected_cli_args(refresh, turn_instance_id=TURN_ID)) assert refreshed["vision_checkpoint"]["satisfied"] is True ack = refreshed["autonomous_replan_ack"] @@ -154,6 +186,10 @@ def guard(turn): assert identity["turn_instance_id"] == TURN_ID persisted = json.loads(Path(refreshed["json_path"]).read_text()) assert persisted["autonomous_replan_ack"] == ack + assert persisted["agent_vision"]["stride_decision"]["axes"] == { + "work_slice": "shrink", "route_distance": "grow", "validation_scope": "shrink"} + from loopx.control_plane.goals.goal_vision import compact_goal_vision_packet + assert compact_goal_vision_packet(persisted["agent_vision"])["stride_decision"] == persisted["agent_vision"]["stride_decision"] assert _spend_run_count(runtime) == 0 settled = call(*_projected_cli_args(spend, turn_instance_id=TURN_ID)) assert settled["settlement_result"]["ok"] is True @@ -166,9 +202,39 @@ def guard(turn): assert after["decision"] == "run" assert after["goal_frontier_projection"]["replan_required"] is False assert _spend_run_count(runtime) == 1 + # A real second admitted Turn executes and records a bounded synthetic + # probe. The next review may observe that work, but cannot infer utility. + _bind_selected_replan_guard(registry, runtime, project, "turn-after-chain-review") + probe = project / "bounded-probe.txt" + probe.write_text("Alternative mechanism: isolated synthetic execution.\n") + assert probe.read_text().startswith("Alternative mechanism:") + call("refresh-state", "--goal-id", GOAL_ID, "--agent-id", AGENT_ID, + "--todo-id", SELECTED_REPLAN_TODO_ID, "--turn-instance-id", "turn-after-chain-review", + "--classification", "bounded_probe", "--delivery-batch-scale", "single_surface", + "--delivery-outcome", "outcome_progress", "--delivery-boundary", "in_flight_continuation", + "--next-action", "Compare the executed alternative against the accepted requirement.", + "--progress-result-class", "advanced", "--progress-surface-id", "surface-alternative", + "--progress-probe-kind", "controlled-mechanism-comparison", + "--progress-evidence-id", "evidence:executed-alternative-probe") + call("quota", "spend-slot", "--goal-id", GOAL_ID, "--agent-id", AGENT_ID, + "--todo-id", SELECTED_REPLAN_TODO_ID, "--turn-instance-id", "turn-after-chain-review", + "--slots", "1", "--source", "heartbeat", "--execute") + assert _spend_run_count(runtime) == 2 call("todo", "update", "--goal-id", GOAL_ID, "--todo-id", SELECTED_REPLAN_TODO_ID, "--agent-id", AGENT_ID, "--text", "Validate a changed acceptance boundary") changed = call("quota", "should-run", "--runtime-profile", "generic_cli", "--goal-id", GOAL_ID, "--agent-id", AGENT_ID) rearmed = changed["autonomous_replan_obligation"] assert rearmed["rearmed_after_obligation_id"] == ack["semantic_delta"]["obligation_id"] + follow = rearmed["replan_context"]["decision_followthrough"] + assert follow["previous_decision"]["turn_instance_id"] == TURN_ID + assert follow["previous_decision"]["path_delta"]["changed"] == ["Proceed with the first validation slice"] + assert follow["previous_decision"]["stride_decision"] == persisted["agent_vision"]["stride_decision"] + assert follow["recorded_progress_count"] == 1 + assert follow["execution_and_goal_gain"] == "unknown" + assert follow["source_history_complete"] is True + resolved = call("history", "--goal-id", GOAL_ID, "--agent-id", AGENT_ID, + "--evidence-ref", follow["previous_decision"]["evidence_ref"]) + assert resolved["evidence"]["path_delta"] == follow["previous_decision"]["path_delta"] + assert "_source_facts" not in resolved["evidence"] + assert _spend_run_count(runtime) == 2 diff --git a/tests/control_plane_ts/replan_context.test.ts b/tests/control_plane_ts/replan_context.test.ts index b288807233..7b344a0897 100644 --- a/tests/control_plane_ts/replan_context.test.ts +++ b/tests/control_plane_ts/replan_context.test.ts @@ -107,6 +107,134 @@ function pair(time = 1): [JsonObject, JsonObject] { return [work, accounting]; } +function reviewed(position = 0): JsonObject { + const [work] = pair(position + 1); + return {...work, _source_facts: {...work._source_facts, history_position: position, + agent_vision: {schema_version: "goal_vision_replan_contract_v0", agent_id: "agent-a", + path_delta: {schema_version: "goal_path_delta_v0", outcome: "replan", + prior_assumption: "The current method could explain the remaining gap.", + observed_reality: "Local validation improved but target quality remains uncertain.", + changed: ["Test an alternative mechanism on a bounded comparison."], + evidence_refs: ["evidence:review-basis"]}}, + autonomous_replan_ack: {schema_version: "autonomous_replan_ack_v0", recorded: true, + semantic_delta: {schema_version: "replan_semantic_delta_v0", accepted: true, + satisfying_outcomes: ["fresh_vision_path_outcome"]}}}}; +} + +function subsequent(position: number): JsonObject { + const [work] = pair(position + 1); + return {...work, progress_observation: {...progress, result_class: "advanced", + fingerprint: "probe-" + position, hypothesis_id: "hypothesis-local"}, + _source_facts: {...work._source_facts, history_position: position}}; +} + +const strideRequest = {...request, stride_strategy: "evidence_conditioned_v1"}; + +test("a prior accepted path returns with attributable later observations, never a utility verdict", () => { + const decision = reviewed(); + const later = subsequent(1); + const context = projectReplanContext({...strideRequest, from_full_index: true, rows: [decision, later]}); + const follow = context.decision_followthrough as JsonObject; + assert.equal(follow.recorded_progress_count, 1); + assert.equal(follow.execution_and_goal_gain, "unknown"); + assert.equal(follow.source_history_complete, true); + assert.equal(follow.unsequenced_progress_count, 0); + const previous = follow.previous_decision as JsonObject; + assert.equal(previous.todo_id, "todo-a"); + const resolve = projectReplanContext({...strideRequest, operation: "resolve", rows: [decision, later], + evidence_ref: previous.evidence_ref}); + assert.deepEqual((resolve.evidence as JsonObject).path_delta, previous.path_delta); + assert.ok(!("_source_facts" in (resolve.evidence as JsonObject))); + const changed = {...decision, _source_facts: {...decision._source_facts, + agent_vision: {schema_version: "goal_vision_replan_contract_v0", agent_id: "agent-a", + path_delta: {...previous.path_delta as JsonObject, changed: ["A replaced decision"]}}}}; + assert.throws(() => projectReplanContext({...strideRequest, operation: "resolve", rows: [changed, later], + evidence_ref: previous.evidence_ref}), /unavailable/); + + assert.deepEqual((follow.observations as JsonObject[])[0].coverage_ref, "probe-1"); + assert.ok(!("progress_observation" in (follow.observations as JsonObject[])[0])); + assert.deepEqual(context.uncovered_frontier, + projectReplanContext({...strideRequest, rows: [decision, later]}).uncovered_frontier); +}); + +test("append order survives clock skew; replay and accounting do not add research observations", () => { + const older = reviewed(); + const latest = {...reviewed(2), generated_at: row(0).generated_at, observed_at: 0}; + const before = subsequent(1); + const after = {...subsequent(3), generated_at: row(-1).generated_at, observed_at: -1}; + const [, accounting] = pair(5); + const context = projectReplanContext({...strideRequest, rows: [older, before, latest, after, after, accounting]}); + const follow = context.decision_followthrough as JsonObject; + assert.equal((follow.previous_decision as JsonObject).turn_instance_id, "turn-3"); + assert.equal(follow.recorded_progress_count, 1); + assert.equal((follow.observations as JsonObject[])[0].coverage_ref, "probe-3"); +}); + +test("bounded detail retains the full denominator and missing order remains visible", () => { + const context = projectReplanContext({...strideRequest, + rows: [reviewed(), ...Array.from({length: 9}, (_, i) => subsequent(i + 1)), row(12)]}); + const follow = context.decision_followthrough as JsonObject; + assert.equal(follow.recorded_progress_count, 9); + assert.equal((follow.observations as JsonObject[]).length, 6); + assert.equal(follow.omitted_observation_count, 3); + assert.equal(follow.unsequenced_progress_count, 1); + assert.equal(follow.source_history_complete, false); +}); + +test("missing, unaccepted or corrupt latest decision cannot impersonate an evidenced review", () => { + const valid = reviewed(); + const facts = valid._source_facts as JsonObject; + for (const patch of [{agent_vision: null}, {autonomous_replan_ack: null}, + {settlement_identity: null}, {turn_instance_id: "unrelated"}]) { + const context = projectReplanContext({...strideRequest, rows: [{...valid, _source_facts: {...facts, ...patch}}]}); + assert.equal(context.decision_followthrough, undefined); + } + const newer = reviewed(2); + const corrupt = {...newer, _source_facts: {...newer._source_facts, + agent_vision: {schema_version: "goal_vision_replan_contract_v0", agent_id: "agent-a", + path_delta: {outcome: "replan"}}}}; + assert.equal(projectReplanContext({...strideRequest, rows: [valid, corrupt]}).decision_followthrough, undefined); +}); + +test("another lane or retired Goal instance never supplies current decision evidence", () => { + const valid = reviewed(); + const other = {...valid, agent_id: "agent-b"}; + assert.equal(projectReplanContext({...strideRequest, rows: [other]}).decision_followthrough, undefined); + const oldRef = {goal_id: "goal-a", goal_instance_id: "instance-old"}; + const currentRef = {...oldRef, goal_instance_id: "instance-current"}; + const old = {...valid, _source_facts: {...valid._source_facts, goal_ref: oldRef}}; + assert.equal(projectReplanContext({...strideRequest, goal_facts: {goal_ref: currentRef}, rows: [old]}) + .decision_followthrough, undefined); + const current = {...valid, _source_facts: {...valid._source_facts, goal_ref: currentRef}}; + assert.deepEqual(((projectReplanContext({...strideRequest, goal_facts: {goal_ref: currentRef}, rows: [current]}) + .decision_followthrough as JsonObject).previous_decision as JsonObject).goal_ref, currentRef); +}); + +test("strategy off preserves context identity and selection despite decision transport facts", () => { + const rows = [reviewed(), subsequent(1)]; + const ordinary = projectReplanContext({...request, rows}); + const off = projectReplanContext({...request, rows, stride_strategy: "off"}); + assert.deepEqual(off, ordinary); + assert.equal(off.decision_followthrough, undefined); + const enabled = projectReplanContext({...strideRequest, rows}); + assert.equal(enabled.stride_strategy, "evidence_conditioned_v1"); + assert.deepEqual(validateReplanContext(enabled), enabled); + for (const patch of [{execution_and_goal_gain: "advanced"}, {recorded_progress_count: -1}, + {omitted_observation_count: 10}, {source_history_complete: null}]) { + assert.throws(() => validateReplanContext({...enabled, decision_followthrough: { + ...enabled.decision_followthrough as JsonObject, ...patch}}), /followthrough/); + } + assert.throws(() => validateReplanContext({...enabled, stride_strategy: "off"}), /enabled strategy/); + + assert.notEqual(enabled.context_id, off.context_id); + for (const field of ["evidence", "coverage_ledger", "uncovered_frontier", "evidence_count"]) { + assert.deepEqual(enabled[field], off[field]); + } + for (const version of ["future_v2", null, 1]) { + assert.throws(() => projectReplanContext({...request, rows, stride_strategy: version}), /stride_strategy/); + } +}); + test("reduction preserves raw counts, negative coverage, obligation and immutable resolution", () => { const [work, accounting] = pair(); const legacy = [work, accounting].map(({_source_facts: _source, ...row}) => row); diff --git a/tests/control_plane_ts/replan_semantics.test.ts b/tests/control_plane_ts/replan_semantics.test.ts index 42ef0ccf5a..bbfd9be05a 100644 --- a/tests/control_plane_ts/replan_semantics.test.ts +++ b/tests/control_plane_ts/replan_semantics.test.ts @@ -310,6 +310,27 @@ test("planning advice cannot discharge a replan or widen source-specific exits", }); +test("versioned stride advice is opt-in and never a semantic discharge", () => { + const plain = {triggers: [{kind: "typed_progress_repeat"}]}; + const base = projectReplanSemantics({operation: "requirements", obligation: plain}); + const off = projectReplanSemantics({operation: "requirements", obligation: { + ...plain, replan_context: {stride_strategy: "off"}}}); + assert.deepEqual(off, base); + const enabled = {...plain, replan_context: {stride_strategy: "evidence_conditioned_v1"}}; + const withStrategy = projectReplanSemantics({operation: "requirements", obligation: enabled}); + assert.deepEqual((withStrategy.planning_guidance as string[]).slice(0, 5), base.planning_guidance); + assert.equal((withStrategy.planning_guidance as string[]).length, 6); + assert.deepEqual(withStrategy.required_any_of, base.required_any_of); + assert.match((withStrategy.planning_guidance as string[])[5], /work-slice size, mechanism distance and validation breadth independently/); + assert.match((withStrategy.planning_guidance as string[])[5], /do not force a pivot from elapsed time or one noisy result/); + assert.equal(projectReplanSemantics({operation: "qualify", obligation: enabled, + planning_guidance: withStrategy.planning_guidance}).accepted, false); + for (const version of ["future_v2", null, 1]) { + assert.throws(() => projectReplanSemantics({operation: "requirements", obligation: { + ...plain, replan_context: {stride_strategy: version}}}), /stride_strategy/); + } +}); + test("vision ACK freshness covers its durable run, never later gaps or unknown timestamps", () => { const at = "2026-08-13T09:00:00+08:00"; const ack = {recorded: true, generated_at: at, diff --git a/tests/control_plane_ts/stride_policy.test.ts b/tests/control_plane_ts/stride_policy.test.ts new file mode 100644 index 0000000000..785c425249 --- /dev/null +++ b/tests/control_plane_ts/stride_policy.test.ts @@ -0,0 +1,68 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import {normalizeStrideDecision, strideControlContract} from "../../loopx/control_plane/work_items/stride_policy.ts"; +import {buildVisionCheckpoint, VISION_REFRESH_REQUEST_SCHEMA} from "../../loopx/control_plane/goals/vision_checkpoint.ts"; +import {projectReplanSemantics} from "../../loopx/control_plane/work_items/replan_semantics.ts"; + +const contextId = "replan-context-" + "a".repeat(24); +const proposal = {schema_version: "stride_decision_v1", strategy_version: "evidence_conditioned_v1", + reference_context_id: contextId, reference_obligation_id: "replan-" + "a".repeat(16), basis: "unexplained_gap", next_probe: { + scope: "Compare a bounded alternative route.", prediction: "The alternative explains the remaining gap.", + adoption_criterion: "Retain an attributable validated gain.", cost_bound: "One small probe before expanding."}}; +const packet = {schema_version: "goal_vision_replan_contract_v0", agent_id: "agent-a", + vision_patch: {acceptance_summary: "Applicable evidence leaves a goal gap."}, path_delta: { + schema_version: "goal_path_delta_v0", outcome: "replan", prior_assumption: "Local tuning could close the gap.", + observed_reality: "Evidence leaves that explanation unresolved.", changed: ["Test an alternative mechanism."], + evidence_refs: ["evidence:review"]}, stride_decision: proposal}; +const request = {schema_version: VISION_REFRESH_REQUEST_SCHEMA, phase: "prepare", goal_id: "goal-a", + agent_id: "agent-a", merge_patch: false, existing_agent_vision: null, + require_path_delta_for_durable_change: false, agent_vision_packet: packet}; + +test("v1 separates route departure from work size and uncertainty from route novelty", () => { + assert.deepEqual(normalizeStrideDecision(proposal)[0]?.axes, + {work_slice: "shrink", route_distance: "grow", validation_scope: "shrink"}); + assert.deepEqual(normalizeStrideDecision({...proposal, basis: "uncertain_evidence"})[0]?.axes, + {work_slice: "shrink", route_distance: "hold", validation_scope: "grow"}); + assert.deepEqual(normalizeStrideDecision({...proposal, basis: "supported_progress"})[0]?.axes, + {work_slice: "grow", route_distance: "hold", validation_scope: "hold"}); + assert.equal(strideControlContract({stride_strategy: "off"}), null); + const prepared = buildVisionCheckpoint(request); + const decision = (prepared.agent_vision as Record).stride_decision as Record; + assert.deepEqual(decision.axes, {work_slice: "shrink", route_distance: "grow", validation_scope: "shrink"}); + const budget = (prepared.agent_vision as Record).vision_budget as Record; + assert.ok(Number(budget.total_usage) < 1800); +}); + +test("invalid, ambiguous, oversized and misplaced control proposals fail authoring", () => { + for (const patch of [{basis: "plateau_from_elapsed_time"}, {strategy_version: "future_v2"}, + {axes: {work_slice: "grow", route_distance: "grow", validation_scope: "grow"}}, + {next_probe: {...proposal.next_probe, scope: "x".repeat(121)}}, {reference_context_id: "missing"}, + {permission: "execute_anything"}, {next_probe: {...proposal.next_probe, cost_bound: ""}}]) { + assert.throws(() => buildVisionCheckpoint({...request, agent_vision_packet: { + ...packet, stride_decision: {...proposal, ...patch}}})); + } + assert.throws(() => buildVisionCheckpoint({...request, agent_vision_packet: { + ...packet, vision_patch: {...packet.vision_patch, stride_decision: proposal}, stride_decision: undefined}}), /agent_vision.stride_decision/); + assert.throws(() => buildVisionCheckpoint({...request, agent_vision_packet: { + ...packet, stride_decision: {...proposal, next_probe: {...proposal.next_probe, scope: "/Users/private-owner/file"}}}}), /private/); +}); + +test("an accepted schema and vector do not authorize work or certify gain; stale references cannot discharge a path review", () => { + const vision = buildVisionCheckpoint(request).agent_vision; + const obligation = {obligation_id: "replan-" + "a".repeat(16), triggers: [{kind: "vision_acceptance_gap"}], + replan_context: {stride_strategy: "evidence_conditioned_v1", context_id: contextId}}; + assert.equal(projectReplanSemantics({operation: "qualify", obligation, agent_vision: vision}).accepted, true); + const stale = projectReplanSemantics({operation: "qualify", obligation: {...obligation, obligation_id: "replan-" + "b".repeat(16)}, agent_vision: vision}); + // A changed live context from shared-pool churn cannot steal the admitted obligation. + assert.equal(projectReplanSemantics({operation: "qualify", obligation: {...obligation, + replan_context: {...obligation.replan_context, context_id: "replan-context-" + "b".repeat(24)}}, agent_vision: vision}).accepted, true); + const legacyVision = {...packet, stride_decision: undefined}; + const missing = projectReplanSemantics({operation: "qualify", obligation, agent_vision: legacyVision}); + assert.equal(missing.accepted, false); + assert.equal(missing.reason_code, "stride_decision_required"); + assert.equal(projectReplanSemantics({operation: "qualify", obligation: {...obligation, + replan_context: {stride_strategy: "off"}}, agent_vision: legacyVision}).accepted, true); + assert.equal(stale.accepted, false); + assert.equal(stale.reason_code, "stride_reference_obligation_mismatch"); + assert.equal(projectReplanSemantics({operation: "qualify", obligation, stride_decision: proposal}).accepted, false); +}); diff --git a/tests/test_chat_machine_configuration_api.py b/tests/test_chat_machine_configuration_api.py index adf21d44f2..c4f9eb253b 100644 --- a/tests/test_chat_machine_configuration_api.py +++ b/tests/test_chat_machine_configuration_api.py @@ -350,9 +350,10 @@ def test_inspection_lists_registered_namespaces_without_local_refs( "timezone": "UTC", } assert namespace_catalog["todo_replan_cadence"]["configuration_template"] == { - "schema_version": "todo_replan_cadence_machine_defaults_v1", + "schema_version": "todo_replan_cadence_machine_defaults_v2", "count_unit": "effective_turns", "count": 6, + "stride_strategy": "off", } assert namespace_catalog["change_quality_qualification"][ "configuration_template" From fff7fdcb9aba466695fce2a903dce471ee67741f Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 12 Oct 2026 15:55:52 +0800 Subject: [PATCH 4/7] feat(benchmark): configure and verify explicit stride treatment versions Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- benchmark/edgebench/export_report.py | 8 +++++ benchmark/edgebench/run.py | 11 +++++- benchmark/runtime/harbor.py | 21 +++++++++-- benchmark/runtime/sforge.py | 10 +++++- benchmark/tests/test_edgebench_report.py | 36 +++++++++++++++++++ benchmark/tests/test_sforge_runtime.py | 3 ++ benchmark/tests/test_shared_codex_runtime.py | 38 ++++++++++++++++++++ benchmark/tests/test_task_entry.py | 8 ++++- loopx/execution_profile.py | 2 ++ 9 files changed, 132 insertions(+), 5 deletions(-) diff --git a/benchmark/edgebench/export_report.py b/benchmark/edgebench/export_report.py index a06bff4b16..d8be072b56 100644 --- a/benchmark/edgebench/export_report.py +++ b/benchmark/edgebench/export_report.py @@ -215,6 +215,11 @@ def export(runs_root: Path, selection: list, output: Path, *, observed_at: str): if row.get("runner_revision") != receipt["runner_commit"]: raise ValueError("Board and runner revision disagree") _validate_feedback_payload(receipt, profile) + if receipt.get("stride_strategy") != profile.get("stride_strategy"): + raise ValueError("Profile disagrees with runtime: stride_strategy") + if "stride_strategy" in receipt: + from loopx.control_plane.work_items.stride_policy_codec import normalize_stride_strategy + normalize_stride_strategy(receipt["stride_strategy"]) if number(final["best_score"]) != number(receipt["best_score"]): raise ValueError("Final and runtime scores disagree") score_entries = [ @@ -273,6 +278,9 @@ def export(runs_root: Path, selection: list, output: Path, *, observed_at: str): if "feedback_payload" in receipt: config["runner"]["feedback_payload"] = receipt["feedback_payload"] config["worker_profile"]["feedback_payload"] = profile["feedback_payload"] + if "stride_strategy" in receipt: + config["runner"]["stride_strategy"] = receipt["stride_strategy"] + config["worker_profile"]["stride_strategy"] = profile["stride_strategy"] row["status"], row["observed_at"] = "completed", observed_at row["metrics"]["best_score"] = { "value": final["best_score"], diff --git a/benchmark/edgebench/run.py b/benchmark/edgebench/run.py index 46fb130e6e..05b2bf6c3b 100644 --- a/benchmark/edgebench/run.py +++ b/benchmark/edgebench/run.py @@ -20,6 +20,7 @@ from sforge.harness.task_spec import make_task_spec from benchmark.runtime.codex import TASK_ENTRIES +from loopx.control_plane.work_items.stride_policy_codec import stride_strategy_options from benchmark.runtime.sforge import ( DEFAULT_TIMEOUT_SECONDS, PROFILES, SForgeWorker, ) @@ -116,6 +117,8 @@ def main(argv=None): help="Heartbeat default: 6 settled effective work Turns") cadence.add_argument("--replan-after-todos", type=int, choices=range(1, 6), help="Explicit completed-Todo cadence ablation for heartbeat profiles") + parser.add_argument("--stride-strategy", choices=stride_strategy_options(), + help="Explicit heartbeat Goal-review strategy; omitted keeps the ordinary off treatment") parser.add_argument("--eval-interval", type=int, help="Native default: 0 (no periodic evaluation); other modes use task defaults; explicit 0 disables") parser.add_argument("--submission-cooldown", type=int, @@ -137,6 +140,8 @@ def main(argv=None): if (args.replan_after_turns is not None or args.replan_after_todos is not None ) and not args.worker.startswith("heartbeat-"): parser.error("Replan cadence requires a heartbeat worker") + if args.stride_strategy is not None and not args.worker.startswith("heartbeat-"): + parser.error("--stride-strategy requires a heartbeat worker") # One directory is one attempt: never reuse native registration or overwrite # source/profile evidence after an ambiguous launch. trial = args.log_dir / "runs" / args.run_id / args.task @@ -189,7 +194,9 @@ def main(argv=None): task_entry=args.task_entry, turn_envelope=args.turn_envelope, replan_after_turns=args.replan_after_turns, - replan_after_todos=args.replan_after_todos) + replan_after_todos=args.replan_after_todos, + **({"stride_strategy": args.stride_strategy} + if args.stride_strategy is not None else {})) if args.api_proxy_url: agent.default_api_base_url = args.api_proxy_url logger = logging.getLogger("edgebench-runtime") @@ -233,6 +240,8 @@ def main(argv=None): if agent.replan_after_turns is not None else {}), **({"replan_after_completed_todos": agent.replan_after_todos} if agent.replan_after_todos is not None else {}), + **({"stride_strategy": args.stride_strategy} + if args.stride_strategy is not None else {}), } receipt_path = trial / "runtime-receipt.json" receipt_path.write_text(json.dumps(receipt, indent=2)) diff --git a/benchmark/runtime/harbor.py b/benchmark/runtime/harbor.py index 56d8c29a1d..ee5e8fe435 100644 --- a/benchmark/runtime/harbor.py +++ b/benchmark/runtime/harbor.py @@ -16,6 +16,8 @@ from harbor.models.trajectories import FinalMetrics, Trajectory from harbor.utils.trajectory_utils import format_trajectory_json +from loopx.control_plane.work_items.stride_policy_codec import normalize_stride_strategy + from .codex_offline import CodexOffline, stage_portable_python from .codex import DEFAULT_REPLAN_AFTER_TURNS, Execution @@ -56,6 +58,7 @@ def __init__( scheduler_timeout_sec=5080, replan_after_todos=None, replan_after_turns=None, + stride_strategy=None, task_entry=None, planning_timeout_sec=300, turn_envelope=False, @@ -95,6 +98,10 @@ def __init__( self.replan_after_todos = int(3 if replan_after_todos is None else replan_after_todos) if not 1 <= self.replan_after_todos <= 5: raise ValueError("replan_after_todos must be between 1 and 5") + if stride_strategy is not None and not self.execution.uses_loopx: + raise ValueError("stride_strategy requires a LoopX execution mode") + self.stride_strategy = (normalize_stride_strategy(stride_strategy) + if stride_strategy is not None else None) self._task_path = "/usr/local/bin:/usr/bin:/bin" self._phase_number = 0 self._seeded_todo_id: str | None = None @@ -113,9 +120,10 @@ def _replan_configuration(self) -> tuple[str, str, int]: return ("replan_after_completed_todos", "--execution-replan-after-todos", self.replan_after_todos) - def _replan_receipt(self) -> dict[str, int]: + def _replan_receipt(self) -> dict[str, int | str]: key, _, value = self._replan_configuration() - return {key: value} + return {key: value, **({"stride_strategy": self.stride_strategy} + if self.stride_strategy is not None else {})} @staticmethod def name() -> str: @@ -362,6 +370,8 @@ async def _prepare_phase( self, environment: BaseEnvironment, instruction: str, *, cwd: str ) -> None: key, option, expected = self._replan_configuration() + stride_args = (["--execution-stride-strategy", self.stride_strategy] + if self.stride_strategy is not None else []) pending = await environment.exec( command=f"test -e {_LOOPX_RUNTIME}/benchmark-pending-turn.json" ) @@ -407,6 +417,7 @@ async def _prepare_phase( "trial-workspace", option, str(expected), + *stride_args, "--agent-work-mode", f"{_AGENT_ID}=active", "--execute", @@ -423,6 +434,7 @@ async def _prepare_phase( _GOAL_ID, option, str(expected), + *stride_args, "--execute", ], cwd=cwd, @@ -440,6 +452,11 @@ async def _prepare_phase( raise RuntimeError( f"replan cadence readback mismatch for {key}: expected {expected}, got {configured!r}" ) + strategy = configured_state.get("execution_profile", {}).get("stride_strategy", "off") + if strategy != (self.stride_strategy or "off"): + raise RuntimeError( + f"stride strategy readback mismatch: expected {self.stride_strategy or 'off'}, got {strategy!r}" + ) async def _seed_phase(self, environment: BaseEnvironment, *, cwd: str) -> None: text = ( diff --git a/benchmark/runtime/sforge.py b/benchmark/runtime/sforge.py index 9fbd211258..b2bfff5e0f 100644 --- a/benchmark/runtime/sforge.py +++ b/benchmark/runtime/sforge.py @@ -90,7 +90,8 @@ def __init__(self, config, *, profile: str, cwd: str, task_entry: str | None = None, turn_envelope: bool = False, replan_after_turns: int | None = None, - replan_after_todos: int | None = None): + replan_after_todos: int | None = None, + stride_strategy: str | None = None): super().__init__(config) if profile not in PROFILES: raise ValueError("Unknown benchmark worker profile") @@ -129,6 +130,12 @@ def __init__(self, config, *, profile: str, cwd: str, replan_after_turns = DEFAULT_REPLAN_AFTER_TURNS self.replan_after_turns = replan_after_turns self.replan_after_todos = replan_after_todos + if stride_strategy is not None and not profile.startswith("heartbeat-"): + raise ValueError("stride_strategy requires a heartbeat profile") + if stride_strategy is not None: + from loopx.control_plane.work_items.stride_policy_codec import normalize_stride_strategy + stride_strategy = normalize_stride_strategy(stride_strategy) + self.stride_strategy = stride_strategy self.profile, self.cwd = profile, cwd if feedback not in FEEDBACK_MODES: raise ValueError("Unknown feedback mode") @@ -214,6 +221,7 @@ def _install_worker(self, backend, handle, log_dir, logger): turn_envelope=self.turn_envelope, replan_after_turns=self.replan_after_turns, replan_after_todos=self.replan_after_todos, + stride_strategy=self.stride_strategy, task_objective=self.task_objective, ) asyncio.run(self.runtime.install(self.environment)) diff --git a/benchmark/tests/test_edgebench_report.py b/benchmark/tests/test_edgebench_report.py index 79dc9521b5..d0b7993210 100644 --- a/benchmark/tests/test_edgebench_report.py +++ b/benchmark/tests/test_edgebench_report.py @@ -11,6 +11,42 @@ from benchmark.edgebench.export_report import digest, export, verify, write +@pytest.mark.parametrize("strategy", [None, "off", "evidence_conditioned_v1"]) +def test_report_preserves_observed_stride_version_and_absence(trial, strategy): + runs, selection, output, task = trial + task = runs / "run" / "case" + for name in ("runtime-receipt", "worker-profile"): + path = task / (name + ".json") + value = json.loads(path.read_text()) + if strategy is not None: + value["stride_strategy"] = strategy + value["worker" if name == "runtime-receipt" else "profile"] = "heartbeat-resume" + write(path, value) + export(runs, selection, output, observed_at="2026-01-02T00:00:00+00:00") + config = json.loads((output / "settings/run.json").read_text()) + for field in ("runner", "worker_profile"): + assert config[field].get("stride_strategy") == strategy + assert ("stride_strategy" in config[field]) is (strategy is not None) + + +@pytest.mark.parametrize("runner,profile", [ + ("evidence_conditioned_v1", "off"), + ("evidence_conditioned_v1", None), + ("future_policy", "future_policy"), +]) +def test_report_rejects_unbound_or_unknown_stride_version(trial, runner, profile): + runs, selection, output, task = trial + task = runs / "run" / "case" + for name, strategy in (("runtime-receipt", runner), ("worker-profile", profile)): + path = task / (name + ".json") + value = json.loads(path.read_text()) + if strategy is not None: + value["stride_strategy"] = strategy + write(path, value) + with pytest.raises(ValueError, match="stride_strategy"): + export(runs, selection, output, observed_at="2026-01-02T00:00:00+00:00") + + @pytest.fixture def trial(tmp_path): row = dict( diff --git a/benchmark/tests/test_sforge_runtime.py b/benchmark/tests/test_sforge_runtime.py index 1fb2453cfb..4651474de4 100644 --- a/benchmark/tests/test_sforge_runtime.py +++ b/benchmark/tests/test_sforge_runtime.py @@ -454,6 +454,9 @@ def test_envelope_rejects_incompatible_sforge_worker(profile): ("native-goal", ["--replan-after-todos", "3"]), ("heartbeat-resume", ["--replan-after-turns", "3", "--replan-after-todos", "3"]), ("heartbeat-explore", ["--replan-after-todos", "0"]), + ("official", ["--stride-strategy", "off"]), + ("native-goal", ["--stride-strategy", "evidence_conditioned_v1"]), + ("heartbeat-resume", ["--stride-strategy", "future_policy"]), ]) def test_edgebench_rejects_invalid_profile_settings_before_creating_trial(tmp_path, profile, options): pytest.importorskip('sforge') diff --git a/benchmark/tests/test_shared_codex_runtime.py b/benchmark/tests/test_shared_codex_runtime.py index edc3dddbd0..e9e3e2787d 100644 --- a/benchmark/tests/test_shared_codex_runtime.py +++ b/benchmark/tests/test_shared_codex_runtime.py @@ -408,6 +408,44 @@ async def no_pending(**kwargs): assert agent._replan_receipt() == {field: value} +def test_requested_stride_requires_configuration_readback_before_execution(tmp_path, monkeypatch): + pytest.importorskip("harbor") + from benchmark.runtime.harbor import BenchmarkCodex + + agent = BenchmarkCodex(logs_dir=tmp_path, model_name="fixture", + stride_strategy="evidence_conditioned_v1") + + async def prepared(*args, **kwargs): + return True + + async def no_pending(**kwargs): + return SimpleNamespace(return_code=1) + + async def wrong_strategy(*args, **kwargs): + return {"after": {"execution_profile": { + "replan_after_effective_turns": 6, "stride_strategy": "off", + }}} + + monkeypatch.setattr(agent, "_registry_exists", prepared) + monkeypatch.setattr(agent, "_write_task_document", prepared) + monkeypatch.setattr(agent, "_loopx", wrong_strategy) + with pytest.raises(RuntimeError, match="stride strategy readback mismatch"): + asyncio.run(agent._prepare_phase(SimpleNamespace(exec=no_pending), "Synthetic task", cwd=str(tmp_path))) + + +@pytest.mark.parametrize("settings", [ + {"stride_strategy": "future_policy"}, + {"stride_strategy": True}, + {"execution_mode": "plain", "stride_strategy": "off"}, +]) +def test_stride_rejects_unknown_version_and_incompatible_mode(tmp_path, settings): + pytest.importorskip("harbor") + from benchmark.runtime.harbor import BenchmarkCodex + + with pytest.raises(ValueError, match="stride_strategy"): + BenchmarkCodex(logs_dir=tmp_path, model_name="fixture", **settings) + + def test_staged_snapshot_keeps_observed_commit_when_branch_moves(tmp_path, monkeypatch): pytest.importorskip("harbor") import tarfile diff --git a/benchmark/tests/test_task_entry.py b/benchmark/tests/test_task_entry.py index 44d7a99eac..5dbc329cd2 100644 --- a/benchmark/tests/test_task_entry.py +++ b/benchmark/tests/test_task_entry.py @@ -569,6 +569,9 @@ def test_sforge_planning_failed_host_has_no_execution_handoff(planning_env): ({}, "replan_after_effective_turns", 6), ({"replan_after_turns": 2}, "replan_after_effective_turns", 2), ({"replan_after_todos": 3}, "replan_after_completed_todos", 3), + ({"stride_strategy": "off"}, "replan_after_effective_turns", 6), + ({"stride_strategy": "evidence_conditioned_v1"}, "replan_after_effective_turns", 6), + ({"stride_strategy": "evidence_conditioned_v1", "replan_after_todos": 2}, "replan_after_completed_todos", 2), ]) def test_runner_cadence_persists_through_real_configure_goal( planning_env, tmp_path, monkeypatch, settings, field, value @@ -609,4 +612,7 @@ async def no_pending(**kwargs): other = ("replan_after_completed_todos" if field == "replan_after_effective_turns" else "replan_after_effective_turns") assert other not in profile - assert agent._replan_receipt() == {field: value} + strategy = settings.get("stride_strategy") + assert profile.get("stride_strategy", "off") == (strategy or "off") + assert agent._replan_receipt() == {field: value, **({"stride_strategy": strategy} + if strategy is not None else {})} diff --git a/loopx/execution_profile.py b/loopx/execution_profile.py index b13bca3c4d..7ead8148aa 100644 --- a/loopx/execution_profile.py +++ b/loopx/execution_profile.py @@ -284,6 +284,8 @@ def apply_goal_execution_profile_change( profile["stride_strategy"] = stride_strategy if clear_replan_after_effective_turns or replan_after_completed_todos is not None: profile.pop("replan_after_effective_turns", None) + if replan_after_completed_todos is not None: + profile["replan_after_completed_todos"] = replan_after_completed_todos if replan_after_effective_turns is not None: profile["replan_after_effective_turns"] = replan_after_effective_turns profile.pop("replan_after_completed_todos", None) From 4ada516b8c6dbf85edf8206f8abacbcea4bbf9e4 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 12 Oct 2026 15:55:52 +0800 Subject: [PATCH 5/7] docs(benchmark): document stride opt-in and align packaged catalog checks Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- benchmark/edgebench/README.md | 19 +++++++++++++++++++ .../personal-workspace-browser/fixture.mjs | 4 ++-- .../typed-actions.mjs | 4 ++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/benchmark/edgebench/README.md b/benchmark/edgebench/README.md index 8088511c63..36eee7b417 100644 --- a/benchmark/edgebench/README.md +++ b/benchmark/edgebench/README.md @@ -439,6 +439,25 @@ other replan reasons may trigger sooner. Both runtime and worker-profile receipt record the resolved cadence. Only newly launched attempts use the new default; keep existing runs and archived settings pinned. +### Optional structured stride strategy + +Add `--stride-strategy evidence_conditioned_v1` to a new `heartbeat-resume` +or `heartbeat-explore` trial to opt into the existing Goal review strategy. +The runner writes the option together with the resolved cadence and checks +the real Goal configuration before planning or execution. The install, +worker-profile and runtime receipts record an explicitly selected version. +Omitting the option preserves ordinary off commands and receipt shapes; +`--stride-strategy off` explicitly selects the disabled treatment. Plain and +native-goal profiles reject this option before creating a trial. Unknown +versions also fail before registration or execution. + +The [Goal review contract](../../docs/reference/protocols/goal-vision-replan-contract-v0.md) +defines structured proposals and the three independently controlled axes. +Strategy configuration grants no new execution authority, evaluator feedback, +budget or submissions. Freeze it with exact sources under a new run ID; do not +change live workers. Receipts qualify requested configuration, while actual +review, proposal adoption and task gains require trajectory evidence. + ## Optional short-context treatment Add `--turn-envelope` to an otherwise identical `heartbeat-resume` or diff --git a/examples/personal-workspace-browser/fixture.mjs b/examples/personal-workspace-browser/fixture.mjs index 8962c8e6c0..07ab62cca4 100644 --- a/examples/personal-workspace-browser/fixture.mjs +++ b/examples/personal-workspace-browser/fixture.mjs @@ -149,7 +149,7 @@ export function goalCapabilityCatalog(multiSubagentConfiguration) { return [ goalCapability({ capabilityId: "todo_replan_cadence", - displayName: "Goal review cadence", + displayName: "Goal review and stride", editorScopes: ["machine", "goal"], defaultConfiguration: { count_unit: "effective_turns", count: 5 }, fields: [ @@ -1043,7 +1043,7 @@ export async function installApi(page, { goalSubagentConfigurationEnabled = true }, { namespace: "todo_replan_cadence", - title: "Goal review cadence", + title: "Goal review and stride", description: "Live review threshold without added turns, quota, or authority.", schema_versions: ["todo_replan_cadence_machine_defaults_v0", "todo_replan_cadence_machine_defaults_v1"], configuration_template: cadenceConfiguration, diff --git a/examples/personal-workspace-browser/typed-actions.mjs b/examples/personal-workspace-browser/typed-actions.mjs index f03c69d411..ce711e4795 100644 --- a/examples/personal-workspace-browser/typed-actions.mjs +++ b/examples/personal-workspace-browser/typed-actions.mjs @@ -1074,7 +1074,7 @@ export const typedActionsScenario = { } if (await page.locator(".personal-capability-editor-status").count()) throw new Error("Editable Goal settings must not show internal editor-contract notices"); const expectedGoalCapabilities = [ - "变更质量验证", "Goal 复核周期", "探索图谱", "探索 Harness", "飞书事件收件箱", + "变更质量验证", "Goal 复盘与步幅", "探索图谱", "探索 Harness", "飞书事件收件箱", "飞书看板心跳同步", "已退役的 Authority 观测", "自适应子 Agent 容量", "已注册 Peer 任务协调", "周期报告", "Reward Memory 实验", ]; @@ -1294,7 +1294,7 @@ export const typedActionsScenario = { || api.machineConfigurationRequests.length !== requestsBeforeReadOnly) { throw new Error("Other machine settings mixed Goal-only or steward controls into the catalog"); } - await machineCatalog.getByRole("button", { name: /^Goal 复核周期/ }).click(); + await machineCatalog.getByRole("button", { name: /^Goal 复盘与步幅/ }).click(); const reviewUnit = page.getByLabel(/^复核计数依据/u); const reviewCount = page.getByLabel("两次复核间的数量", { exact: true }); await reviewUnit.waitFor({ state: "visible" }); From 0125d4729499808d57471d6d6abeca543ec166bd Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 12 Oct 2026 16:18:03 +0800 Subject: [PATCH 6/7] fix(replan): qualify causal positions from history carrier order Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../work_items/progress_observation.py | 1 + .../work_items/replan_context_codec.py | 23 ++++- .../test_replan_context_order.py | 91 +++++++++++++++++++ 3 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 tests/control_plane/test_replan_context_order.py diff --git a/loopx/control_plane/work_items/progress_observation.py b/loopx/control_plane/work_items/progress_observation.py index 1700f9daa0..91cc75ee43 100644 --- a/loopx/control_plane/work_items/progress_observation.py +++ b/loopx/control_plane/work_items/progress_observation.py @@ -492,6 +492,7 @@ def build_replan_context( goal_id=goal_id, agent_id=agent_id or obligation.get("agent_id"), runs=newest_first_runs, obligation=obligation, source_status=source_status, goal_acceptance_contract=goal_acceptance_contract, stride_strategy=stride_strategy, + history_newest_first=True, ) diff --git a/loopx/control_plane/work_items/replan_context_codec.py b/loopx/control_plane/work_items/replan_context_codec.py index 5c964d5c81..f017e3fa79 100644 --- a/loopx/control_plane/work_items/replan_context_codec.py +++ b/loopx/control_plane/work_items/replan_context_codec.py @@ -29,9 +29,22 @@ def replan_history_from_status(status: Mapping[str, Any], goal_id: str) -> list[ return snapshot -def replan_evidence_rows(runs: Iterable[Mapping[str, Any]], *, goal_id: str, agent_id: str | None, include_decisions: bool = False) -> list[dict[str, Any]]: +def replan_evidence_rows(runs: Iterable[Mapping[str, Any]], *, goal_id: str, agent_id: str | None, + include_decisions: bool = False, history_newest_first: bool | None = None, +) -> list[dict[str, Any]]: from .progress_observation import normalize_progress_observation + if history_newest_first is not None and not isinstance(history_newest_first, bool): + raise ValueError("history_newest_first must be a boolean or unknown") + # Carrier order is an IO fact, not a timestamp-based policy. Keep the wire + # rows in their original order so ordinary evidence/reference parity holds. + # Arbitrary iterables supply no causal positions unless the caller knows + # their order; real indexes are append ordered, compact history is newest first. + if include_decisions and history_newest_first is True: + runs = list(runs) + newest_position = len(runs) - 1 + else: + newest_position = None rows = [] for position, run in enumerate(runs): if not isinstance(run, Mapping): @@ -73,7 +86,8 @@ def replan_evidence_rows(runs: Iterable[Mapping[str, Any]], *, goal_id: str, age # and orders subsequent observations. Do not classify research # progress or infer adoption from prose in this transport codec. if include_decisions: - source["history_position"] = position + if history_newest_first is not None: + source["history_position"] = newest_position - position if newest_position is not None else position source["goal_ref"] = run.get("goal_ref") source["agent_vision"] = run.get("agent_vision") source["autonomous_replan_ack"] = run.get("autonomous_replan_ack") @@ -130,6 +144,7 @@ def project_replan_context( source_status: Mapping[str, Any] | None = None, goal_acceptance_contract: Mapping[str, Any] | None = None, stride_strategy: str = "off", + history_newest_first: bool | None = None, ) -> dict[str, Any]: from .replan_history_codec import project_replan_request from .stride_policy_codec import normalize_stride_strategy @@ -139,6 +154,7 @@ def project_replan_context( prefix = ["loopx"] if source_status is not None: runs = replan_history_from_status(source_status, goal_id) + history_newest_first = not bool(source_status.get("registry") and source_status.get("runtime_root")) for field, option in (("registry", "--registry"), ("runtime_root", "--runtime-root")): if source_status.get(field): prefix.extend([option, str(source_status[field])]) @@ -148,7 +164,8 @@ def project_replan_context( "goal_id": goal_id, "agent_id": agent_id, "obligation": dict(obligation) if obligation is not None else None, "rows": replan_evidence_rows(runs, goal_id=goal_id, agent_id=agent_id, - include_decisions=strategy != "off" or bool(evidence_ref and evidence_ref.startswith("replan-decision-"))), + include_decisions=strategy != "off" or bool(evidence_ref and evidence_ref.startswith("replan-decision-")), + history_newest_first=history_newest_first), "stride_strategy": strategy, "evidence_ref": evidence_ref, "read_prefix": shlex.join(prefix), diff --git a/tests/control_plane/test_replan_context_order.py b/tests/control_plane/test_replan_context_order.py new file mode 100644 index 0000000000..513e7eb0d5 --- /dev/null +++ b/tests/control_plane/test_replan_context_order.py @@ -0,0 +1,91 @@ +"""Causal feedback must use the carrier's declared order, never its timestamps.""" +from __future__ import annotations + +import json + +import pytest + +from loopx.control_plane.work_items.progress_observation import build_replan_context +from loopx.control_plane.work_items.replan_context_codec import project_replan_context +from test_replan_context_evidence import _settled_pair + + +def _rows(): + work, _ = _settled_pair() + + def decision(turn, timestamp): + return {**work, "generated_at": timestamp, "turn_instance_id": turn, + "settlement_identity": {**work["settlement_identity"], "turn_instance_id": turn}, + "agent_vision": {"schema_version": "goal_vision_replan_contract_v0", "agent_id": "agent-a", + "path_delta": {"schema_version": "goal_path_delta_v0", "outcome": "replan", + "prior_assumption": "The current route could explain the gap.", + "observed_reality": "The gap remains unexplained.", "changed": ["Compare another route."], + "evidence_refs": ["evidence:route-basis"]}}, + "autonomous_replan_ack": {"schema_version": "autonomous_replan_ack_v0", "recorded": True, + "semantic_delta": {"schema_version": "replan_semantic_delta_v0", "accepted": True, + "satisfying_outcomes": ["fresh_vision_path_outcome"]}}} + + older = decision("turn-old", "2026-08-18T03:00:00Z") + latest = decision("turn-latest", "2026-08-18T01:00:00Z") + later = {**work, "turn_instance_id": "turn-probe", "generated_at": "2026-08-18T00:00:00Z", + "settlement_identity": {**work["settlement_identity"], "turn_instance_id": "turn-probe"}, + "progress_observation": {**work["progress_observation"], "surface_id": "surface-probe"}} + return [older, latest, later] + + +def _assert_followthrough(context): + follow = context["decision_followthrough"] + assert follow["previous_decision"]["turn_instance_id"] == "turn-latest" + assert follow["recorded_progress_count"] == 1 + assert follow["observations"][0]["generated_at"] == "2026-08-18T00:00:00Z" + assert follow["execution_and_goal_gain"] == "unknown" + return follow + + +@pytest.mark.parametrize("shape", ["runs", "goals"]) +def test_compact_status_newest_first_returns_latest_decision_and_later_work(shape): + rows = list(reversed(_rows())) + history = {"runs": rows} if shape == "runs" else {"goals": [{"id": "evidence-goal", "latest_runs": rows}]} + context = project_replan_context(goal_id="evidence-goal", agent_id="agent-a", runs=(), + source_status={"run_history": history}, stride_strategy="evidence_conditioned_v1") + assert _assert_followthrough(context)["source_history_complete"] is False + + +def test_named_newest_first_builder_preserves_order_without_a_status_source(): + context = build_replan_context({"obligation_id": "replan-fixture"}, goal_id="evidence-goal", + agent_id="agent-a", newest_first_runs=reversed(_rows()), stride_strategy="evidence_conditioned_v1") + _assert_followthrough(context) + + +def test_real_append_index_ignores_compact_display_order_and_clock_skew(tmp_path): + registry = tmp_path / "registry.json" + registry.write_text(json.dumps({"goals": [{"id": "evidence-goal", "repo": str(tmp_path)}]})) + index = tmp_path / "goals/evidence-goal/runs/index.jsonl" + index.parent.mkdir(parents=True) + index.write_text("".join(json.dumps(row) + "\n" for row in _rows())) + before = index.read_bytes() + context = project_replan_context(goal_id="evidence-goal", agent_id="agent-a", runs=(), + source_status={"registry": str(registry), "runtime_root": str(tmp_path), + "run_history": {"runs": [_rows()[0]]}}, stride_strategy="evidence_conditioned_v1") + assert _assert_followthrough(context)["source_history_complete"] is True + assert index.read_bytes() == before + + +@pytest.mark.parametrize("rows", [_rows(), list(reversed(_rows()))]) +def test_unknown_order_does_not_fabricate_a_previous_decision_or_later_work(rows): + context = project_replan_context(goal_id="evidence-goal", agent_id="agent-a", runs=rows, + stride_strategy="evidence_conditioned_v1") + assert "decision_followthrough" not in context + assert context["evidence_count"] == 3 + + +def test_carrier_metadata_preserves_feature_off_parity_and_rejects_non_boolean_order(): + rows = list(reversed(_rows())) + ordinary = project_replan_context(goal_id="evidence-goal", agent_id="agent-a", runs=rows) + declared = project_replan_context(goal_id="evidence-goal", agent_id="agent-a", runs=rows, + history_newest_first=True, stride_strategy="off") + assert declared == ordinary + for invalid in [0, 1, "newest_first"]: + with pytest.raises(ValueError, match="boolean or unknown"): + project_replan_context(goal_id="evidence-goal", agent_id="agent-a", runs=rows, + history_newest_first=invalid) From 54ad7c9086895a30ea22a76a50398830c0ae4821 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 12 Oct 2026 16:18:03 +0800 Subject: [PATCH 7/7] docs(replan): distinguish append, compact and unknown history order Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../protocols/goal-vision-replan-contract-v0.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/reference/protocols/goal-vision-replan-contract-v0.md b/docs/reference/protocols/goal-vision-replan-contract-v0.md index 8740b44a40..8cca555ae0 100644 --- a/docs/reference/protocols/goal-vision-replan-contract-v0.md +++ b/docs/reference/protocols/goal-vision-replan-contract-v0.md @@ -270,7 +270,11 @@ With `evidence_conditioned_v1` enabled, when the captured history contains a pri accepted evidence-linked Vision path, `replan_context.decision_followthrough` returns that path with the later recorded progress references. It uses the existing Goal/Agent/Turn binding and immutable -history append order; timestamps do not decide causality. An explicit current +history source order; timestamps do not decide causality. The full local index +supplies append positions. Compact newest-first carriers and the named +`newest_first_runs` builder reverse those positions without reordering ordinary +evidence. Arbitrary iterables with unknown order supply no causal positions and +therefore no decision-followthrough claim. An explicit current Goal instance excludes retired-instance sources. The normal history read resolves its evidence references; private transport facts are not returned. The derived `replan-decision-*` reference binds the normalized path and its original @@ -287,7 +291,9 @@ missing, rejected or malformed basis adds no followthrough projection. No selection, trigger, quota, acceptance, lease or scheduler rule changes. 启用 `evidence_conditioned_v1` 且历史中已有被接受、绑定证据的 Vision 路线时,replan context 返回上次决定与之后的 -进度引用,按原历史追加顺序关联,而非根据时间戳或文案猜测因果。显式当前 Goal +进度引用,按合格来源的顺序关联,而非根据时间戳或文案猜测因果。完整本地索引提供 +追加位置;已知最新在前的紧凑载体与 `newest_first_runs` 入口转换位置,保留普通 +证据原顺序。顺序未知的 iterable 不提供因果位置,也不生成决定接续投影。显式当前 Goal 实例排除已退休实例。详情最多六项,保留总数、遗漏数、源完整性与顺序缺失数; 正常 history 入口可读取引用,私有 transport facts 不公开。这些是记录中的观测, 不等于有效结算 Turn、独立试验或执行/收益证明;后者明确保持 unknown。缺失、