Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
ccaeef3
feat(goals): derive the Goal artifact lifecycle projection
songoow Sep 13, 2026
9841488
fix(goals): keep the lifecycle projection honest at its boundaries
songoow Sep 14, 2026
61631b1
fix(goals): own the lifecycle rules inward and give the projection a …
songoow Sep 14, 2026
4c6024f
test(goals): keep the two Goal projections distinct now that both ship
songoow Sep 14, 2026
eadd07c
fix(goals): derive lifecycle from canonical status and safety boundaries
songoow Sep 15, 2026
9ea4724
fix(goals): keep closeout reachable while a recorded gap stays unreached
songoow Sep 15, 2026
9d04037
fix(goals): require an acceptance verdict before recommending closed
songoow Sep 15, 2026
a516ba6
Merge upstream main into the Goal lifecycle projection branch
songoow Sep 15, 2026
66d961c
fix(goals): consume owned work observations in the lifecycle readout
songoow Sep 15, 2026
4c1f815
docs(goals): explain lifecycle work-observation precedence
songoow Sep 15, 2026
446c8f6
Merge upstream main and regenerate the semantic inventory
songoow Sep 15, 2026
e67775a
fix(goals): keep lifecycle v0 terminal advice out of scope
songoow Sep 15, 2026
33f30d2
docs(goals): define lifecycle advice and work observation coverage
songoow Sep 15, 2026
c9efe80
Merge current main and regenerate the semantic inventory
songoow Sep 15, 2026
d2287a2
Merge main and refresh lifecycle semantic inventory
songoow Sep 16, 2026
a98cb29
Refresh lifecycle branch for the current Turn lane baseline
songoow Sep 16, 2026
d70419e
test(chat): isolate unbound channel fixture from installed runtime
songoow Sep 16, 2026
bb6eaa6
Refresh lifecycle branch and keep main channel fixture
songoow Sep 16, 2026
e2a44d4
Merge remote-tracking branch 'upstream/main' into codex/goal-artifact…
songoow Sep 16, 2026
499c85a
Merge remote-tracking branch 'upstream/main' into codex/goal-artifact…
songoow Sep 16, 2026
aee2796
Merge remote-tracking branch 'upstream/main' into codex/goal-artifact…
songoow Sep 16, 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
49 changes: 48 additions & 1 deletion docs/reference/goal-acceptance-observations.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,36 @@ The proposed [Goal direction baseline](../architecture/rfcs/goal-direction-basel
material declarations and revision-bound usage receipts are not implemented here;
historical progress does not establish that current direction materials were read.

Status also exposes a separate `run_history.goals[].artifact_lifecycle` readout
and Markdown summary: observed phase, evidence milestones, guards and next steps.
It consumes the current Goal's session-runtime work observation before display
trimming. Outstanding required work keeps the phase `qualifying` even when
Todos are complete and historical progress is reached. An absent work observation
does not invent a work requirement. This v0 readout **never recommends a terminal
transition**: `closing` stays a verification step with the machine-readable
`next_transitions[].reason_codes` value `acceptance_unverified`, both when sources
are missing and when all bounded sources were observed. Consumers use that code,
not English `precondition` text. A Goal already recorded as terminal still displays
`lifecycle_phase: closed` with no next transitions. Adding acceptance-driven
terminal advice requires a separate contract change and producer-side validation.
This readout grants no execution or completion authority; the Dashboard card
above keeps its separate acceptance-observation contract.

Work observation coverage follows the supplied projection, not `adapter.kind`:

| Source delivered to status | Work observation coverage |
| --- | --- |
| Session-runtime adapter, or another adapter emitting the same session-runtime projection | Available only with `session_runtime_readonly_projection_v0`, a matching Goal id, and work facts |
| Adapter without that projection, or a projection with a mismatched schema/Goal id | Unavailable; this readout does not query quota or other lane owners |

Without that source a Goal may read `closing` from Todo/history even when a lane
outside the observation still requires work. Neither `closing` nor absence of
`work_lane_selected` proves all work is complete; the lane and completion owners
retain their decisions.

Validation: `python -m pytest tests/control_plane/test_goal_acceptance_observation.py`
and `node examples/dashboard-goal-acceptance-browser-smoke.mjs`. The browser
and `python -m pytest tests/control_plane/test_goal_artifact_work_observation.py`,
plus `node examples/dashboard-goal-acceptance-browser-smoke.mjs`. The browser
check consumes real status collection over a disposable synthetic Goal; set
`LOOPX_GOAL_ACCEPTANCE_PACKAGED=1` after the Dashboard build to check shipped assets.

Expand All @@ -54,5 +82,24 @@ check consumes real status collection over a disposable synthetic Goal; set
不保留把完整协议误认作该观察结构的别名。此切片不增加里程碑声明入口、统一阶段序列、完整证据审计、
新的合法迁移或完成判定。Goal direction baseline 提案中的材料声明和绑定版本的阅读回执
不在此次实现范围;历史进展不能证明已阅读当前方向材料。旧来源不提供投影时显示不可用。
status 同时在独立的 `run_history.goals[].artifact_lifecycle` 和 Markdown 摘要中展示
观测阶段、证据里程碑、门禁和下一步。它在展示截断前读取当前 Goal 的 session-runtime
工作观察:即使 Todo 全部完成且历史进展已达成,只要仍有必须执行的工作,阶段就保持
`qualifying`。缺少工作观察不会凭空产生执行要求。此 v0 读出**始终不建议终态迁移**:
`closing` 保持为验收核验步骤,无论是否缺少来源,均通过
`next_transitions[].reason_codes` 中的 `acceptance_unverified` 表达本读出未验证验收。
机器消费者读取该 code,无需匹配英文 `precondition`。已记录为终态的 Goal 仍展示
`lifecycle_phase: closed`,下一步列表为空。未来若增加基于验收的终态建议,必须另行变更合同并验证产出侧。
此读出不授予执行或完成权威,Dashboard 卡片仍使用独立的验收观察合同。

工作观察覆盖取决于实际提供的投影,不按 `adapter.kind` 名称判断:

| status 接收的来源 | 工作观察覆盖 |
| --- | --- |
| session-runtime adapter,或提供相同 session-runtime 投影的其它 adapter | schema 为 `session_runtime_readonly_projection_v0`、Goal id 匹配且包含工作事实时可用 |
| 不提供该投影的 adapter,或 schema/Goal id 不匹配的投影 | 不可用;此读出不会额外查询 quota 或其它工作通道权威 |

缺少该来源时,即使观察范围外仍有必须执行的工作,Todo/历史也可能让 Goal 显示 `closing`。
`closing` 或缺少 `work_lane_selected` 均不证明所有工作完成,工作通道与完成权威仍保留各自的判断。
上面的测试命令覆盖合成 Goal 的生产 refresh-state 写入、
真实 status 收集和浏览器入口;打包验证使用 `LOOPX_GOAL_ACCEPTANCE_PACKAGED=1`。
Loading
Loading