Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Coordinate and recover multi-stage Light research projects through the canonical .light/passport.yaml state, stages 1-13, resident overlays, checkpoints, findings, parallel joins, stale propagation, handoffs and user-authorized reroutes. Use for a new/resumed/partial/dirty/failed/stale/delivered research project; when the user says continue, resume, take over, checkpoint, reroute, recover or deliver; or when work crosses two or more Light research stages. Never turn frontend-design/system-design
.claude/skills/light0305-light-orchestrator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 208% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 214% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 174% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 168% | 0% |
Coordinate, route and recover the research lifecycle. Do not impersonate the stage skills and do not turn a deterministic check into a research judgment.
Read references/orchestrator-resource-map.md before a real lifecycle run. It defines intake, state authority, migration, evidence states, access tiers, resident budget and handoff. Read references/integration-contract.json when changing any role, gate or route. The detailed rationale is ../../docs/design/orchestrator-spec.md.
revision-budget exception, known-limitation conversion or final delivery for the user. Present a recommendation, evidence, alternatives and consequences, then stop.
reroute.py is advisory. Onlypassport.py add-back-edge --authorization-id <user-record> may write a real back-edge, and only after the user authorizes that exact route.
to < from). The 2⊣3 datafeasibility result is an admission_hold, not a back-edge.
light.findings.v1, run_checkpoint.py, its exit code, a fresh timestamp and a content hash.
VERIFIED, PLANNED, UNKNOWN,UNAVAILABLE or FAILED.
silently rerun a stale downstream chain, or silently mark a limitation.
system-design, frontend-design, patent-disclosure and software-copyright have no stage, findings, STAGE_GATES, ROUTES or scientific back-edge.
inventory, hashes, checkpoints, limitations, handoff and user delivery decision.
environment advisory such as r_advisory.requires_user_choice=true, present the choices and consequences; only continue with install/config after an explicit user authorization. Non-interactive runs may choose the documented honest fallback only when the downstream contract does not require that runtime.
Start with:
bashpython scripts/lifecycle.py intake --root <project-root>
Act on the primary state:
| State | Required behavior | |---|---| | new | inspect scope; propose only needed stages; ask at strategic choices | | resume | trust passport/hash/handoff over chat memory; continue next_action | | partial | preserve delivered stages; choose the next dependency-ready node | | dirty | inventory user changes; do not mutate until they are protected | | failed | inspect blocking evidence; run checkpoint/reroute; stop for user | | stale | show the propagated reverify set; rerun only after scope is clear | | delivered | verify the full delivery package; ask the user to accept/deliver |
If multiple flags coexist, treat dirty work as a mutation blocker and failed evidence as a progression blocker. Do not hide either behind the primary label.
.light/passport.yaml is the canonical pipeline state. memory-pm owns project facts, decisions, versions and handoff history around it; a handoff is only a hash-bound pointer.
light.passport.v3.references/passport.schema.json.templates/passport.v3.yaml.state_hash: SHA-256 of canonical state excluding the hash field.inputs_fingerprint: path + file bytes, not mtime.state_revision: increments on every v3 save.For an older passport:
bashpython scripts/passport.py migrate --file .light/passport.yaml # inspect the dry-run and UNKNOWN legacy authorization python scripts/passport.py migrate --file .light/passport.yaml --write
Do not run --write until the user authorizes ledger migration. Migration may mark a legacy back-edge authorization UNKNOWN; it must not invent proof.
1 literature-search → 2 data-engineering and 3 idea-generation → 4 idea-critique → 5 research-plan → 6 experiment-coding → 7 result-analysis.
Stage 7 forks to 8 paper-writing and 9 figure. Stage 8 also feeds 9 figure and 10 citation. Stages 9 and 10 join at 11 typesetting → 12 venue-matching → 13 review-rebuttal.
Dependencies are forward DAG edges. Parallel branches must declare depends_on; a join waits for every required branch. Do not treat list order as dependency order.
Invoke frontend-design or system-design only when the project needs a UI or software architecture. Their outputs may be referenced by the project, but they remain off-DAG and do not produce scientific findings.
Invoke patent-disclosure or software-copyright only when the user explicitly needs IP/material handoff from a real project. They prepare review materials, not legal advice, filings, registration guarantees or scientific findings.
先选择最小充分执行模式,不要把每个任务都升级成多 agent 编排:
bashpython scripts/execution_mode.py --input task-profile.json
输出 light.execution_mode.v1,只做决策、不执行任务:
json{ "complexity": "complex", "path_predictable": false, "subtasks_independent": true, "clear_evaluator": true, "requirements_complete": true, "user_decision_needed": false, "distinct_categories": 3, "budget_allows_parallel": true, "iterative_improvement": false, "human_checkpoints": ["高成本执行前", "最终交付前"] }
布尔字段必须是真正的 JSON true/false;若启用 iterative_improvement,还必须给 max_iterations >= 1,避免无界 evaluator loop。
direct:单步、低风险、无依赖;fixed_workflow:依赖顺序稳定;routed:需先分类再分流;parallel:独立分支且预算允许;orchestrated:动态依赖、需共享状态协调;evaluator_loop:有明确验收器,且预算允许修订。缺少会改变路线的必填信息时返回 UNRESOLVED,并只问一个最有信息量的问题;用户已给足信息时不得为了“互动感”重复询问。
高风险、付费、远程、发布、投稿、删除或不可逆动作先生成 light.decision.v1,再过授权门:
bashpython scripts/decision_checkpoint.py --input decision.json
execution_mode.py enforces this rule by data, not by caller goodwill: even when user_decision_needed=false, a task profile that declares remote execution, paid resources, external writes, publish/submit, delete/overwrite of user work, irreversible action, high risk, private/legal/ethics-sensitive scope, or positive cost must return UNRESOLVED unless it carries a passing light.decision_checkpoint.v1 with an authorization ID. A single boolean must not bypass the authorization gate. Use templates/task-profile.example.json as the fail-closed example.
PROPOSED 返回 UNRESOLVED 并给出唯一关键问题;只有 AUTHORIZED 且授权主体、scope 与风险规则一致才返回 allowed=true。REJECTED/REVOKED/EXPIRED 一律拒绝执行。 本门只核授权,不替用户执行动作。
多任务、并行分支、人工暂停或断点恢复还必须过 workflow ledger:
bashpython scripts/workflow_ledger.py --input templates/workflow-ledger.example.json
light.workflow.ledger.v1 核对 owner/context scope、依赖闭包、join 是否提前、任务证据、 真实 sha256:<64hex>、独立验证包、HITL decision id/scope/question/options/expiry、max_attempts、terminal retry 以及 resume_snapshot.workflow_digest/task_id/visit_count/state_hash。它只给 runnable/waiting/failed 集合,不执行任务。快照与当前 workflow digest 不同、重试预算耗尽仍 RUNNING、依赖未完成却 启动 join、等待用户却没有具体问题与至少两个带后果说明的选项,均为 FAIL;WAITING_USER 只有在问题/选项完整时才保持 UNRESOLVED,不得自动代答。
SUCCEEDED 不能只靠 owner 自填 completion_status=PASS。它还必须带 verification.status=PASS、与 owner 不同的 verifier_id、方法、带时区且不在未来的 checked_at、验证报告路径/哈希,以及与当前 evidence_artifacts 完全相同的 subject_sha256s。方法只允许 machine_gate、independent_review 或 human_review; 后者还必须绑定 authorization_id。这只证明“当前哈希版本被一个可定位的验证步骤检查过”, 不证明内容必然正确;机器门优先,agent 自评不得冒充独立验证。
Run the stage's producer first. Then preview:
bashpython scripts/run_checkpoint.py \ --file .light/passport.yaml --stage <1-13> \ --findings <producer-findings.json> --ts <ISO-8601>
Inspect report, exit code, producer, target, inner gate findings and expected stage contract. After the user authorizes the ledger write:
bashpython scripts/run_checkpoint.py \ --file .light/passport.yaml --stage <stage> \ --findings <producer-findings.json> --ts <ISO-8601> --write
--write without --ts is invalid. A critical finding returns exit 1, records FAILED, and blocks progression. PASS/WARN records VERIFIED; WARN still remains visible.
STAGE_GATES has entries for 2–11 except 12, plus 13. Stage 1 produces search signals for downstream consumption. Stage 12 is a user decision packet, not a confirmation gate. Stage 3 must aggregate idea-generation's idea_genealogy and innovation_engine critical findings before the warn-only collision/diversity signals; anti-collage failures cannot be bypassed by sending the candidate straight to idea-critique.
On a failed checkpoint:
bashpython scripts/reroute.py \ --findings <failed-findings.json> --stage <source-stage> \ --passport .light/passport.yaml
Interpret actions:
rework: a legal earlier-stage back-edge;admission_hold: stop entry to stage 3; do not write an edge;known_limitation: revision budget is exhausted; ask whether to record it;manual: the signal cannot be mapped without human judgment.Present:
limitation when justified;
Only after the user's exact authorization:
bashpython scripts/passport.py add-back-edge \ --file .light/passport.yaml --from <source> --to <earlier-target> \ --root-cause "<evidence-backed cause>" \ --evidence-ptr "<producer:gate@locator>" \ --authorization-id "<user-message-or-decision-id>"
The command increments the target's durable revision_rounds. The limit is two. A third attempt fails; do not reset the count across sessions or replace it with a fresh passport.
Canonical suggestions are 4→3, 7→6, 7→5, 8→7, 9→7, and 13→3/5/8. An 8→6 route is a user root-cause override, not an automatic route.
bashpython scripts/passport.py stale-check --file .light/passport.yaml --root <project> python scripts/lifecycle.py handoff --root <project> --out <handoff.json> python scripts/lifecycle.py verify-handoff --root <project> --handoff <handoff.json>
An upstream byte change stales dependent stages. It does not automatically invalidate independent parallel siblings. A changed passport hash invalidates the old handoff. verify-handoff also checks the recorded project root, timezone-bearing generated_at and the live intake snapshot (intake_state, next_action, blockers, need_reverify, known limitations and evidence state). A file-only stale change or new dirty work therefore invalidates an old handoff even when the passport hash did not change. Resume from the reported next action only after failed/dirty/stale blockers are visible.
Claude Code's SessionStart hook injects red lines plus the resume report. Codex/OpenCode consume the same memory-pm resume implementation through their instruction files, but their trigger is model-read rather than harness-forced. Do not claim identical automatic behavior.
The hook budgets 4,200 characters for discipline and 5,400 for state. On overflow it truncates to a pointer to this skill or the canonical passport. If memory-pm cannot load, it emits UNAVAILABLE and the manual resume command.
Before asking the user to accept delivery:
integration_audit.py and confirm 23 roles/stages/gates/routes;workflow_ledger.py,确认 retry budget、snapshot compatibility、parallel join、完成态独立验证绑定和 WAITING_USER 状态;
UNKNOWN, UNAVAILABLE, FAILED, stale stage and knownlimitation;
Do not convert PLANNED to VERIFIED, waive a failed gate, exceed the revision budget, or finalize delivery without the user's decision.
After explicit acceptance, record it mechanically:
bashpython scripts/passport.py authorize-delivery \ --file .light/passport.yaml --root <project> \ --authorization-id <user-record> \ --known-limitation "<accepted limitation>"
The command refuses non-delivered/non-VERIFIED stages and stale/incomplete artifacts. It is the only supported transition to delivery_status=DELIVERED.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 14,257 | 5,009 | -65% | 1 | 1 | 0% | 2,208 | 4,722 | +114% | 0 | 0 | — |
case-08 | fail→pass | 12,680 | 8,173 | -36% | 1 | 1 | 0% | 1,679 | 5,173 | +208% | 0 | 0 | — |
case-01 | fail→fail | 5,831 | 7,609 | +30% | 1 | 1 | 0% | 355 | 4,386 | +1135% | 0 | 0 | — |
case-02 | fail→fail | 15,180 | 7,687 | -49% | 1 | 1 | 0% | 2,307 | 4,491 | +95% | 0 | 0 | — |
case-03 | fail→fail | 6,965 | 6,875 | -1% | 1 | 1 | 0% | 186 | 4,429 | +2281% | 0 | 0 | — |
case-04 | pass→pass | 10,141 | 5,472 | -46% | 1 | 1 | 0% | 1,454 | 4,925 | +239% | 0 | 0 | — |
case-05 | fail→fail | 11,930 | 5,948 | -50% | 1 | 1 | 0% | 1,633 | 4,904 | +200% | 0 | 0 | — |
case-06 | fail→pass | 10,913 | 5,083 | -53% | 1 | 1 | 0% | 1,557 | 4,890 | +214% | 0 | 0 | — |
case-09 | fail→pass | 11,620 | 4,119 | -65% | 1 | 1 | 0% | 1,677 | 4,600 | +174% | 0 | 0 | — |
case-10 | fail→pass | 12,388 | 6,344 | -49% | 1 | 1 | 0% | 1,840 | 4,936 | +168% | 0 | 0 | — |
case-11 | pass→pass | 10,290 | 6,859 | -33% | 1 | 1 | 0% | 1,363 | 5,121 | +276% | 0 | 0 | — |
case-12 | pass→pass | 11,266 | 3,711 | -67% | 1 | 1 | 0% | 1,609 | 4,530 | +182% | 0 | 0 | — |
case-13 | fail→pass | 9,553 | 5,322 | -44% | 1 | 1 | 0% | 1,379 | 4,822 | +250% | 0 | 0 | — |
case-14 | fail→pass | 9,361 | 4,622 | -51% | 1 | 1 | 0% | 1,370 | 4,732 | +245% | 0 | 0 | — |
case-15 | fail→pass | 12,791 | 4,820 | -62% | 1 | 1 | 0% | 1,930 | 4,788 | +148% | 0 | 0 | — |
case-16 | fail→pass | 10,609 | 6,244 | -41% | 1 | 1 | 0% | 1,771 | 5,057 | +186% | 0 | 0 | — |
case-17 | pass→fail | 7,097 | 13,625 | +92% | 1 | 1 | 0% | 1,247 | 6,298 | +405% | 0 | 0 | — |
case-18 | fail→pass | 12,920 | 3,431 | -73% | 1 | 1 | 0% | 1,891 | 4,500 | +138% | 0 | 0 | — |
case-19 | fail→pass | 11,618 | 3,917 | -66% | 1 | 1 | 0% | 1,657 | 4,579 | +176% | 0 | 0 | — |
case-20 | pass→pass | 12,257 | 6,715 | -45% | 1 | 1 | 0% | 1,908 | 5,017 | +163% | 0 | 0 | — |
case-21 | pass→pass | 14,807 | 14,958 | +1% | 1 | 1 | 0% | 2,323 | 6,161 | +165% | 0 | 0 | — |
case-22 | pass→pass | 10,552 | 9,863 | -7% | 1 | 1 | 0% | 1,756 | 5,479 | +212% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.