Step ids: agent work that isn't an OpenSpec operation should be agent.*, not openspec.* #52

Closed
opened 2026-09-26 16:44:14 -04:00 by cmoriarty · 1 comment
Owner

Problem

The openspec. prefix reads as "this is an OpenSpec command or skill", but four spine steps are Braid's own agent work with no OpenSpec counterpart:

  • openspec.reconcile-tasks: checks tasks.md against what the apply steps did
  • openspec.test.unit: runs the unit suite
  • openspec.test.e2e: runs the e2e suite
  • openspec.summarize: writes the summary for the commit and PR

All four are kind: agent in src/osf/pipeline/nodes.py. A user who knows OpenSpec (propose → apply → archive, with sync on archive) sees these in the rail and reasonably assumes they're OpenSpec features they've never used.

The naming came from #20 (spine-step-names-and-landing), which defined openspec.* as "OpenSpec work", including the agent's test and summary. This issue narrows that: openspec.* is only for operations that map to an OpenSpec CLI command or /opsx skill (new-change, propose.*, validate, apply[group], archive). Other agent work goes under agent.*, which agent.merge-pr and agent.archive-change already use.

Proposed renames

now becomes
openspec.reconcile-tasks agent.reconcile-tasks
openspec.test.unit agent.test.unit
openspec.test.e2e agent.test.e2e
openspec.summarize agent.summarize

Open question

Apply the same test to openspec.explore, openspec.review[lens] and openspec.revise. Explore is an /opsx skill, but review and revise probably aren't OpenSpec operations either.

Scope to check

The ids are referenced in nodes.py, apply.py, scheduler.py, watchdog.py, prompts.py, conditions.py, .osf/pipeline.yaml, docs/guide.md, the specs (pipeline-steps, agent-delegation, pull-request-description, and the in-flight run-resume delta), the UI (steps.ts, status.ts, tests), ui/dev/fakeosfd.py, and the unit tests. Also check anything keyed by step id on disk, such as .osf/test/*.json paths and saved runs. Runs are throwaway, so no migration is needed for in-flight ones.

## Problem The `openspec.` prefix reads as "this is an OpenSpec command or skill", but four spine steps are Braid's own agent work with no OpenSpec counterpart: - `openspec.reconcile-tasks`: checks `tasks.md` against what the apply steps did - `openspec.test.unit`: runs the unit suite - `openspec.test.e2e`: runs the e2e suite - `openspec.summarize`: writes the summary for the commit and PR All four are `kind: agent` in `src/osf/pipeline/nodes.py`. A user who knows OpenSpec (propose → apply → archive, with sync on archive) sees these in the rail and reasonably assumes they're OpenSpec features they've never used. The naming came from #20 (`spine-step-names-and-landing`), which defined `openspec.*` as "OpenSpec work", including the agent's test and summary. This issue narrows that: `openspec.*` is only for operations that map to an OpenSpec CLI command or `/opsx` skill (`new-change`, `propose.*`, `validate`, `apply[group]`, `archive`). Other agent work goes under `agent.*`, which `agent.merge-pr` and `agent.archive-change` already use. ## Proposed renames | now | becomes | |---|---| | `openspec.reconcile-tasks` | `agent.reconcile-tasks` | | `openspec.test.unit` | `agent.test.unit` | | `openspec.test.e2e` | `agent.test.e2e` | | `openspec.summarize` | `agent.summarize` | ## Open question Apply the same test to `openspec.explore`, `openspec.review[lens]` and `openspec.revise`. Explore is an `/opsx` skill, but review and revise probably aren't OpenSpec operations either. ## Scope to check The ids are referenced in `nodes.py`, `apply.py`, `scheduler.py`, `watchdog.py`, `prompts.py`, `conditions.py`, `.osf/pipeline.yaml`, `docs/guide.md`, the specs (`pipeline-steps`, `agent-delegation`, `pull-request-description`, and the in-flight `run-resume` delta), the UI (`steps.ts`, `status.ts`, tests), `ui/dev/fakeosfd.py`, and the unit tests. Also check anything keyed by step id on disk, such as `.osf/test/*.json` paths and saved runs. Runs are throwaway, so no migration is needed for in-flight ones.
Author
Owner

Shipped with #25 as the OpenSpec change agent-step-names, archived in #84. Live on production since c716e52.

  • Renamed to agent.*: agent.reconcile-tasks, agent.test.unit (and every generated agent.test.<lane>, which the issue didn't list: the apply chain builds them from a template), agent.test.e2e, agent.summarize, and, from the open question, agent.review with its lenses and .r2/.r3 rounds.
  • Stayed openspec.*: explore (an /opsx skill), new-change, propose.*, validate, revise (it rewrites the change's artifacts), apply and archive.
  • Everywhere at once: nodes.py, apply.py, this repo's .osf/pipeline.yaml, the guide, the fake osfd and the tests. Comments quoting a measured run keep the id that run had.
  • Recorded runs still read: the UI's phase, purpose and loop tables keep the old ids.
  • The pipeline-steps spec's naming rule now defines agent as Braid's own agent work that isn't an OpenSpec operation.

Runs started before the deploy could not continue; a repository's own .osf/pipeline.yaml that names the old ids keeps running them under those names.

PRs: #82 (the change), #84 (archive).

Shipped with #25 as the OpenSpec change `agent-step-names`, archived in #84. Live on production since `c716e52`. - **Renamed to `agent.*`**: `agent.reconcile-tasks`, `agent.test.unit` (and every generated `agent.test.<lane>`, which the issue didn't list: the apply chain builds them from a template), `agent.test.e2e`, `agent.summarize`, and, from the open question, `agent.review` with its lenses and `.r2`/`.r3` rounds. - **Stayed `openspec.*`**: explore (an `/opsx` skill), new-change, propose.*, validate, revise (it rewrites the change's artifacts), apply and archive. - **Everywhere at once**: `nodes.py`, `apply.py`, this repo's `.osf/pipeline.yaml`, the guide, the fake osfd and the tests. Comments quoting a measured run keep the id that run had. - **Recorded runs still read**: the UI's phase, purpose and loop tables keep the old ids. - The `pipeline-steps` spec's naming rule now defines `agent` as Braid's own agent work that isn't an OpenSpec operation. Runs started before the deploy could not continue; a repository's own `.osf/pipeline.yaml` that names the old ids keeps running them under those names. PRs: #82 (the change), #84 (archive).
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cmoriarty/braid#52
No description provided.