Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e9e5a48
fix(verify): do not report unverified dimensions as passing
runsonmypc Aug 28, 2026
cf41bc8
fix(verify): map skipped checks to report outcomes
runsonmypc Aug 28, 2026
826f00b
fix(verify): retain no-task and skipped-check context
runsonmypc Aug 28, 2026
223d564
fix(verify): harden evidence gaps and final assessments
clay-good Aug 28, 2026
1872674
fix(verify): preserve optional workflows and task artifact fallback
clay-good Aug 28, 2026
459af39
fix(apply): resolve tracked task globs by schema path
clay-good Aug 31, 2026
4a6494c
fix(verify): preserve unavailable task evidence
clay-good Sep 2, 2026
8d9d3a9
Merge remote-tracking branch 'origin/main' into fix/verify-report-omi…
clay-good Sep 2, 2026
b6b85dd
Merge remote-tracking branch 'origin/main' into fix/verify-report-omi…
runsonmypc Sep 10, 2026
108c26a
Merge origin/main into fix/verify-report-omitted-checks
clay-good Sep 21, 2026
9b08d0d
fix(verify): distinguish untracked tasks from missing evidence
clay-good Sep 21, 2026
c3bda9e
docs(apply): document tracked globs and JSON evidence
clay-good Sep 21, 2026
0c06bc3
Merge origin/main into fix/verify-report-omitted-checks
clay-good Sep 22, 2026
314a136
test(parity): regenerate hashes after merging #1940
clay-good Sep 22, 2026
b8c5ea5
test(parity): restore the #1837 regression tests dropped in the merge
clay-good Sep 22, 2026
e612361
Merge origin/main into fix/verify-report-omitted-checks
clay-good Sep 23, 2026
9867ab2
test(parity): regenerate hashes after merging #1955
clay-good Sep 23, 2026
85b5467
Merge origin/main into fix/verify-report-omitted-checks
clay-good Sep 23, 2026
62dbdf6
test(parity): regenerate hashes after merging #1795 and #1926
clay-good Sep 23, 2026
078484f
Merge origin/main into fix/verify-report-omitted-checks
clay-good Sep 23, 2026
93d0114
test(parity): regenerate hashes after merging #1731
clay-good Sep 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/verify-report-skipped-dimensions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@fission-ai/openspec": patch
---

Stop `/opsx:verify` from reporting skipped checks as passing. Task completion now uses the schema-aware `tasks` and `progress` fields returned by apply instructions, while absent spec or design inputs are mapped to every check they prevent. Apply instructions aggregate every file matched by the configured task path or glob, regardless of the tracked artifact ID. Verification stays advisory and does not require optional or intentionally omitted artifacts. The scorecard identifies each skipped check, and the final assessment does not claim archive readiness when any check did not run.
4 changes: 3 additions & 1 deletion docs-lab/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -1288,7 +1288,9 @@ With `--json`, each form returns one object. The artifact form starts:
...
```

and continues with `outputPath`, `existingOutputPaths`, the full `instruction` and `template` strings, `dependencies`, `unlocks`, and `root`. The `apply` form carries `contextFiles`, `progress`, `tasks`, `state` (`blocked`, `ready`, `all_done`), and `instruction`.
and continues with `outputPath`, `existingOutputPaths`, the full `instruction` and `template` strings, `dependencies`, `unlocks`, and `root`. The `apply` form carries `contextFiles`, `progress`, `tasks`, `taskTrackingConfigured`, `state` (`blocked`, `ready`, `all_done`), and `instruction`.

`taskTrackingConfigured` is always a boolean: `true` when the schema sets a non-null [`apply.tracks`](schemas/schema-yaml.md#tracks), even if no file matches, and `false` otherwise. If a matched tracking file cannot be read, `unavailableTrackingFiles` contains its absolute `path` and error `reason`. This field is omitted when every matched file is readable. Readable files still contribute to `tasks` and `progress`, but `state` cannot be `all_done` until every matched file is read.

**Exit codes**

Expand Down
16 changes: 10 additions & 6 deletions docs-lab/reference/schemas/schema-yaml.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ OpenSpec rejects absolute paths and paths containing a `..` segment.
| Field | Contract |
|---|---|
| `requires` | **Required.** A non-empty list of artifacts that must exist before apply instructions become ready. |
| `tracks` | An optional relative path to a Markdown task file in the change folder. Default: `null`. |
| `tracks` | An optional relative path or glob for Markdown task files in the change folder. Default: `null`. |
| `instruction` | Optional guidance sent to the agent when apply is ready. OpenSpec uses built-in guidance by default. |

Artifact `requires` controls planning order. `apply.requires` controls when apply instructions become ready.
Expand All @@ -140,7 +140,9 @@ The path starts from the change folder. For a change named `add-auth`, `tracks:
openspec/changes/add-auth/tasks.md
```

Apply stays blocked if that file is missing or contains no checkbox with task text. OpenSpec counts these checkbox forms:
A glob such as `tracks: "**/tasks.md"` reads every matching file, such as `backend/tasks.md` and `frontend/tasks.md`. OpenSpec combines their tasks and progress. Use the same value for an artifact's `generates` field so status and list track the same files.

Apply stays blocked if no file matches or the matched files contain no checkbox with task text. OpenSpec counts these checkbox forms:

```markdown
- [ ] Pending task
Expand All @@ -153,11 +155,13 @@ Apply stays blocked if that file is missing or contains no checkbox with task te

Any Markdown list marker works: `-`, `*`, `+`, or a number of up to nine digits followed by `.` or `)`. Leading spaces are allowed. The [tasks.md section of the spec-driven page](spec-driven/index.md#tasksmd) defines the stricter format produced by the default schema.

The tracked file drives the apply state:
The tracked files drive the apply state:

- **`blocked`**: no file matches, or no readable file has a checkbox with task text.
- **`ready`**: at least one task is pending, or a matched file could not be read while another provides tasks.
- **`all_done`**: every tracked task is checked and every matched file was read.

- **`blocked`**: the file is missing, or no checkbox has task text.
- **`ready`**: at least one tracked task is pending.
- **`all_done`**: every tracked task is checked.
If a matched file cannot be read, apply keeps the tasks and progress from readable files but does not mark the change `all_done`. [Apply JSON output](../cli.md#openspec-instructions) identifies each unavailable file and the reason.

OpenSpec rejects absolute paths and paths containing a `..` segment.

Expand Down
73 changes: 61 additions & 12 deletions openspec/specs/opsx-verify-skill/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,37 @@ The system SHALL provide an `/opsx:verify` skill that validates implementation a
#### Scenario: Verify without change name
- **WHEN** agent executes `/opsx:verify` without a change name
- **THEN** the agent infers the change from conversation context, or auto-selects it when only one active change exists
- **AND** when ambiguous, prompts user to select from available changes, showing only changes that have implementation tasks
- **AND** when ambiguous, prompts user to select from all active changes, including changes with no tracked tasks
- **AND** announces which change was selected and how to override

#### Scenario: Change has no tasks
- **WHEN** selected change has no tasks.md or tasks are empty
- **THEN** the agent reports "No tasks to verify"
- **AND** suggests running `/opsx:continue` to create tasks
#### Scenario: Change has no task descriptions
- **WHEN** the schema configures task tracking but the structured task list provides no usable task descriptions, even if task progress reports nonzero totals
- **THEN** the agent reports Task Completion as not verified with the reason
- **AND** continues checks supported by the remaining artifacts

#### Scenario: Schema has no task tracking
- **WHEN** the schema does not configure `apply.tracks`
- **THEN** apply instructions report `taskTrackingConfigured: false`
- **AND** the agent reports Task Completion as not applicable, not as skipped or failed
- **AND** continues the checks that apply to the schema

### Requirement: Completeness Verification
The agent SHALL verify that all required work has been completed.

#### Scenario: Task completion check
- **WHEN** verifying completeness
- **THEN** the agent reads tasks.md
- **AND** counts tasks marked `- [x]` (complete) vs `- [ ]` (incomplete)
- **THEN** the agent uses the top-level `tasks` and `progress` from apply instructions
- **AND** apply instructions aggregate every concrete file matched by the active schema's `apply.tracks`, regardless of the tracked artifact's ID
- **AND** reports complete and total task counts from `progress`
- **AND** reports completion status with specific incomplete tasks listed
- **AND** reports remaining checkboxes without descriptions when `progress.remaining` exceeds the listed incomplete tasks

#### Scenario: Tracking evidence becomes unavailable
- **WHEN** one or more files matched by `apply.tracks` cannot be read after resolution
- **THEN** apply instructions include every unavailable path and reason
- **AND** preserve tasks and progress from readable tracking files
- **AND** do not report `all_done`
- **AND** the agent marks Task Completion as not verified from partial evidence

#### Scenario: Spec coverage check
- **WHEN** verifying completeness
Expand All @@ -42,7 +57,8 @@ The agent SHALL verify that all required work has been completed.
#### Scenario: All tasks complete
- **WHEN** all tasks are marked complete
- **THEN** report "Tasks: N/N complete"
- **AND** mark completeness dimension as passed
- **AND** mark Task Completion as passed only when task descriptions are available
- **AND** mark the completeness dimension as passed only when all applicable checks ran and passed

#### Scenario: Incomplete tasks found
- **WHEN** some tasks are incomplete
Expand Down Expand Up @@ -98,7 +114,7 @@ The agent SHALL verify that implementation is sensible and follows design decisi
- **WHEN** verifying coherence
- **AND** no design.md exists
- **THEN** skip design adherence check
- **AND** note "No design.md to verify against"
- **AND** report "Design Adherence: Not verified (No design.md to verify against)"

#### Scenario: Design decision followed
- **WHEN** implementation follows a design decision
Expand All @@ -113,8 +129,10 @@ The agent SHALL verify that implementation is sensible and follows design decisi

#### Scenario: Code pattern consistency
- **WHEN** verifying coherence
- **AND** available artifacts support identifying implementation changes beyond a tasks-only check
- **THEN** check if new code follows existing project patterns
- **AND** flag any significant deviations as suggestions
- **AND** report Code Pattern Consistency as not verified if implementation changes cannot be identified

### Requirement: Verification Report Format
The agent SHALL produce a structured, prioritized report.
Expand All @@ -132,6 +150,8 @@ The agent SHALL produce a structured, prioritized report.
| Correctness | X/Y |
| Coherence | Followed |
```
- **AND** report `Not verified (<reason>)` for every skipped or partially verified check in its dimension's status
- **AND** never count a skipped check as passing

#### Scenario: Issue prioritization
- **WHEN** issues are found
Expand All @@ -147,7 +167,7 @@ The agent SHALL produce a structured, prioritized report.
- **AND** avoid vague suggestions like "consider reviewing"

#### Scenario: All checks pass
- **WHEN** no issues found across all dimensions
- **WHEN** every applicable check ran and no issues were found across all dimensions
- **THEN** display:
```text
All checks passed. Ready for archive.
Expand All @@ -160,15 +180,31 @@ The agent SHALL produce a structured, prioritized report.
X critical issue(s) found. Fix before archiving.
```
- **AND** do NOT suggest running archive
- **AND** name every skipped check and its reason, if any

#### Scenario: Only warnings/suggestions
- **WHEN** no CRITICAL issues but warnings exist
#### Scenario: Only warnings
- **WHEN** every applicable check ran and no CRITICAL issues but warnings exist
- **THEN** display:
```text
No critical issues. Y warning(s) to consider.
Ready for archive (with noted improvements).
```

#### Scenario: Only suggestions
- **WHEN** every applicable check ran and only suggestions exist
- **THEN** report "No critical issues or warnings. Z suggestion(s) to consider. Ready for archive (with noted improvements)."

#### Scenario: Checks skipped
- **WHEN** any check was skipped or partially verified and no CRITICAL issues exist
- **THEN** report "No critical issues found in the checks that ran"
- **AND** name every unverified check and its reason
- **AND** include the warning count when nonzero
- **AND** do not claim archive readiness

#### Scenario: Suggestions in final assessment
- **WHEN** suggestions exist
- **THEN** include their count in the final assessment, including assessments with critical issues or skipped checks

### Requirement: Flexible Artifact Handling
The agent SHALL gracefully handle changes with varying artifact completeness.

Expand All @@ -188,3 +224,16 @@ The agent SHALL gracefully handle changes with varying artifact completeness.
- **WHEN** change has proposal, design, specs, and tasks
- **THEN** perform all verification checks
- **AND** cross-reference artifacts for consistency

#### Scenario: Unusable or partial artifact evidence
- **WHEN** an artifact cannot be read or lacks usable requirements, scenarios, or design decisions
- **THEN** mark each affected check as not verified with its reason
- **AND** continue checks supported by the remaining evidence without treating partial coverage as a fully verified check

#### Scenario: Intentional artifact omissions
- **WHEN** a check has no supporting artifacts because the schema omits task tracking or optional artifacts, or the change declares `skip_specs: true`
- **THEN** report the corresponding checks as not applicable and explain why
- **AND** exclude not-applicable checks from skipped-check counts and readiness assessment
- **AND** do not require or create optional or intentionally skipped artifacts to obtain a passing report
- **AND** treat verification as advisory: not verified describes missing evidence for an applicable check, not a new archive gate
- **AND** leave archive checks and user-confirmation behavior unchanged
Loading
Loading