feat(workflow-spec): ship [email protected] built-in spec for mission Topology

Forward-fix #2 on b6f3114. Velocity-qa VM verify caught the data gap:
release-0.3.1/README.md's frontmatter declares
`workflow_spec: [email protected]` but no such spec existed in the
workflow-spec cache, so `topology.specGraph` came back null and the
mission Topology tab fell back to session-name aggregation. Code is
correct (null-fallback when uncached IS the intended behavior); the
acceptance gap was substrate/data, not code.

Per guard recommendation (a) — built-in shipped fixture path matches
the slice 22 / basic-loop / conveyor pattern:

- New `packages/daemon/src/builtins/workflow-specs/openrig-velocity.yaml`.
  6 steps modeling one slice end-to-end through the openrig-velocity
  rig (orch dispatch → advisor refine → driver implement → guard review
  → qa verify → orch merge). Roles map to the actual seats this product
  uses (orch-lead@openrig-velocity, advisor-lead, redo3-driver-3,
  redo3-guard-3, velocity-qa). Single frontier (v1 projector contract
  per banked `feedback_workflow_spec_validate_against_projector`).
- defaultBuiltinSpecsDir() resolution picks up the new file at boot;
  loadStarterWorkflowSpecs caches it via WorkflowSpecCache.

Tests:
- starter-spec-loader.test.ts: new test asserts the shipped builtins
  directory contains [email protected] + the spec has a `guard`
  role (discriminator vs basic-loop/conveyor). 8/8 PASS.
- conveyor-starter.test.ts: existing "ships exactly the generic
  public starter workflow specs" assertion updated to include
  openrig-velocity in the expected list. 5/5 PASS.

Acceptance verified: release-0.3.1 mission Topology tab now has a
cached spec to project. Walk-item 7 fully covered.

Full daemon suite: 3379 passed / 1 skipped / 0 failed.
git diff --check clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This commit is contained in:
mvschwarzandClaude Opus 4.7 committed 2026-05-11 08:17:43 -07:00
1 parent b6f3114d4c
commit dcf1994567
3 files changed
+121 -2

No files matched your search

@@ -0,0 +1,94 @@
# V0.3.1 slice 13 walk-item 7 — openrig-velocity workflow spec.
#
# Built-in spec for the openrig-velocity rig (the slice-development
# topology this product is built with). Referenced by
# substrate/openrig-work/missions/release-0.3.1/README.md frontmatter
# `workflow_spec: [email protected]` and projected onto the mission
# Topology tab by the missions route.
#
# Flow (one slice end-to-end):
# orch dispatches → advisor refines (optional) → driver implements
# → guard narrowly reviews → qa exercises in disposable VM → orch
# merges + closes. Single frontier (v1 projector contract).
workflow:
id: openrig-velocity
version: "1.0"
objective: >
Drive one slice from dispatch through merge using the
openrig-velocity rig's role chain (orch / advisor / driver /
guard / qa).
target:
rig: openrig-velocity
entry:
role: orch
coordination_terminal_turn_rule: hot_potato
roles:
orch:
skill_refs: [openrig-user, orchestration-team]
preferred_targets: [orch-lead@openrig-velocity]
advisor:
skill_refs: [openrig-user, brainstorming, requirements-writer]
preferred_targets: [advisor-lead@openrig-velocity]
driver:
skill_refs: [openrig-user, executing-plans, test-driven-development]
preferred_targets: [redo3-driver-3@openrig-velocity]
guard:
skill_refs: [openrig-user, review-team, systematic-debugging]
preferred_targets: [redo3-guard-3@openrig-velocity]
qa:
skill_refs: [openrig-user, dogfood, verification-before-completion]
preferred_targets: [velocity-qa@openrig-velocity]
steps:
- id: dispatch
actor_role: orch
objective: Author the dispatch packet + queue handoff to driver.
allowed_exits: [handoff, waiting, failed]
next_hop:
mode: require
suggested_roles: [driver]
- id: refine
actor_role: advisor
objective: Author or refine the IMPL-PRD before driver picks up.
allowed_exits: [handoff, waiting, failed]
next_hop:
mode: require
suggested_roles: [driver]
- id: implement
actor_role: driver
objective: TDD-first implementation; commit on slice branch; hand off to guard.
allowed_exits: [handoff, waiting, failed]
next_hop:
mode: require
suggested_roles: [guard]
- id: guard-review
actor_role: guard
objective: Narrow re-review of the slice branch tip; CLEAR / CONCERNING / BLOCKING.
allowed_exits: [handoff, waiting, failed]
next_hop:
mode: require
suggested_roles: [qa]
- id: vm-verify
actor_role: qa
objective: Exercise the slice on a disposable VM; PASS / CONCERNING / FAIL.
allowed_exits: [handoff, waiting, failed]
next_hop:
mode: require
suggested_roles: [orch]
- id: merge
actor_role: orch
objective: Merge the slice to main + close the dispatch loop.
allowed_exits: [done, failed]
next_hop:
mode: forbid
invariants:
continuation_required: true
preserve_lineage: true
closure_required: true
allowed_exits: [handoff, waiting, done, failed]
loop_guards:
max_hops: 24
spawn_budget: 0
closure:
success: Slice merged + close-out packet authored.
degraded: Slice paused with a named blocker; forward-fix queued.
failed: Slice rolled back with evidence.
@@ -54,7 +54,15 @@ describe("0.3.0 conveyor starter workflow specs", () => {
});
expect(result.errors).toEqual([]);
expect(result.loaded.map((s) => s.name).sort()).toEqual(["basic-loop", "conveyor"]);
// V0.3.1 slice 13 walk-item 7 — [email protected] added as a
// built-in spec so release-0.3.1's mission Topology tab projects
// it. Keep this list in sync with
// packages/daemon/src/builtins/workflow-specs/*.yaml.
expect(result.loaded.map((s) => s.name).sort()).toEqual([
"basic-loop",
"conveyor",
"openrig-velocity",
]);
expect(result.skipped).toEqual([]);
});
@@ -24,7 +24,7 @@ import { migrate } from "../src/db/migrate.js";
import { coreSchema } from "../src/db/migrations/001_core_schema.js";
import { workflowSpecsSchema } from "../src/db/migrations/033_workflow_specs.js";
import { WorkflowSpecCache } from "../src/domain/workflow-spec-cache.js";
import { loadStarterWorkflowSpecs } from "../src/domain/workflow/starter-spec-loader.js";
import { loadStarterWorkflowSpecs, defaultBuiltinSpecsDir } from "../src/domain/workflow/starter-spec-loader.js";
const ALPHA_SPEC = `workflow:
id: alpha-spec
@@ -154,4 +154,21 @@ describe("built-in workflow spec loader", () => {
const result = loadStarterWorkflowSpecs({ cache, builtinDir });
expect(result.loaded.map((r) => r.name).sort()).toEqual(["alpha-spec", "beta-spec"]);
});
// V0.3.1 slice 13 walk-item 7 — load the actual shipped builtins
// directory and assert [email protected] is in it. This is what
// release-0.3.1/README.md's frontmatter declares; without the spec
// present, the mission Topology tab falls back to the session-name
// union (velocity-qa VM caught exactly this on tip ef3e94d).
it("shipped builtins include [email protected] (mission Topology acceptance for slice 13)", () => {
const shippedDir = defaultBuiltinSpecsDir();
const result = loadStarterWorkflowSpecs({ cache, builtinDir: shippedDir });
expect(result.errors).toEqual([]);
const row = cache.getByNameVersion("openrig-velocity", "1.0");
expect(row).not.toBeNull();
expect(row!.spec.steps.length).toBeGreaterThan(0);
// Discriminate against the basic-loop spec (which is also in the
// shipped dir): openrig-velocity must have a 'guard' role.
expect(Object.keys(row!.spec.roles)).toContain("guard");
});
});