diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1975e0bab3..4216452681 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -184,6 +184,7 @@ touch, mention it in the PR instead of fixing it there. | --- | --- | --- | --- | | `python-tests.yml` | every PR | yes (`merge-gate`) | lint, mypy, sharded pytest, TypeScript core and coverage, minimum Node.js, Windows PowerShell, dashboard presentation | | `dco.yml` | every PR | yes (`Sign-off`) | `Signed-off-by` on contribution commits; verified GitHub-generated two-parent merges are exempt | +| `ci-maintenance.yml` | closed or updated PR (`pull_request_target`, trusted base code only) | no | cancels obsolete Python qualification runs after rechecking the PR and source branch | | `dependency-review.yml` | every PR | no | dependency changes introduced by the PR | | `postgresql-integration.yml` | control-plane or npm lockfile paths | no | PostgreSQL authority store and service on a temporary instance | | `package-smoke.yml` | extension package paths | no | extension packages install, entrypoints, and example schemas | diff --git a/docs/product/release-readiness.md b/docs/product/release-readiness.md index e3fc2afe7d..2c4ae6d07a 100644 --- a/docs/product/release-readiness.md +++ b/docs/product/release-readiness.md @@ -864,6 +864,24 @@ path, and canary route rather than as a user-facing release baseline. SQLite qualification remain unqualified. No paired-version benchmark uplift or isolated Astra causal effect is claimed. +- `v1.4.1` on 2026-10-15: workspace visibility, semantic replan and recovery + hardening at frozen commit `4f27801c4e26fd51246d352eada72c98f8e7e657`. + The [published release](https://github.com/loopx-project/loopx/releases/tag/v1.4.1) + records nineteen bilingual operating entries and concrete community credits. + GitHub/PyPI packages, four desktop installers, the signed macOS update feed, + `desktop-stable`, source `stable`, the website download path and the personal + illustrated guide were independently read back. An actual PyPI + 1.4.0-to-1.4.1 upgrade preserved existing work; package hashes and source bytes + matched the immutable product tag. Reviewed publication-fixture recovery did + not move that tag. At the final source, 515 public smokes and 2,213 affected + Python checks passed, with five explicit native-environment skips; this was + not a fresh full-tree Python sweep. Doubao Evolving/high completed the fixed + 22-scenario, two-repeat portfolio and six contrasts with zero failures or + skips. Mac artifacts retain ad-hoc signing without Apple notarization; + Windows artifacts were verified without native client execution. No paired + benchmark, sustained scientific continuation or isolated model causal uplift + is claimed. + When a new public release is promoted, add it here only after the matching tag, release note, stable ref, update path, and focused release canary agree. diff --git a/docs/reference/contracts/interface-budget-contract.md b/docs/reference/contracts/interface-budget-contract.md index 3c8772e2b7..d29073c8a4 100644 --- a/docs/reference/contracts/interface-budget-contract.md +++ b/docs/reference/contracts/interface-budget-contract.md @@ -80,6 +80,22 @@ Do not abbreviate admission, continuation, scope, safety or settlement instructi solely to fit a historical character count, or copy dynamic quota decisions into the static prompt. +The same two-scope Codex App brief fixture measures 4,284 normalized body +characters on v1.4.1 and 4,447 with the shared stop/readback rule: 163 additional +characters preserve the exact heartbeat target, one attempt, verified stopping, +unconfirmed-result handling and prohibition on work/spend/retry fallback. The +brief presentation allowance becomes 4,600, leaving 153 characters of headroom. +The two original scope paragraphs and current-Turn settlement instructions stay +intact. This is a regression-budget adjustment, not a model context limit or an +execution allowance; all other mode limits, field counts, quota and authority +remain unchanged. The original 4,300-character failure is retained in validation. + +同一 Codex App brief 双范围 fixture 在 v1.4.1 为 4,284 个归一化正文字符,加入共享停止/ +读回规则后为 4,447,增加 163;保留准确停止对象、单次尝试、停止验证、未确认结果处理 +以及禁止 work/spend/retry fallback。brief 展示预算调至 4,600,保留 153 字符余量, +不删除两段原范围与当前 Turn 结算规则。其余模式、字段数、执行配额和权限不变; +原 4,300 上限失败保留,不能将新展示预算称为模型上下文或执行额度提升。 + The earlier readable-peer qualification raised the thin body ceiling from 2,500 to 3,000; those historical measurements follow. On the same real CLI fixture with a host scope and three runtime capabilities, diff --git a/examples/blocker-push-runtime-smoke.py b/examples/blocker-push-runtime-smoke.py index f847f6af4a..a4372be45a 100644 --- a/examples/blocker-push-runtime-smoke.py +++ b/examples/blocker-push-runtime-smoke.py @@ -217,7 +217,8 @@ def main() -> int: # The bootstrap rule is shared from heartbeat.rules after #4201; assert the # current compact sentence instead of the retired per-shell phrasing. assert "reuse the value on retries" in compact_prompt, prompt - assert "guard; 2 stalls->replan" in compact_prompt, prompt + assert "re-enter guard." in compact_prompt, prompt + assert "2 stalls->replan" not in compact_prompt, prompt assert "Exact monitor settlement=no refresh/spend" in compact_prompt, prompt assert "Admitted work: settlement_plan even if artifacts unchanged" in compact_prompt, prompt # The shipped writeback sentence moved to the mixed-language form in the diff --git a/examples/control_plane/control-plane-integrated-canary-smoke.py b/examples/control_plane/control-plane-integrated-canary-smoke.py index 63049aa45b..a784e4f554 100644 --- a/examples/control_plane/control-plane-integrated-canary-smoke.py +++ b/examples/control_plane/control-plane-integrated-canary-smoke.py @@ -31,7 +31,7 @@ CANARY_TODO_ID = "todo_integrated_canary" CANARY_TODO_TITLE = "Design bounded status/quota/review-packet/Todo/read-path canary" SUCCESSOR_TODO_TITLE = "Continue integrated Markdown successor routing canary" -MARKDOWN_CONTINUATION_TITLE = "Continue same-agent markdown continuation through status and quota." +MARKDOWN_CONTINUATION_TITLE = "[P1] Continue same-agent markdown continuation through status and quota." MONITOR_TODO_ID = "todo_integrated_due_monitor" MONITOR_TARGET_KEY = "integrated-due-monitor-watch" VALIDATED_PROGRESS_CLASSIFICATION = "integrated_canary_validated_progress" diff --git a/examples/control_plane/quota-no-git-status-smoke.py b/examples/control_plane/quota-no-git-status-smoke.py index 6cf51ef55d..6ff81a01a5 100644 --- a/examples/control_plane/quota-no-git-status-smoke.py +++ b/examples/control_plane/quota-no-git-status-smoke.py @@ -118,7 +118,7 @@ def main() -> int: ) assert quota.get("status") != "quota_collection_failed", quota assert quota["should_run"] is True, quota - assert quota["recommended_action"] == "Solve the no-git quota fixture.", quota + assert quota["recommended_action"] == "[P1] Solve the no-git quota fixture.", quota return 0 diff --git a/examples/control_plane/runtime-handoff-status-read-path-smoke.py b/examples/control_plane/runtime-handoff-status-read-path-smoke.py index 7ef879820c..8f57342ea3 100644 --- a/examples/control_plane/runtime-handoff-status-read-path-smoke.py +++ b/examples/control_plane/runtime-handoff-status-read-path-smoke.py @@ -206,9 +206,11 @@ def assert_status_read_path( runtime_root=runtime_root, ) item = status_item(payload) - assert item["status"] == POST_HANDOFF_CLASSIFICATION, item + assert item["status"] == "active_state_agent_todo", item + assert item["source"] == "active_state", item + assert item.get("stale_latest_run_warning") is None, item assert item["waiting_on"] == "codex", item - assert item["recommended_action"] == POST_HANDOFF_ACTION, item + assert item["recommended_action"] == f"[P1] {TODO_TITLE}", item assert item["project_asset"]["active_state_next_action"] == GOAL_NEXT_ACTION, item assert item["project_asset"]["latest_validation"]["classification"] == POST_HANDOFF_CLASSIFICATION, item assert item["project_asset"]["latest_validation"]["summary"] == POST_HANDOFF_ACTION, item diff --git a/examples/control_plane/todo-cli-smoke.py b/examples/control_plane/todo-cli-smoke.py index 693129e18f..822b5038ab 100644 --- a/examples/control_plane/todo-cli-smoke.py +++ b/examples/control_plane/todo-cli-smoke.py @@ -22,13 +22,13 @@ GOAL_ID = "todo-cli-goal" -USER_TODO = "Review the owner decision checklist before approving delivery." -SCOPED_USER_GATE = "Choose the side-agent publishing channel before posting externally." -AGENT_TODO = "Summarize the read-only evidence after the user checklist is done." +USER_TODO = "[P1] Review the owner decision checklist before approving delivery." +SCOPED_USER_GATE = "[P1] Choose the side-agent publishing channel before posting externally." +AGENT_TODO = "[P1] Summarize the read-only evidence after the user checklist is done." AGENT_TODO_NOTE = "Start from the public-safe evidence summary." UPDATED_AGENT_TODO_NOTE = "Preserve the validated summary as the handoff context." -UPDATED_AGENT_TODO = "Publish the compact evidence summary after validation passes." -MONITOR_TODO = "Monitor the release-note draft PR until the next scheduled check." +UPDATED_AGENT_TODO = "[P1] Publish the compact evidence summary after validation passes." +MONITOR_TODO = "[P1] Monitor the release-note draft PR until the next scheduled check." MONITOR_DUE_AT = "2026-01-02T00:00:00+00:00" MONITOR_NEXT_DUE_AT = "2026-01-03T00:00:00+00:00" MONITOR_EXPIRES_AT = "2026-01-04T00:00:00+00:00" @@ -299,7 +299,7 @@ def main() -> int: assert "has no coordination.registered_agents" in legacy_claim["error"], legacy_claim assert "Register this peer identity first" in legacy_claim["error"], legacy_claim assert "--registered-agent codex-main-control" in legacy_claim["error"], legacy_claim - wrapped_agent_todo = "- [ ] Summarize the read-only evidence after the user\n checklist is done." + wrapped_agent_todo = "- [ ] [P1] Summarize the read-only evidence after the user\n checklist is done." state_file.write_text( state_file.read_text(encoding="utf-8").replace(f"- [ ] {AGENT_TODO}", wrapped_agent_todo), encoding="utf-8", @@ -351,8 +351,8 @@ def main() -> int: } ], metadata_payload after_metadata = state_file.read_text(encoding="utf-8") - assert after_metadata.count("- [ ] Summarize the read-only evidence after the user") == 1, after_metadata - agent_block_start = after_metadata.index("- [ ] Summarize the read-only evidence after the user") + assert after_metadata.count("- [ ] [P1] Summarize the read-only evidence after the user") == 1, after_metadata + agent_block_start = after_metadata.index("- [ ] [P1] Summarize the read-only evidence after the user") agent_metadata_start = after_metadata.index("