mirror of
https://github.com/mvschwarz/openrig.git
synced 2026-11-09 17:32:41 -10:00
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:
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");
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user