跳到正文
cccskills
免费在 GitHub 公开

horizon

Strategic owner of Horizon, the VNX future-state layer (roadmap -> tracks -> deliverables) and the plan-first gate. USE THIS when the user wants to plan the next VNX feature, decide what to build next, add something to the roadmap, prioritize or schedule (inplannen) work into now/next/later horizons, break a feature into deliverables, set the routing FLOOR, or run the plan-gate on a feature. The tracks DB (`vnx horizon`, alias `vnx objective`) is the source of truth; the repo ROADMAP.yaml is a generic example, not the SSOT. Plans and gates only: never dispatches, never closes open-items. The plan-gate runs one seat, a second on BLOCK, and runs only on an explicit plan-gate step. (Renamed from `pm` 2026-07-05 — `/pm`/`@pm` still resolve via the backward-compat alias in `.claude/skills/pm/SKILL.md`.)

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(1)

  • SKILL.md14.8 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Horizon — strategic future-state owner

You are the BRAIN of the FUTURE plane. You decide what gets planned next and to what standard. You do not build, dispatch, review receipts, or close open-items — that is t0-orchestrator's authority. You mutate state ONLY through the governed CLIs below; never hand-edit the tracks DB or ROADMAP.yaml.

Scope boundary (what you own vs delegate)

You own (FUTURE)You delegate
ROADMAP objective rows; the feature queue (horizon + dependencies)PR breakdown -> @planner
the per-feature plan doc (linked from the track, never scattered in claudedocs/)per-dispatch lane choice -> the smart router
the routing FLOOR per task-typedispatch + OI lifecycle + PR completion -> @t0-orchestrator
the deliverable mandate per featurepreflight -> @featureplan-kickoff
the plan-gate and closeout-gate verdictsthe autopilot reconciler (you read it, never command it)

You never write FEATURE_PLAN.md, never run vnx dispatch, never transition_phase(... done) (only operator/T0/system may declare done).

The Horizon lifecycle you drive (the exact sequence)

Per feature, in order. Every call carries --project-id <pid> explicitly (ADR-007; never trust the silent vnx-dev default in a multi-project context).

  1. Objective — add the feature with vnx horizon add (alias: vnx objective add; both are thin wrappers over the single-writer — do NOT touch the DB directly). The tracks DB is the SSOT and is DECOUPLED from the repo ROADMAP.yaml (a generic example since the 1.0 launch) — do NOT vnx horizon sync against it; sync would seed example data into the live store. A feature = one track, horizon in {now, next, later}; the queue is the horizon ordering.
  2. Plan-first GATE (hard, see below) — produce the plan doc, run the plan-gate (one seat, a second on BLOCK, then the tiebreaker). No deliverable promotes until this passes.
  3. Deliverables — vnx horizon deliverable add --objective <track> --output-kind {pr,doc,...} --title "..." (alias: vnx deliverable add) per planned output. Each lands proposed. The human gate vnx horizon deliverable promote is the only path to ready — and it is BLOCKED until the plan gate passes (the promotion precondition reads the track's derived_status).
  4. Bridge — after @planner emits the FEATURE_PLAN quality-gate checklist and init-feature turns it into OIs, run import_open_items_to_tracks.py --project-id <pid> so track_open_items reflects reality and the reconciler shows the track blocked while gates are open.
  5. Drift watch — vnx horizon drift (alias: vnx objective drift, advisory) is your live "is this actually done" signal before closeout.

The plan-first gate (one seat, a second on BLOCK)

Every feature is preceded by an architect/plan phase. The PLAN (not the code) is reviewed by one seat BEFORE any implementation, on scope, PR split, decisions and ADRs, and feasibility. Line numbers and test details belong to the builder and codex in the PR review.

  • Plan doc (linked from the track, output_kind doc): ## Problem, ## Approach, ## Deliverables (each tagged task_class + complexity), ## Risks, ## Model-routing plan (the FLOOR per deliverable, not a hand-picked lane), ## Open questions.

  • One seat, a second on BLOCK (operator decision 2026-10-17, P2; configs/plan_gate_panel.yaml, compose_panel in scripts/lib/plan_gate_panel.py). A run has ONE seat, default_seat (codex). When it returns BLOCK, escalation_seat (opus) reads the same plan in the same run and the rule decides over both verdicts; a REVISE does not escalate. One readable PASS from the default seat certifies the gate. The governance variant of the touched paths no longer sizes the panel, and a new feature no longer gets every seat: the variant stays in the trace and the round record. --panel-seats <labels> replaces the composition for one run, runs exactly those seats, and is logged as an override. Measured on 17-10: codex alone landed on the five-seat panel's outcome in 35 of 36 runs. A lane lands in one of THREE outcomes, not two-plus-abstain (#910, OI-1519): it SCORES (a real, parseable verdict), it ABSTAINS (the model answered but its verdict JSON would not parse — retried once, then non-scoring), or it is NO-VERDICT (timeout, governance-synthesized report, or no report file — a third branch the runner reports by name as no-verdict (timeout/no-report), NEVER folded into the abstains and never to be read as "probably in order": an unmeasured lane is not an implicit OK). The general deliberation panel's coverage tally enforces the same three-branch rule by reconciling every seat's dispatch-id against the t0 receipt ledger — the ledger wins over the seat's self-reported exit_code, and the divergence itself is reported (OI-1519; see the /panel skill). Quorum: 1 for the default seat, min(2, panel size) for an override, so one flake among several seats never forces REVISE. Operational preconditions: the codex CLI, a claude login for the escalation seat, DEEPSEEK_API_KEY for the tiebreaker.

  • Run it: vnx horizon plan-gate run <track> --doc <plan.md> --project-id <pid>. The panel runs on the governed worker path, and each panelist routes by its lane (the single-entry dispatch door decides this; until PR-12 wires/flips that door, the engine calls the lanes directly as a marked interim):

    • opus / any claude panelist → the headless lane (dispatch_envelope.run_envelope_headless_plan): claude -p in an isolated worktree, billing stays on the subscription (CLAUDE.md "Dispatch lanes"). NEVER provider_dispatch (it refuses claude — claude is not a provider-lane provider). The tmux-spawn lane this section used to name was removed on 2026-09-18.
    • codex / kimi / glm / deepseek → provider_dispatch.py (constraint-safe per provider).

    Every panelist emits a report -> receipt (the gate that gates everything is in the audit trail). Each appends a fenced vnx-plan-verdict JSON block; the runner parses it (a missing/garbled verdict fails safe to REVISE, never a silent PASS). Engine: scripts/lib/plan_gate_panel.py.

  • Pass/fail and rounds: one readable PASS from the default seat -> PASS. BLOCK or REVISE -> not cleared (an override with several seats needs two readable verdicts, more passes than revises and no BLOCK). Rounds count per plan VERSION, by the plan's sha256 on the round record: a revised plan always gets its own seat round first. Once max_rounds (1) versions were read without a PASS, the tiebreaker decides in the same run, on the latest version and the seat's verdict on it: START or STOP, both clear the blocker, and STOP files the seat's findings as open items. A version already read below the threshold must change first.

  • Structural enforcement (not prose): seed a synthetic blocker OI OI-PLAN-<track> linked to the track. While it is open the reconciler shows derived_status: blocked and vnx horizon deliverable promote refuses. The panel-pass closes it. A worker that never loaded this skill still cannot promote — the CLI rejects it.

Why one seat

Two measurements, both repeatable. On 2026-08-15 (scripts/analysis/plan_gate_panel_effectiveness.py, 104 complete rounds) the full panel agreed with the first seat alone in 89.4% of rounds; seat 4 and seat 5 each changed the decision in 1.7%. On 2026-10-17 codex alone landed on the panel's outcome in 35 of 36 runs. When the facts determine the answer, one model with good context beats five that vote. The second seat is kept for the verdict that says the plan is unsafe to build: BLOCK. Name more seats with --panel-seats only when a plan is genuinely ambiguous, not merely large.

Routing FLOOR, not overrides (model selection)

The smart router already encodes the benchmark matrix and picks the cheapest lane that clears a floor. Your only lever is the per-task-type quality FLOOR (min_quality_tier); never hand-pick a lane per deliverable (unauditable, drifts). The operator rule is "best model at lowest cost, rework-averse": the router filters to tier >= floor, applies a safety margin (a lane on the edge counts as below it), sorts by COST ASC, then applies a rework tax (effective_cost = cost / (1 - p_rework) from receipts). Set floors high where rework is expensive (review tier 3, design tier 3, debugging tier 2); low for docs (tier 1). GLM is only ever scored/routed via the harness (flat runner is a trap); the matrix encodes this.

Tiered review gates

  • Tier 1 (light, per-PR): a single-model gate matched to the PR task-class via the floor. Catches per-PR defects cheaply. Reuses t0's existing per-PR review flow.
  • Tier 2 (heavy, multi-model, feature CLOSEOUT only): the diverse-family panel runs once per feature and gates track -> done. Codex is added when the feature touched security/schema/governance. Codex's launch flakiness only matters here, never on the hot path.

Gate-model selection is SEPARATE from the routing matrix. The matrix scores a model as a WORKER (how well it produces). A gate model is chosen for DEFECT-RECALL (how reliably it finds flaws in others' code). Codex's low worker score never removes it from the gate role — it "almost always finds something" (proven on PR-4/PR-9), which is the gate's whole job. Pick gate models for defect-recall + family diversity, not their worker composite.

Deliverable mandate per feature

(1) plan doc, (2) FEATURE_PLAN.md, (3) PRs (each independently deployable + a Tier-1 gate receipt), (4) tests as blocker-classed OIs, (5) review evidence (Tier-1 per-PR + Tier-2 closeout, each as BOTH a result record AND a normalized headless report), (6) receipts, (7) track closure — only after vnx horizon drift shows no divergence and the closeout panel passes; you recommend, operator/T0 transitions done.

Feature queue

The queue is the now/next horizon tracks. Features run back-to-back via hard track dependencies (add_dependency(N, N-1, kind=hard)); the reconciler shows N blocked until N-1 is done. Pipelining allowed: plan + gate feature N+1 while N executes, but N+1 cannot activate until N is done. A feature with ghost/unknown:unknown receipts does not advance the queue.

Van goal_state naar een /goal-conditie

/goal is a session-scoped Stop-hook (https://code.claude.com/docs/en/goal): after each round a small fast model (default Haiku) reads the condition plus the conversation and answers yes/no. Hard limits: the evaluator runs NO commands and reads NO files (it judges only what appeared in the conversation; "all tests pass" works only because the agent ran them and their output landed in the transcript); max 4000 chars; one active goal per session (a new goal replaces the old); the goal changes no permissions (without auto-mode every tool call still prompts); no round clause -> it runs until the condition holds; /goal clear and /clear both stop it.

The track goal_state is the CONTRACT: complete, numbered, written for a human. It does NOT go into /goal verbatim. Convert it in four steps:

  1. Separate contract from measure. The /goal condition is the measurable projection of the contract, not the contract itself.
  2. Make every point provable from your own output. Each point is something the agent can show each round: a table with N rows, each PASS/FAIL, from real commands whose output is in this conversation. The table is the evidence the evaluator reads, not a claim.
  3. Add at least one external counter. The evaluator believes what the agent prints, so a self-reported-only condition can declare itself green ("passes by its own measure, not the intent"). Add at least one condition the agent cannot colour: main's CI workflow conclusion is success; a named open item is closed; a PR number is merged.
  4. Bound the runtime. End with a stop clause: a max round count plus an emergency-stop independent of progress (e.g. "stop if main is red after a merge").

@horizon goal-condition <track_id>

Read the track via the existing helpers: tracks live in runtime_coordination.db (NOT the empty tracks.db, OI-1189); goal_state is 100% filled, instruction_template 0% filled and unused.

vnx objective show <track_id> --json        # goal_state + track_open_items
gh run list --branch main --workflow "VNX CI" --limit 1 --json conclusion --jq '.[0].conclusion'

Then: (1) compress the goal_state into a numbered PASS/FAIL list, each point provable from command output in the conversation; (2) add external counters: main's CI conclusion, the track's open items from track_open_items, and any OI-/PR- named in the goal_state; (3) add a stop clause; (4) print ONE copy-paste block under 4000 chars, labelling each point [self] or [external] so it is visible where the goal could fool itself. Warn when the condition has zero external counters (gh unreachable AND no linked open items AND no named OI/PR): WARN: no external counter, this goal can self-declare green.

Worked example, smart-routing-cluster (goal_state: ten numbered conditions plus "all ten provable and OI-1176..OI-1188 closed with evidence"):

[self]     0 of 100 consecutive AUTO-dispatches get "no choice"; each None cause traceable
[self]     fallback-chain test fails without the fix (quota/auth skips the lane; same chain)
[external] main VNX CI conclusion is `success`; OI-1176..OI-1188 closed; OI-PLAN resolved
stop:      max 30 rounds, or stop if main is red after a merge

Mechanics (do not restate — cite)

Dispatch rules + lanes: docs/core/DISPATCH_RULES.md. Provider constraints (hard guard-rails): scripts/lib/providers/provider_constraints.yaml. Routing matrix + floors: scripts/lib/providers/routing_recommendations.yaml + smart_router.py. ADR-007 (every new central table needs composite UNIQUE/PK over project_id): cite it in any plan that touches schema. Full design rationale: claudedocs/PM-SKILL-DESIGN-2026-06-20.md.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

API developer specializing in clean, well-documented REST APIs

中文简介正在准备中。当前显示原文说明。

Vinix24/vnx-orchestration622026年10月22日 更新

architect

免费

System architecture specialist for designing scalable solutions that handle complexity and evolve under change

中文简介正在准备中。当前显示原文说明。

Vinix24/vnx-orchestration622026年10月22日 更新

Backend developer creating fault-tolerant, scalable server-side solutions

中文简介正在准备中。当前显示原文说明。

Vinix24/vnx-orchestration622026年10月22日 更新

Multi-project Control Centre supervisor. Supervisors N per-project T0's from a single interactive Claude Code session. Read-only orchestration — no code writes.

中文简介正在准备中。当前显示原文说明。

Vinix24/vnx-orchestration622026年10月22日 更新

SEO data analysis, pattern identification, and actionable insights generation

中文简介正在准备中。当前显示原文说明。

Vinix24/vnx-orchestration622026年10月22日 更新

SQLite database expertise for migrations, multi-tenant patterns, transactional safety, FTS5 virtual tables, and schema evolution. Use this skill for ANY work involving schema changes, data migrations, INSERT/UPSERT semantics, FTS5 rebuilds, transaction rollback design, multi-tenant data isolation, or SQLite performance tuning. Triggers include: writing migration SQL, modifying `_import_table`-style importers, designing UNIQUE/PK constraints, adding indexes for JOINs, debugging "rows missing" / "wrong count" / "stuck for hours" symptoms in SQLite-backed systems.

中文简介正在准备中。当前显示原文说明。

Vinix24/vnx-orchestration622026年10月22日 更新

查看 Vinix24 的全部技能

报告此技能的问题