Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
685538d
test(smoke): initialize canonical inputs before public CLI reads
loopx-agent Oct 27, 2026
78cd222
test(bootstrap): check review obligations instead of retired wording
loopx-agent Oct 27, 2026
9ae2233
Merge remote-tracking branch 'origin/main' into codex/release220-publ…
loopx-agent Oct 27, 2026
9fe8e20
test(smoke): use canonical research and portfolio fixtures
loopx-agent Oct 27, 2026
833757c
test(smoke): prepare canonical status and identity sources explicitly
loopx-agent Oct 27, 2026
6bb480c
test(smoke): initialize portfolio and Host identity authority
loopx-agent Oct 27, 2026
3c2dc58
test(smoke): retain retired-value diagnostics within the hard-cut scan
loopx-agent Oct 27, 2026
859eeaf
test(smoke): compare reconnect facts independently of validated read …
loopx-agent Oct 27, 2026
51edba8
Merge remote-tracking branch 'origin/main' into codex/release220-publ…
loopx-agent Oct 27, 2026
9d42c6d
test(status): prepare and advance public status fixtures through cano…
loopx-agent Oct 27, 2026
ddf60d3
Merge remote-tracking branch 'origin/main' into codex/release220-publ…
loopx-agent Oct 27, 2026
b67b59d
test(status): keep current canonical work primary after progress read…
loopx-agent Oct 27, 2026
fa674f1
test(status): distinguish an empty canonical user lane from sibling g…
loopx-agent Oct 27, 2026
2651854
test: import public smoke authority before readback and settlement
loopx-agent Oct 27, 2026
b9e679d
test: keep split-runtime and lifecycle smokes on admitted authority
loopx-agent Oct 27, 2026
54c5998
test: isolate runtime imports and preserve scoped Todo visibility
loopx-agent Oct 27, 2026
99c0ba5
test: qualify public projection fixtures on canonical authority
loopx-agent Oct 27, 2026
d1876d5
test: distinguish migration refusals from canonical empty projections
loopx-agent Oct 27, 2026
e9f9f4e
test: keep a stale display separate from canonical projection availab…
loopx-agent Oct 27, 2026
6f64097
docs: reconcile machine settings discovery with shipped defaults
loopx-agent Oct 27, 2026
d38b1e6
test: bind managed Host and extension fixtures to canonical Goals
loopx-agent Oct 27, 2026
c6efa3b
test: retain refusal and source identity across public readback fixtures
loopx-agent Oct 27, 2026
d095c82
test: distinguish routed reads from explicit authority overrides
loopx-agent Oct 27, 2026
c5a638c
test: assert the typed refused quota decision before health projection
loopx-agent Oct 27, 2026
0e63917
test: initialize canonical onboarding and explore CLI fixtures
loopx-agent Oct 27, 2026
d008b0a
Merge remote-tracking branch 'refs/remotes/release-followthrough/main…
loopx-agent Oct 27, 2026
6c74495
test: retain current local-path redaction in Chat smokes
loopx-agent Oct 27, 2026
d171470
test: qualify canonical migration and path-delta smoke boundaries
loopx-agent Oct 27, 2026
da0bc22
test: preserve explicit source refusal and canonical manager journeys
loopx-agent Oct 27, 2026
47a8a4e
test: refuse ownership claims from display-only channel samples
loopx-agent Oct 27, 2026
349a446
Merge remote-tracking branch 'refs/remotes/release-public/main' into …
loopx-agent Oct 27, 2026
992f9bc
test: refresh final source-route and documentation fixture readbacks
loopx-agent Oct 27, 2026
00362ee
test: verify all packaged Chat entry stylesheets
loopx-agent Oct 27, 2026
9da9a11
test: encode canonical fixture subprocess input as UTF-8
loopx-agent Oct 27, 2026
f872fbc
Merge remote-tracking branch 'refs/remotes/release-public-final/main'…
loopx-agent Oct 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/architecture/rfcs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ appendix may keep dated history, but no dated log heading may precede it.
| [RFC: Shared Goal Alignment and Governed Amendment Protocol (v0)](shared-goal-alignment-and-governed-amendment-v0.md) | Accepted | none | [2 entries](ledger/shared-goal-alignment-and-governed-amendment-v0/) |
| [RFC: LoopX Shared Control-Plane Authority and Pluggable State Providers (v0)](shared-goal-authority-state-provider-v0.md) | Accepted | none | [24 entries](ledger/shared-goal-authority-state-provider-v0/) |
| [RFC: Single-Owner Local Daemon (v0)](single-owner-local-daemon-v0.md) | Accepted | none | — |
| [RFC: TypeScript Control-Plane Migration Direction v0](typescript-control-plane-migration-v0.md) | Accepted | none | [15 entries](ledger/typescript-control-plane-migration-v0/) |
| [RFC: TypeScript Control-Plane Migration Direction v0](typescript-control-plane-migration-v0.md) | Accepted | none | [16 entries](ledger/typescript-control-plane-migration-v0/) |

## Superseded (1)

Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/rfcs/STATUS.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
| [RFC:共享 Goal 对齐与受治理 Amendment 协议(v0)](shared-goal-alignment-and-governed-amendment-v0.zh-CN.md) | 已接受 | 无 | [2 条](ledger/shared-goal-alignment-and-governed-amendment-v0/) |
| [RFC:LoopX 共享控制面权威与可插拔状态 Provider(v0)](shared-goal-authority-state-provider-v0.zh-CN.md) | 已接受 | 无 | [24 条](ledger/shared-goal-authority-state-provider-v0/) |
| [RFC: Single-Owner Local Daemon (v0)](single-owner-local-daemon-v0.md) | 已接受 | none | — |
| [RFC:LoopX 控制面 TypeScript 渐进迁移方向 v0](typescript-control-plane-migration-v0.zh-CN.md) | 已接受 | 无 | [15 条](ledger/typescript-control-plane-migration-v0/) |
| [RFC:LoopX 控制面 TypeScript 渐进迁移方向 v0](typescript-control-plane-migration-v0.zh-CN.md) | 已接受 | 无 | [16 条](ledger/typescript-control-plane-migration-v0/) |

## 已被替代 (1)

Expand Down
15 changes: 12 additions & 3 deletions docs/concepts/interaction-pattern-catalog.md
Original file line number Diff line number Diff line change
Expand Up @@ -1211,13 +1211,14 @@ main blocker or keeps following a stale local-only benchmark staging todo.
**Trigger**

- a typed machine-configuration namespace is about to change; the built-in
namespaces are `change_quality_qualification`, `codex_chat`, `goal_storage`,
`manager_runtime`, `periodic_report`, `pull_request_review`,
namespaces are `change_quality_qualification`, `codex_chat`, `context_delivery`,
`explore_harness`, `goal_storage`, `manager_runtime`, `periodic_report`, `pull_request_review`,
`steward_executor`, and `todo_replan_cadence`. The public catalog returned by
`loopx machine-config describe` is authoritative, so this inventory has to stay
complete rather than approximate;
- `goal_storage` carries the storage target a newly created Goal is fixed to
(`new_goal_provider`, `file` by default or `sqlite` after reviewed promotion).
(`new_goal_provider`, canonical `sqlite` with hard leases by default; explicit
`file` and soft-claim creation choices remain available).
It does not promote existing Goals or migrate their data, and existing Goals
keep the selection they were created with; see
`docs/reference/local-authority-provider-selection.md`;
Expand All @@ -1227,6 +1228,14 @@ main blocker or keeps following a stale local-only benchmark staging todo.
attached Agent, or a LoopX Agent Loop, and it grants no permissions and
stores no credentials; see
`docs/integrations/session-runtime-control-plane-adapter.md#projection-boundary`;
- `context_delivery` controls differential native Codex context (`off` by default).
A saved preference neither proves host readiness nor actual delta use; known
context loss keeps full context and unsupported declarations refuse. It grants
no execution authority; see `docs/reference/required-work-context.md#machine-default`;
- `explore_harness` sets the default exploration mode (`off` by default) for new
and existing Goals; explicit Goal modes take precedence. Planning supplies
evidence and read-only guidance, while execution authority stays separate;
see `loopx/capabilities/explore/README.md#machine-default`;
- `pull_request_review` carries `review_order` (`forward` by default, or
`reverse`) and Goal-owned `agent_orders` for registered Agent overrides.
Commands resolve explicit direction, Agent, Goal, then machine; reverse inverts
Expand Down
4 changes: 4 additions & 0 deletions examples/agent-diagnose-packet-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,8 @@ def write_agent_scoped_registry(root: Path, runtime: Path) -> Path:
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry, SCOPED_GOAL_ID, provider="sqlite")
return registry


Expand Down Expand Up @@ -302,6 +304,8 @@ def write_capability_scoped_registry(root: Path, runtime: Path) -> Path:
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry, CAPABILITY_GOAL_ID, provider="sqlite")
return registry


Expand Down
3 changes: 3 additions & 0 deletions examples/auto-research-rollout-readpath-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,9 @@ def main() -> None:
encoding="utf-8",
)

from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry, GOAL_ID, provider="sqlite")

packet_path = temp / "packet.json"
contract, dev, holdout = write_contract_and_results(temp)
packet_path.write_text(
Expand Down
4 changes: 3 additions & 1 deletion examples/blocker-push-runtime-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def write_fixture(root: Path) -> tuple[Path, Path, Path, Path]:
registry.write_text(
json.dumps(
{
"runtime_root": str(runtime_root),
"common_runtime_root": str(runtime_root),
"goals": [
{
"id": GOAL_ID,
Expand All @@ -89,6 +89,8 @@ def write_fixture(root: Path) -> tuple[Path, Path, Path, Path]:
encoding="utf-8",
)
append_state_refreshed_run(runtime_root)
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry, GOAL_ID, provider="sqlite")
return registry, runtime_root, project, state_file


Expand Down
12 changes: 10 additions & 2 deletions examples/bootstrap-command-pack-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ def write_connected_goal_fixture(
json.dumps(
{
"schema_version": "0.1",
"common_runtime_root": str(project / ".loopx" / "runtime"),
"goals": [
{
"id": goal_id,
Expand All @@ -123,7 +124,10 @@ def write_connected_goal_fixture(
+ "\n"
)
registry.write_text(registry_text, encoding="utf-8")
return {registry: registry_text, state_file: state_text}
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry, goal_id, provider="sqlite")
return {registry: registry.read_text(encoding="utf-8"),
state_file: state_file.read_text(encoding="utf-8")}


def assert_fixture_unchanged(snapshot: dict[Path, str]) -> None:
Expand Down Expand Up @@ -946,7 +950,11 @@ def test_skill_slash_fallback_contract() -> None:
assert "`review_groups`" in pr_review_skill_text
assert "ranked actionable `review_sequence`" in pr_review_skill_text
assert "must not appear in `review_sequence`" in pr_review_skill_text
assert "complete Chinese five-block review" in pr_review_normalized
for section in ("动机 / Motivation", "改动思路 / Approach", "具体改动 / Changes",
"对主干的风险 / Risks", "我的整体评价 / Verdict"):
assert section in pr_review_skill_text
assert "Chinese prose" in pr_review_skill_text
assert "English verdict:" in pr_review_skill_text
assert "capability owns review depth, evidence requirements" in pr_review_normalized


Expand Down
16 changes: 14 additions & 2 deletions examples/codex-app-thread-agent-identity-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ def main() -> None:
)
runtime = root / "runtime"
runtime.mkdir()
from loopx.control_plane.testing.canary_harness import import_fixture_authority
config = json.loads(registry.read_text(encoding="utf-8"))
config["common_runtime_root"] = str(runtime)
registry.write_text(json.dumps(config), encoding="utf-8")
import_fixture_authority(registry, "goal", provider="sqlite")
global_payload = json.loads(registry.read_text(encoding="utf-8"))
global_payload["registry_role"] = "global-local"
global_payload["goals"][0]["source_registry"] = str(registry)
Expand Down Expand Up @@ -163,8 +168,15 @@ def main() -> None:
goal_text="start another task",
)
gate = unbound["guided_transaction"]["identity_selection_gate"]
assert gate["default_action"] == "select_agent_identity", gate
assert gate["fresh_agent_registration"] is None, gate
assert gate["default_action"] == "register_fresh_agent", gate
registration = gate["fresh_agent_registration"]
assert registration["mode"] == "register_fresh_agent"
assert registration["recommended"] is True
assert registration["continuation_contract"]["requires_execute_result"] is True
assert registration["continuation_contract"]["required_result"] == {
"ok": True, "changed": True, "written": True,
"global_sync": {"ok": True}, "registration_readback": {"verified": True},
}
assert {choice["agent_id"] for choice in gate["choices"]} == {
"codex-a",
"codex-b",
Expand Down
6 changes: 5 additions & 1 deletion examples/contract-reward-overlay-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ def write_fixture(root: Path) -> tuple[Path, Path, Path]:
registry.write_text(
json.dumps(
{
"runtime_root": str(runtime_root),
"common_runtime_root": str(runtime_root),
"goals": [
{
"id": "reward-overlay-goal",
Expand Down Expand Up @@ -206,6 +206,10 @@ def write_fixture(root: Path) -> tuple[Path, Path, Path]:
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority

for record in json.loads(registry.read_text())["goals"]:
import_fixture_authority(registry, record["id"], provider="sqlite")
return registry, runtime_root, project


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ def write_fixture(root: Path) -> tuple[Path, Path, Path, Path]:
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry_path, GOAL_ID, provider="sqlite")
return registry_path, runtime, project, state_path


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
)
from loopx.cli import build_parser # noqa: E402
from loopx.control_plane.quota.usage_summary import is_automation_run # noqa: E402
from loopx.control_plane.testing.canary_harness import import_fixture_authority # noqa: E402
from loopx.control_plane.scheduler.automation_liveness import ( # noqa: E402
build_automation_liveness,
)
Expand Down Expand Up @@ -303,6 +304,7 @@ def main() -> int:
global_registry.parent.mkdir(parents=True)
state_file.write_text("# Active State\n\n## Agent Todo\n", encoding="utf-8")
registry = {
"common_runtime_root": str(root / "runtime"),
"goals": [
{
"id": "multi-agent-goal",
Expand All @@ -323,6 +325,9 @@ def main() -> int:
}
serialized_registry = json.dumps(registry)
project_registry.write_text(serialized_registry, encoding="utf-8")
import_fixture_authority(project_registry, "multi-agent-goal", provider="sqlite")
registry = json.loads(project_registry.read_text(encoding="utf-8"))
serialized_registry = json.dumps(registry)
global_registry.write_text(serialized_registry, encoding="utf-8")
cli_bin = str(REPO_ROOT / "scripts" / "loopx")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def write_fixture(root: Path) -> tuple[Path, Path]:
registry.write_text(
json.dumps(
{
"runtime_root": str(runtime_root),
"common_runtime_root": str(runtime_root),
"goals": [
{
"id": GOAL_ID,
Expand Down Expand Up @@ -131,6 +131,9 @@ def write_fixture(root: Path) -> tuple[Path, Path]:
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority

import_fixture_authority(registry, GOAL_ID, provider="sqlite")
return registry, runtime_root


Expand Down
19 changes: 18 additions & 1 deletion examples/control_plane/peer-agent-hard-cut-boundary-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@
LEGACY_STABLE_IDENTIFIERS = ("showcase-side-agent-self-iteration",)


def hierarchy_scan_line(path: Path, line: str) -> str:
# The source decoder diagnoses these retired values; it never admits them.
if (path == REPO_ROOT / "loopx/control_plane/todos/read_codec.ts"
and line.strip() == '["removed_continuation_policy", ["primary_review", "review_handoff"]]] as const) {'):
return line.replace('"primary_review"', '').replace('"review_handoff"', '')
# This accepted RFC names native session roles, not Agent hierarchy.
if (path == REPO_ROOT / "docs/architecture/rfcs/controller-executor-unified-contract-v0.md"
and line.strip() == 'the current single Agent-scoped slot. One controller owns control dialogue;'):
return line.replace("controller owns", "native session role owns")
return line


def candidate_files() -> list[Path]:
files = list(SCAN_FILES)
for root in SCAN_ROOTS:
Expand All @@ -72,13 +84,18 @@ def main() -> int:
for domain_term in ("primary_reviewers", "primary_review_score"):
assert not LEGACY_PATTERN.search(domain_term), domain_term

decoder = REPO_ROOT / "loopx/control_plane/todos/read_codec.ts"
assert LEGACY_PATTERN.search(hierarchy_scan_line(decoder, 'const policy = "primary_review";'))
assert LEGACY_PATTERN.search(hierarchy_scan_line(REPO_ROOT / "other.ts",
'["removed_continuation_policy", ["primary_review", "review_handoff"]]] as const) {'))

violations: list[str] = []
for path in candidate_files():
if path in ALLOWED_LEGACY_PATHS:
continue
text = path.read_text(encoding="utf-8")
for line_number, line in enumerate(text.splitlines(), start=1):
scan_line = line
scan_line = hierarchy_scan_line(path, line)
for identifier in LEGACY_STABLE_IDENTIFIERS:
scan_line = scan_line.replace(identifier, "")
if LEGACY_PATTERN.search(scan_line):
Expand Down
6 changes: 6 additions & 0 deletions examples/control_plane/peer-supervisor-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,12 @@ def main() -> int:
encoding="utf-8",
)

from loopx.control_plane.testing.canary_harness import import_fixture_authority
config = json.loads(registry_path.read_text(encoding="utf-8"))
config["common_runtime_root"] = str(root / "runtime")
registry_path.write_text(json.dumps(config), encoding="utf-8")
import_fixture_authority(registry_path, GOAL_ID, provider="sqlite")

assert peer_supervisor_for_goal(read_goal(registry_path)) is None

preview = configure_goal(
Expand Down
17 changes: 17 additions & 0 deletions examples/control_plane/quota-spend-workspace-causality-smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ def write_goal_fixture(
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority

import_fixture_authority(registry_path, GOAL_ID, provider="sqlite")
return registry_path


Expand Down Expand Up @@ -233,6 +236,14 @@ def main() -> None:
# worktree. An explicit causal path preserves the delivery identity
# without persisting that local path.
split_runtime = root / "split-runtime"
# This second owned runtime is a separate canonical authority, not a
# Markdown fallback selected by the override. Import its source once.
split_registry = root / "split-registry.json"
split_source = json.loads(registry_path.read_text())
split_source["common_runtime_root"] = str(split_runtime)
split_registry.write_text(json.dumps(split_source))
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(split_registry, GOAL_ID, provider="sqlite")
with working_directory(delivery):
split_refresh = refresh_state_run(
registry_path=registry_path,
Expand Down Expand Up @@ -279,6 +290,12 @@ def main() -> None:
explicit_preview
)

invalid_runtime = root / "invalid-runtime"
invalid_source = {**split_source, "common_runtime_root": str(invalid_runtime)}
invalid_registry = root / "invalid-registry.json"
invalid_registry.write_text(json.dumps(invalid_source))
import_fixture_authority(invalid_registry, GOAL_ID, provider="sqlite")

# An explicit canonical path cannot bless a peer delivery. Omitting the
# override retains the existing fail-closed recorded-history behavior.
with working_directory(delivery):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ def write_fixture(root: Path) -> tuple[Path, Path, Path]:
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority

import_fixture_authority(registry_path, GOAL_ID, provider="sqlite")
return registry_path, runtime, project


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ def write_fixture(root: Path) -> tuple[Path, Path, Path]:
+ "\n",
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry_path, GOAL_ID, provider="sqlite")
return registry_path, runtime, project


Expand Down
14 changes: 14 additions & 0 deletions examples/control_plane/review_packet_cli_fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,8 @@ def write_planned_registry(root: Path) -> Path:
),
encoding="utf-8",
)
from loopx.control_plane.testing.canary_harness import import_fixture_authority
import_fixture_authority(registry_path, GOAL_ID, provider="sqlite")
return registry_path


Expand Down Expand Up @@ -245,6 +247,18 @@ def mark_owner_review_todo_done(root: Path) -> None:
encoding="utf-8",
)

from loopx.control_plane.coordination.local_authority import read_canonical_todos_if_promoted
from loopx.control_plane.coordination.runtime_shadow import build_todo_runtime_shadow_projection
from loopx.control_plane.testing.canary_harness import advance_fixture_authority
current = read_canonical_todos_if_promoted(runtime_root=root / "runtime", goal_id=GOAL_ID)
reviews = [row for row in current["todos"]
if row["role"] == "user" and row["text"] == "Read owner review worksheet first."]
assert len(reviews) == 1, reviews
reviews[0].update(status="done", done=True)
advance_fixture_authority(root / "runtime", GOAL_ID,
build_todo_runtime_shadow_projection(goal_id=GOAL_ID, todos=current["todos"], handoff_mode="soft_claim"),
operation_id="owner-review-completed")


def run_cli(root: Path, registry_path: Path, *args: str) -> subprocess.CompletedProcess[str]:
return subprocess.run(
Expand Down
Loading
Loading