ci: add openspec validate workflow #132

Merged
goern merged 0 commits from refs/pull/132/head into main 2026-05-12 07:55:42 +00:00
goern commented 2026-05-11 15:04:25 +00:00 (Migrated from codeberg.org)

Summary

Adds .forgejo/workflows/openspec.yml so every PR (and every push to main) that touches openspec/** or the workflow file itself runs openspec validate --all --strict --no-interactive on a codeberg-small runner. Pins @fission-ai/openspec@1.3.1 to match the local dev version.

Modeled on the workflow already in use on goern/epaper-service.

Pre-flight

When this was first scoped, openspec validate --all --strict failed on 4 pre-existing items:

  • spec/cli-mode — missing Purpose/Requirements headers
  • spec/merge-pull-request — same
  • spec/pr-review-write — same
  • change/forgejo-action-code-review — no deltas

All four landed in cleanup commits (23db899, c8a7883, a83a033) before this PR, so the strict gate runs green on day one. Confirmed locally:

openspec validate --all --strict --no-interactive
✓ 8/8 items passed

Two open sibling PRs

  • #130 (list_org_labels + org-merge) — doesn't change the validate surface, gate green either order.
  • #131 (bounded text responses) — adds a fully-validating change (add-bounded-text-responses). When that merges first, the gate stays green; when this merges first, #131 will simply trigger the workflow on its own openspec changes and pass.

Test plan

  • Local openspec validate --all --strict --no-interactive passes
  • First workflow run on Codeberg succeeds (will be visible on PR merge / push)

Closes forgejo-mcp-6jc (beads).

## Summary Adds `.forgejo/workflows/openspec.yml` so every PR (and every push to `main`) that touches `openspec/**` or the workflow file itself runs `openspec validate --all --strict --no-interactive` on a `codeberg-small` runner. Pins `@fission-ai/openspec@1.3.1` to match the local dev version. Modeled on the workflow already in use on [`goern/epaper-service`](https://codeberg.org/goern/epaper-service/src/branch/main/.forgejo/workflows/openspec.yml). ## Pre-flight When this was first scoped, `openspec validate --all --strict` failed on 4 pre-existing items: - `spec/cli-mode` — missing Purpose/Requirements headers - `spec/merge-pull-request` — same - `spec/pr-review-write` — same - `change/forgejo-action-code-review` — no deltas All four landed in cleanup commits (`23db899`, `c8a7883`, `a83a033`) before this PR, so the strict gate runs green on day one. Confirmed locally: ``` openspec validate --all --strict --no-interactive ✓ 8/8 items passed ``` ## Two open sibling PRs - [#130](https://codeberg.org/goern/forgejo-mcp/pulls/130) (`list_org_labels` + org-merge) — doesn't change the validate surface, gate green either order. - [#131](https://codeberg.org/goern/forgejo-mcp/pulls/131) (bounded text responses) — adds a fully-validating change (`add-bounded-text-responses`). When that merges first, the gate stays green; when this merges first, #131 will simply trigger the workflow on its own openspec changes and pass. ## Test plan - [x] Local `openspec validate --all --strict --no-interactive` passes - [ ] First workflow run on Codeberg succeeds (will be visible on PR merge / push) Closes `forgejo-mcp-6jc` (beads).
op1st-gitops commented 2026-05-12 07:44:36 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-jmxv9 is running.

Starting Pipelinerun on-pull-request-jmxv9 in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-jmxv9 -f

op1st Pipelines as Code/on-pull-request-jmxv9 is running. Starting Pipelinerun <b>[on-pull-request-jmxv9](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-jmxv9)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-jmxv9) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-jmxv9 -f</code>
op1st-gitops commented 2026-05-12 07:45:16 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-jmxv9 has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 10 seconds

fetch-source

Succeeded 29 seconds

build-and-test

op1st Pipelines as Code/on-pull-request-jmxv9 has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-jmxv9">on-pull-request-jmxv9</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>10 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-jmxv9/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>29 seconds</td><td> [build-and-test](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-jmxv9/logs/build-and-test) </td></tr> </table>
op1st-gitops commented 2026-05-12 07:47:13 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-openspec-rq45n is running.

Starting Pipelinerun on-pull-request-openspec-rq45n in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-openspec-rq45n -f

op1st Pipelines as Code/on-pull-request-openspec-rq45n is running. Starting Pipelinerun <b>[on-pull-request-openspec-rq45n](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-openspec-rq45n)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-openspec-rq45n) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-openspec-rq45n -f</code>
op1st-gitops commented 2026-05-12 07:47:13 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-l2vc6 is running.

Starting Pipelinerun on-pull-request-l2vc6 in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-l2vc6 -f

op1st Pipelines as Code/on-pull-request-l2vc6 is running. Starting Pipelinerun <b>[on-pull-request-l2vc6](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-l2vc6)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-l2vc6) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-l2vc6 -f</code>
op1st-gitops commented 2026-05-12 07:47:47 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-openspec-rq45n has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 10 seconds

fetch-source

Succeeded 24 seconds

validate

op1st Pipelines as Code/on-pull-request-openspec-rq45n has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-openspec-rq45n">on-pull-request-openspec-rq45n</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>10 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-openspec-rq45n/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>24 seconds</td><td> [validate](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-openspec-rq45n/logs/validate) </td></tr> </table>
op1st-gitops commented 2026-05-12 07:47:59 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-l2vc6 has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 9 seconds

fetch-source

Succeeded 36 seconds

build-and-test

op1st Pipelines as Code/on-pull-request-l2vc6 has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-l2vc6">on-pull-request-l2vc6</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>9 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-l2vc6/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>36 seconds</td><td> [build-and-test](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-l2vc6/logs/build-and-test) </td></tr> </table>
op1st-gitops commented 2026-05-12 07:50:55 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-cn6x7 is running.

Starting Pipelinerun on-pull-request-cn6x7 in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-cn6x7 -f

op1st Pipelines as Code/on-pull-request-cn6x7 is running. Starting Pipelinerun <b>[on-pull-request-cn6x7](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-cn6x7)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-cn6x7) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-cn6x7 -f</code>
op1st-gitops commented 2026-05-12 07:50:55 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code has failed.
There was an error creating the PipelineRun: openspec-validate-pr-

cannot use the API on the provider platform to create a in_progress status:

op1st Pipelines as Code has <b>failed</b>. There was an error creating the PipelineRun: <b>openspec-validate-pr-</b> cannot use the API on the provider platform to create a in_progress status:
op1st-gitops commented 2026-05-12 07:51:37 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-cn6x7 has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 10 seconds

fetch-source

Succeeded 32 seconds

build-and-test

op1st Pipelines as Code/on-pull-request-cn6x7 has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-cn6x7">on-pull-request-cn6x7</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>10 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-cn6x7/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>32 seconds</td><td> [build-and-test](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-cn6x7/logs/build-and-test) </td></tr> </table>
op1st-gitops commented 2026-05-12 07:53:01 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/openspec-validate-pr-fbqqt is running.

Starting Pipelinerun openspec-validate-pr-fbqqt in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines openspec-validate-pr-fbqqt -f

op1st Pipelines as Code/openspec-validate-pr-fbqqt is running. Starting Pipelinerun <b>[openspec-validate-pr-fbqqt](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/openspec-validate-pr-fbqqt)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/openspec-validate-pr-fbqqt) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines openspec-validate-pr-fbqqt -f</code>
op1st-gitops commented 2026-05-12 07:53:01 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-6frvc is running.

Starting Pipelinerun on-pull-request-6frvc in namespace op1st-pipelines

You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:

tkn pr logs -n op1st-pipelines on-pull-request-6frvc -f

op1st Pipelines as Code/on-pull-request-6frvc is running. Starting Pipelinerun <b>[on-pull-request-6frvc](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-6frvc)</b> in namespace <b>op1st-pipelines</b> You can monitor the execution using the [op1st Pipelines as Code](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-6frvc) PipelineRun viewer or through the command line by using the [tkn](https://tekton.dev/docs/cli/#installation) CLI with the following command: <code>tkn pr logs -n op1st-pipelines on-pull-request-6frvc -f</code>
op1st-gitops commented 2026-05-12 07:53:24 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/openspec-validate-pr-fbqqt has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 9 seconds

fetch-source

Succeeded 13 seconds

validate

op1st Pipelines as Code/openspec-validate-pr-fbqqt has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/openspec-validate-pr-fbqqt">openspec-validate-pr-fbqqt</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>9 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/openspec-validate-pr-fbqqt/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>13 seconds</td><td> [validate](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/openspec-validate-pr-fbqqt/logs/validate) </td></tr> </table>
op1st-gitops commented 2026-05-12 07:53:43 +00:00 (Migrated from codeberg.org)

op1st Pipelines as Code/on-pull-request-6frvc has successfully validated your commit.


Task Statuses:

StatusDurationName
Succeeded 8 seconds

fetch-source

Succeeded 33 seconds

build-and-test

op1st Pipelines as Code/on-pull-request-6frvc has <b>successfully</b> validated your commit. <ul> <li><b>Namespace</b>: <a href="https://detailurl.setting.custom-console-url-namespace.is.not.configured">op1st-pipelines</a></li> <li><b>PipelineRun:</b> <a href="https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-6frvc">on-pull-request-6frvc</a></li> </ul> <hr> <h4>Task Statuses:</h4> <table> <tr><th>Status</th><th>Duration</th><th>Name</th></tr> <tr> <td>Succeeded</td> <td>8 seconds</td><td> [fetch-source](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-6frvc/logs/fetch-source) </td></tr> <tr> <td>Succeeded</td> <td>33 seconds</td><td> [build-and-test](https://console-openshift-console.apps.nostromo.erdgeschoss.b4mad.emea.operate-first.cloud/k8s/ns/op1st-pipelines/tekton.dev~v1beta1~PipelineRun/on-pull-request-6frvc/logs/build-and-test) </td></tr> </table>
Sign in to join this conversation.
No reviewers
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
agentic-forges/forgejo-mcp!132
No description provided.