@tea-agent/loop-agent 0.16.0 → 0.16.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +3 -55
- package/README.md +1 -1
- package/dist/application/evaluation/candidate.js +6 -23
- package/dist/application/evaluation/types.js +0 -522
- package/dist/cli/command-definitions.js +3 -19
- package/dist/commands/eval.js +13 -1176
- package/dist/commands/init.js +1 -4
- package/dist/executors/dag-pi-executor.js +44 -4
- package/dist/worker/delivery/verification-bundle.js +2 -13
- package/dist/worker/feature/review.js +2 -3
- package/dist/worker/outcomes/adapters.js +1 -4
- package/dist/worker/outcomes/gate.js +11 -10
- package/dist/worker/outcomes/projector.js +1 -10
- package/dist/worker/outcomes/types.js +0 -3
- package/dist/worker/run-task/run-task.js +4 -23
- package/dist/worker/task-graph/ready-planner.js +8 -14
- package/dist/worker/task-graph/task-graph-schema.js +3 -5
- package/dist/workflows/dag/init-hybrid.js +3 -2
- package/dist/workflows/dag/knowledge-curator.js +0 -3
- package/dist/workflows/dag/node-execution.js +4 -11
- package/dist/workflows/dag/prompt.js +1 -1
- package/dist/workflows/dag/runner.js +16 -43
- package/dist/workflows/dag/skill-snapshot.js +7 -11
- package/dist/workflows/dag/types.js +1 -18
- package/docs/init-surface.manifest.json +0 -3
- package/docs/templates/agent-dag.schema.json +5 -0
- package/docs/templates/product-line/AGENTS.md +0 -1
- package/docs/templates/product-line/README.md +0 -17
- package/docs/templates/product-line/acceptance.yaml +0 -9
- package/docs/templates/product-line/task-graph.yaml +0 -8
- package/docs/templates/product-line/task.yaml +0 -4
- package/package.json +1 -1
- package/skills/frontend-implementation/references/node-contracts.md +2 -2
- package/skills/loop-agent/references/hybrid-dag.md +1 -1
- package/dist/application/evaluation/alias.js +0 -184
- package/dist/application/evaluation/budget.js +0 -192
- package/dist/application/evaluation/campaign-hash.js +0 -47
- package/dist/application/evaluation/campaign-matrix.js +0 -372
- package/dist/application/evaluation/campaign-scorecard.js +0 -135
- package/dist/application/evaluation/campaign.js +0 -370
- package/dist/application/evaluation/corpus-hash.js +0 -38
- package/dist/application/evaluation/corpus.js +0 -56
- package/dist/application/evaluation/experiment.js +0 -294
- package/dist/application/evaluation/ignition.js +0 -198
- package/dist/application/evaluation/integrity-audit.js +0 -162
- package/dist/application/evaluation/outer-loop.js +0 -132
- package/dist/application/evaluation/pi-cell-executor.js +0 -39
- package/dist/application/evaluation/private-verifier.js +0 -46
- package/dist/application/evaluation/promotion-policy.js +0 -151
- package/dist/application/evaluation/proposer.js +0 -98
- package/dist/infrastructure/evaluation/alias-store.js +0 -199
- package/dist/infrastructure/evaluation/campaign-store.js +0 -154
- package/dist/infrastructure/evaluation/corpus-store.js +0 -181
- package/dist/infrastructure/evaluation/experiment-store.js +0 -124
- package/dist/infrastructure/evaluation/ignition-store.js +0 -82
- package/dist/infrastructure/evaluation/private-verifier-store.js +0 -145
- package/dist/infrastructure/evaluation/proposer-store.js +0 -78
- package/dist/worker/outcomes/evidence-tokens.js +0 -29
- package/dist/workflows/dag/budget-enforcement.js +0 -67
- package/dist/workflows/dag/context-policy.js +0 -137
- package/docs/templates/evaluation/campaign-budget-v1.json +0 -12
- package/docs/templates/evaluation/campaign-dogfood-v0.json +0 -24
- package/docs/templates/evaluation/campaign-evidence-v1.json +0 -44
- package/docs/templates/evaluation/context-policy-baseline-v1.json +0 -17
- package/docs/templates/evaluation/context-policy-role-specialized-v1.json +0 -28
- package/docs/templates/evaluation/corpus-dogfood-v0.manifest.json +0 -118
- package/docs/templates/evaluation/matrix-dag-dry-run-v1.json +0 -21
- package/docs/templates/evaluation/matrix-fixture-v1.json +0 -10
- package/docs/templates/evaluation/private-verifier-dogfood-v0.json +0 -16
- package/docs/templates/product-line/feature.yaml +0 -11
package/AGENTS.md
CHANGED
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
- `src/`:loop-agent 运行时代码
|
|
74
74
|
- `test/`:Vitest 测试套件
|
|
75
75
|
- `bin/loop-agent.js`:CLI 可执行入口
|
|
76
|
-
- `skills/`:loop-agent 源仓库和 npm 包内置 skill 指令与参考资料;目标项目初始化后只生成 `.agents/skills/`,不再生成根 `skills/`。初始化还会向目标项目 `.gitignore` 合并 loop-agent managed block,忽略 `.harness/tasks/*`、`.harness/dag-runs/*`、`.harness/runs/*`、`.harness/
|
|
76
|
+
- `skills/`:loop-agent 源仓库和 npm 包内置 skill 指令与参考资料;目标项目初始化后只生成 `.agents/skills/`,不再生成根 `skills/`。初始化还会向目标项目 `.gitignore` 合并 loop-agent managed block,忽略 `.harness/tasks/*`、`.harness/dag-runs/*`、`.harness/runs/*`、`.harness/init-surface.json`、`.harness/task-pool/*`、`.task-pool/`、`.worktrees/` 等运行态事实,但保留 `.harness/prompts/` 和目录占位可共享,不会整目录忽略 `.harness/`。
|
|
77
77
|
- `.harness/`:任务、DAG、run、cache 和 live state 等运行态目录
|
|
78
78
|
- `docs/`:治理文档、计划、报告和模板
|
|
79
79
|
- `website/`:Docusaurus 用户文档站
|
package/CHANGELOG.md
CHANGED
|
@@ -1,44 +1,5 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
-
## [0.16.0] - 2026-07-19
|
|
4
|
-
|
|
5
|
-
### 重点更新
|
|
6
|
-
|
|
7
|
-
- Eval Lab 落地受控评测外环,支持 candidate 矩阵编排、Context Policy A/B dogfood 与 Ignition 研究门禁,全程 autoPromote=false,晋升须人工审核
|
|
8
|
-
- Worker 新增 TaskSpec 显式工作流路由,为四类任务生成带哈希锚定的 Task Outcome,并在晋升前校验 run_record、dag_json 等必需产物
|
|
9
|
-
- 新增 fullstack-v1 Feature Profile,支持确定性结构门禁与 Feature Verification Bundle v1,交付与收尾阶段任一身份漂移或产物篡改均阻断发布
|
|
10
|
-
- Eval Lab 落地固定预算运行时,DagSpec v3 可声明硬预算门禁,超限 fail closed 并输出预算账本,缺失 token 不被当作 0
|
|
11
|
-
|
|
12
|
-
### 新增
|
|
13
|
-
|
|
14
|
-
- Eval Lab 新增 Context Policy A/B dogfood 脚本,串联 corpus/candidate/campaign/scorecard 与人工 promote(默认 dry-run),不改 DAG 默认策略
|
|
15
|
-
- Eval Lab 新增 Ignition 研究门禁命令,记录多代 proposer 并给出趋势 verdict,恒为研究用途,不自动晋升
|
|
16
|
-
- Eval Lab 新增 Corpus 契约命令与 dogfood 样板清单(15 个异质任务,public/private/held_out 齐全)
|
|
17
|
-
- Eval Lab 新增 public/private campaign 与 private-verifier,支持多 seed 可重复计划与 candidate 内容泄漏门禁
|
|
18
|
-
- Eval Lab 新增 anti-hack 审计与 Promotion Policy v1,检测验证弱化与可疑 outlier,promote 须通过多项门禁且默认 dry-run
|
|
19
|
-
- Eval Lab 新增固定预算运行时,支持按节点累计资源消耗,硬门禁超限 fail closed 并写出 budget-ledger
|
|
20
|
-
- Eval Lab 新增可切换 Context Policy(baseline-v1 默认与原先一致,role-specialized-v1 按角色调整预算)
|
|
21
|
-
- 新增 fullstack-v1 dogfood Feature F-2026-005,提供零依赖可运行目标仓与双覆盖验收样板
|
|
22
|
-
- 新增 fullstack-v1 Feature Profile,对 packet 执行确定性结构门禁,未声明 profile 的 legacy packet 行为不变
|
|
23
|
-
- AcceptanceSpec verification 新增可选的实现/验证任务引用、required_evidence 与 integration 声明,保留 legacy 字段兼容
|
|
24
|
-
- TaskGraph 节点新增可选 consumes/produces 声明与 Ready Planner artifact gate,上游产物不可验证时下游阻塞
|
|
25
|
-
|
|
26
|
-
### 改进
|
|
27
|
-
|
|
28
|
-
- TaskSpec 支持可选 execution.workflow,可确定性物化为任务 DAG 类型并展示在 Worker、Task Pool、晨报与 Observe
|
|
29
|
-
- Ready Planner 明确仅做 envelope 级绑定,不重算产物文件 sha256,文件级 hash 在 Outcome projection 与 Feature Verification Bundle 执行
|
|
30
|
-
- DAG 节点 authoring guidance 明确 Pi 是唯一受治理 writer,cursor-prompt 仅作手工 one-shot sidecar
|
|
31
|
-
- Eval Lab propose 与 experiment 命令支持有界提出 experimenting candidate,accept/reject 须通过 scorecard 门禁,不自动改写已接受 skill
|
|
32
|
-
- 文档基线全面校准至 0.15.0,同步半年规划、仓库分析与路线图,harness Pi MED 路由至 grok-4.5
|
|
33
|
-
- Eval Lab dogfood 脚本改为可安全重复运行,并记录 promote --apply 序列供后续分析
|
|
34
|
-
|
|
35
|
-
### 修复
|
|
36
|
-
|
|
37
|
-
- 对齐 Task Outcome 与 Ready Planner 契约:Ready 仅做 envelope 级绑定,Outcome 产物补齐独立 schemaId,失败时写入 outcomeFailure
|
|
38
|
-
- 规范化 shell_verification 为标准 evidence token(兼容旧 shell-verification),未知 outputs.required token 保持兼容不阻塞
|
|
39
|
-
- 清理 0.15.0 版本仍残留在 Unreleased 区块的更新日志条目
|
|
40
|
-
- Eval Lab 运行态(candidate/campaign/scorecard)现被 .gitignore 忽略,旧项目可用 init check-update 刷新 ignore 区块
|
|
41
|
-
|
|
42
3
|
## [0.15.0] - 2026-07-18
|
|
43
4
|
|
|
44
5
|
### 重点更新
|
|
@@ -98,25 +59,12 @@
|
|
|
98
59
|
|
|
99
60
|
## [Unreleased]
|
|
100
61
|
|
|
101
|
-
-
|
|
102
|
-
- Eval Lab 增加可复现 Context Policy A/B dogfood:`bash scripts/eval-dogfood-context-policy-ab.sh` 串联 corpus/candidate/campaign/scorecard 与人工 promote(默认 dry-run);证据见 `docs/reports/2026-07-19-eval-dogfood-context-policy-ab.md`。只演评测协议,不改 DAG 默认 context policy,也不声称自进化成功。
|
|
103
|
-
- Eval Lab 增加 Ignition 研究门禁:`eval ignition record|evaluate|show|list` 记录多代 proposer 并给出趋势 verdict(`insufficient_evidence` / `trend_*` / `inconclusive`)。恒为研究用途:`rsiLevel1ClaimAllowed=false`,从不 auto-promote,也不构成 RSI Level 1 产品承诺。
|
|
104
|
-
- Eval Lab 落地受控外环与 candidate 矩阵:`eval propose from-curate` 有界提出 experimenting candidate;`eval campaign matrix` 支持 dry-run / stub / pi-plan,以及 `--mode pi --dag-template` 的有界 DAG dry-run;`eval outer-loop run` 可串联 propose→campaign→matrix。全程 `autoPromote=false`,晋升仍须人工门禁。
|
|
105
|
-
- Eval Lab 打通 learned guidance 实验路径:`eval experiment from-curate` 将 `knowledge curate` 提案登记为 `experimenting` candidate(写入 `ai_workspace/.../learned-proposal.md`,不改已接受 skill);`accept` 须 campaign scorecard 的 held-out 不回退与 policy 通过,`reject` 保留 pattern 适用范围证据。仍无 auto-promote。
|
|
106
|
-
- Eval Lab 补齐 anti-hack 与 Promotion Policy v1:`eval campaign scorecard|audit` 检测 verification weakening / command 缩减 / 可疑 outlier(只标记人工复核、不自动剔分);`eval promote --campaign-id` 须通过 private 改进、held-out 不回退、预算与安全门禁,并仍默认 dry-run / `--apply` + `--reason`。不自动晋升。
|
|
107
|
-
- Eval Lab 新增 public/private campaign:`eval private-verifier *` 与 `eval campaign create|plan|run`;多 seed 计划可重复(`planHash`),private verifier 仅控制器侧可见并对 candidate 内容做泄漏门禁;held_out 仅作 promotion gate 占位。仍不自动晋升,也不自动跑完整 Pi candidate 矩阵。
|
|
108
|
-
- Eval Lab 落地固定预算运行时:DagSpec v3 可声明 `budget`(hard / record-only),runner 按节点累计 calls/wall/passes/tokens/context,硬门禁超限 fail closed 并写出 `budget-ledger.json` 与 budget report;`eval budget show --run-id` 可只读查看。缺失 token 不会被当成 0。
|
|
109
|
-
- DAG 节点 authoring guidance 改为明确 Pi 是唯一受治理 writer,`cursor-prompt` 仅作手工 one-shot sidecar,不再把 Cursor 写成 first-class executor。
|
|
110
|
-
- Eval Lab 抽出可切换的 Context Policy:`baseline-v1`(默认,行为与原先一致)与 `role-specialized-v1`(按角色调整 upstream/skill 预算);DagSpec 可选 `defaults.contextPolicyId`,`eval context-policy list|show` 可查看策略清单。不含 live campaign 编排。
|
|
111
|
-
- Eval Lab 新增初始 Corpus 契约:`eval corpus register|show|list|validate`,附带可提交样板 `docs/templates/evaluation/corpus-dogfood-v0.manifest.json`(15 个异质任务、public/private/held_out 齐全、每任务 2–3 seed);只冻结评测样本合同与 `corpusHash`,不跑 live campaign。
|
|
112
|
-
- Eval Lab 补齐 incumbent alias 与人工门禁的 promote/rollback:`eval alias show|list`、`eval promote|rollback`(默认 dry-run,`--apply` 才移动别名);只改 alias/decision 事实,不改写 candidate bundle 或已完成 DAG facts;仍无 live campaign、硬预算或自动晋升。
|
|
113
|
-
- 对齐 Task Outcome / Ready Planner 契约:Ready 仅做 envelope 级绑定;Outcome 产物补齐独立 `schemaId`;失败 envelope 写入 `outcomeFailure`;`shell_verification` 为规范 evidence token(兼容旧 `shell-verification`);未知 `outputs.required` token 保持兼容并固化测试。
|
|
114
|
-
- 新增 fullstack-v1 dogfood Feature `F-2026-005`(本地欢迎语端到端样板):显式 `execution.workflow`、验收双覆盖、TaskGraph `produces`/`consumes` 与 Final Verification 入口;并提供可运行目标仓 `dogfood/fullstack-welcome/`(零依赖 Node HTTP + WelcomeBanner + API/e2e/smoke)。`docs/templates/product-line/` 同步补充 `feature.yaml` 与 workflow/双覆盖指引。`F-2026-001`~`004` 仍作 generic/legacy 对照。
|
|
62
|
+
- 修复前端 Mock 策略节点偶尔因解释性前言出现在 `MOCK_STRATEGY:` 之前而被 contract gate 误判失败的问题;节点现在通过显式首行协议生成稳定 canonical 输出,同时保留全局 `first-non-empty` 精确校验和原始 Pi 执行证据。
|
|
115
63
|
- `agent-worker feature verify-final` 现可聚合 hash-bound `backend-test` / `frontend-test` Outcome,生成 Feature Verification Bundle v1;Delivery 与 Closeout 会重新验证 bundle、typed outcome、Feature/Task/workflow/controller identity 和 Delivery HEAD,任一漂移或篡改都会阻止交付。既有 `qa-execute` QA aggregate 继续兼容。
|
|
116
64
|
- 新增 `fullstack-v1` Feature Profile:Feature Packet 可选 `feature.yaml` 声明 profile 与 scope,`agent-worker task validate-feature` 对 `fullstack-v1` packet 执行确定性结构门禁(required backend/frontend/backend-test/frontend-test workflow、frontend-test 依赖实现与后端验证、final-verify 覆盖、测试 workflow 不含产品写路径、writer writeSet 重叠须串行)。fullstack profile 必须有 scope;required AC 必须声明实现、验证与 evidence refs,任一门禁失败 fail closed 并输出阶段缺口与修复建议;未声明 profile 的 generic/legacy packet 行为零变化。
|
|
117
65
|
- AcceptanceSpec `verification` 新增全部 optional 的 `implementation_task_refs`、`verification_task_refs`、`required_evidence`、`integration`(`not-applicable`/`mock-allowed`/`real-required`),保留 legacy `expected_task_refs`,schema 仍为 `.strict()`;Feature review 的 coverage 投影在 dual-mode 下复用 Task Outcome envelope 的 `integrationStatus`:实现 Done 但缺验证 evidence、或 `real-required` 仅由 mock/local 满足时,required AC 派生为 `awaiting-verification`(只读派生,非新状态机),Feature 不得被报告为 deliverable。
|
|
118
|
-
- 为 TaskGraph 节点新增可选 `consumes`/`produces` 声明与 Ready Planner artifact gate:上游 Done
|
|
119
|
-
- Worker 现为四类 TaskSpec workflow 生成 hash-anchored Task Outcome
|
|
66
|
+
- 为 TaskGraph 节点新增可选 `consumes`/`produces` 声明与 Ready Planner artifact gate:上游 Done 但必需产物(路径/sha256/schema/Feature/producer/source binding)不可验证时,下游以 `required-artifact-missing` 阻塞;artifact 资格是额外门禁,priority 不得越过 gate。gate 原因经 `ReadyExecutionPlan.blocked[*].artifactGate` 投影,供 Feature review、晨报与 Observe 共用。
|
|
67
|
+
- Worker 现为四类 TaskSpec workflow 生成 hash-anchored Task Outcome,并在 promotion 前校验 `run_record`、`dag_json`、`shell_verification` 等已知 required output;Feature review、晨报与 Observe 可引用 outcome 证据,缺失或不一致会以 ContractMismatch/EnvFailure 失败收口。
|
|
120
68
|
- TaskSpec 现支持可选 `execution.workflow`,可确定性物化为任务 DAG 类型并展示在 Worker、Task Pool、晨报与 Observe;旧 QA 任务保持原有执行行为,同时给出需人工选择测试 workflow 的迁移提示。
|
|
121
69
|
|
|
122
70
|
## [0.13.0] - 2026-07-18
|
package/README.md
CHANGED
|
@@ -77,7 +77,7 @@ loop-agent init --repo-root <target-repo> --profile full --merge
|
|
|
77
77
|
loop-agent init doctor --repo-root <target-repo>
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
`init instructions` 会输出给模型/Agent 执行完整初始化的指引包,不要求目标项目已有 `harness.json`。默认初始化会 merge 已有 `AGENTS.md`、`harness.json` 和 loop-agent 治理资料,生成语言无关的治理脚本矩阵、中文根 README 入口、`ai_workspace/loop-agent/` 目标项目治理资料、`.agents/skills/` repo-local skills、`harness.json` IDE schema 指引和 `.harness/` 骨架;不会在目标项目根目录生成 `skills/`,也不会把 loop-agent 生成的治理资料写到根 `docs/`。已有 README 会保留用户正文并插入/更新 loop-agent managed block。初始化还会向 `.gitignore` 合并一个 loop-agent managed block(`# LOOP_AGENT_INIT_START/END`),把 `.harness/tasks/*`、`.harness/dag-runs/*`、`.harness/runs/*`、`.harness/
|
|
80
|
+
`init instructions` 会输出给模型/Agent 执行完整初始化的指引包,不要求目标项目已有 `harness.json`。默认初始化会 merge 已有 `AGENTS.md`、`harness.json` 和 loop-agent 治理资料,生成语言无关的治理脚本矩阵、中文根 README 入口、`ai_workspace/loop-agent/` 目标项目治理资料、`.agents/skills/` repo-local skills、`harness.json` IDE schema 指引和 `.harness/` 骨架;不会在目标项目根目录生成 `skills/`,也不会把 loop-agent 生成的治理资料写到根 `docs/`。已有 README 会保留用户正文并插入/更新 loop-agent managed block。初始化还会向 `.gitignore` 合并一个 loop-agent managed block(`# LOOP_AGENT_INIT_START/END`),把 `.harness/tasks/*`、`.harness/dag-runs/*`、`.harness/runs/*`、`.harness/live/`、`.harness/cache/`、`.harness/init-surface.json`、`.harness/task-pool/*`、`.task-pool/`、`.agents/skills/*/node_modules/`、`.worktrees/` 等个人/会话运行态事实和 repo-local skill 本地依赖忽略掉,同时保留 `.harness/prompts/` 和目录占位可共享,不会整目录忽略 `.harness/`,也不会覆盖用户已有的 ignore 规则。
|
|
81
81
|
|
|
82
82
|
新初始化会写入 `.harness/init-surface.json`,记录当前 controller 版本、初始化投影文件 hash 和 manifest hash。已用旧版本初始化的目标项目,可以用下面的维护入口对齐新版本初始化能力:
|
|
83
83
|
|
|
@@ -1,50 +1,33 @@
|
|
|
1
1
|
import { loadManifestInputFromPath, listCandidateIds, materializeManifest, readCandidateRecord, registerCandidateManifest, transitionCandidateLifecycle, } from "../../infrastructure/evaluation/candidate-store.js";
|
|
2
|
-
import { isCandidatePromotionApplied } from "./alias.js";
|
|
3
|
-
async function withPromotionFlag(repoRoot, record) {
|
|
4
|
-
const promotionApplied = await isCandidatePromotionApplied({
|
|
5
|
-
repoRoot,
|
|
6
|
-
candidateId: record.manifest.candidateId,
|
|
7
|
-
});
|
|
8
|
-
return { ...record, promotionApplied };
|
|
9
|
-
}
|
|
10
2
|
export async function registerCandidate(input) {
|
|
11
3
|
const raw = await loadManifestInputFromPath(input.repoRoot, input.manifestPath);
|
|
12
4
|
const manifest = await materializeManifest(input.repoRoot, raw);
|
|
13
|
-
|
|
5
|
+
return registerCandidateManifest({
|
|
14
6
|
repoRoot: input.repoRoot,
|
|
15
7
|
manifest,
|
|
16
8
|
now: input.now,
|
|
17
9
|
});
|
|
18
|
-
return {
|
|
19
|
-
...result,
|
|
20
|
-
record: await withPromotionFlag(input.repoRoot, result.record),
|
|
21
|
-
};
|
|
22
10
|
}
|
|
23
11
|
export async function showCandidate(input) {
|
|
24
|
-
|
|
25
|
-
return withPromotionFlag(input.repoRoot, record);
|
|
12
|
+
return readCandidateRecord(input.repoRoot, input.candidateId);
|
|
26
13
|
}
|
|
27
14
|
export async function listCandidates(input) {
|
|
28
15
|
const ids = await listCandidateIds(input.repoRoot);
|
|
29
16
|
const rows = [];
|
|
30
17
|
for (const candidateId of ids) {
|
|
31
|
-
const record = await
|
|
32
|
-
repoRoot: input.repoRoot,
|
|
33
|
-
candidateId,
|
|
34
|
-
});
|
|
18
|
+
const record = await readCandidateRecord(input.repoRoot, candidateId);
|
|
35
19
|
rows.push({
|
|
36
20
|
candidateId: record.manifest.candidateId,
|
|
37
21
|
bundleHash: record.manifest.bundleHash,
|
|
38
22
|
candidateKind: record.manifest.candidateKind,
|
|
39
23
|
status: record.status,
|
|
40
|
-
promotionApplied:
|
|
24
|
+
promotionApplied: false,
|
|
41
25
|
});
|
|
42
26
|
}
|
|
43
27
|
return rows;
|
|
44
28
|
}
|
|
45
29
|
export async function transitionCandidate(input) {
|
|
46
|
-
|
|
47
|
-
return withPromotionFlag(input.repoRoot, record);
|
|
30
|
+
return transitionCandidateLifecycle(input);
|
|
48
31
|
}
|
|
49
32
|
export function formatCandidateMarkdown(record) {
|
|
50
33
|
const lines = [
|
|
@@ -54,7 +37,7 @@ export function formatCandidateMarkdown(record) {
|
|
|
54
37
|
`- kind: \`${record.manifest.candidateKind}\``,
|
|
55
38
|
`- bundleHash: \`${record.manifest.bundleHash}\``,
|
|
56
39
|
`- parent: \`${record.manifest.parentCandidateId ?? "null"}\``,
|
|
57
|
-
`- promotionApplied:
|
|
40
|
+
`- promotionApplied: \`false\` (registry lifecycle only; no alias/incumbent)`,
|
|
58
41
|
"",
|
|
59
42
|
"## Content refs",
|
|
60
43
|
"",
|