Skip to content

fix(ci): drop broken nested local action reference in reqstool actions - #48

Merged
jimisola merged 1 commit into
mainfrom
fix/composite-action-local-refs-v2
Jun 21, 2026
Merged

fix(ci): drop broken nested local action reference in reqstool actions#48
jimisola merged 1 commit into
mainfrom
fix/composite-action-local-refs-v2

Conversation

@jimisola

Copy link
Copy Markdown
Member

What

`validate-reqstool` and `reqstool-status` (added in #41) each had a step `uses: ./.github/actions/install-reqstool` to share install logic. That broke the moment another repo actually consumed these actions (reqstool-demo#104):

```
Can't find 'action.yml', 'action.yaml' or 'Dockerfile' under
'/home/runner/work/reqstool-demo/reqstool-demo/.github/actions/install-reqstool'.
```

A nested local action reference inside a composite action resolves relative to the calling repo's checkout (`reqstool-demo`, which doesn't have that path), not this action's own repo (`reqstool/.github`) — a known GitHub Actions limitation when composite actions are consumed cross-repo.

Fix

Both actions now assume `reqstool` is already installed and just run their respective command. Callers run `install-reqstool` themselves as an explicit step first — that one isn't nested inside another remote action, so it resolves and works fine called directly from a consumer's own workflow.

Usage (corrected)

```yaml

  • uses: reqstool/.github/.github/actions/install-reqstool@
    with:
    reqstool-source: main
  • uses: reqstool/.github/.github/actions/validate-reqstool@
  • uses: reqstool/.github/.github/actions/reqstool-status@
    with:
    fail-if-incomplete: "true"
    ```

🤖 Generated with Claude Code

validate-reqstool and reqstool-status each called
`uses: ./.github/actions/install-reqstool` to share install logic. That
resolves relative to the *calling* repo's checkout, not this action's own
repo — so it broke the moment another repo (reqstool-demo#104) actually
consumed these actions: "Can't find 'action.yml' ... under
'.../reqstool-demo/.github/actions/install-reqstool'".

Both actions now assume reqstool is already installed and just run their
respective command; callers run the separate install-reqstool action
themselves as an explicit step first (that one isn't nested, so it works
fine called directly from another repo's workflow).

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>
@jimisola
jimisola merged commit 11a00fc into main Jun 21, 2026
2 checks passed
@jimisola
jimisola deleted the fix/composite-action-local-refs-v2 branch June 21, 2026 21:00
jimisola added a commit to reqstool/reqstool-demo that referenced this pull request Jun 21, 2026
validate-reqstool/reqstool-status no longer install reqstool themselves
(reqstool/.github#48 removed their broken nested
./.github/actions/install-reqstool reference, which only resolved when
called from within reqstool/.github itself, not from a consuming repo
like this one). Call install-reqstool explicitly as its own step first.

Pinned to reqstool/.github@11a00fc (main, 2026-06-21).

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>
jimisola added a commit to reqstool/reqstool-demo that referenced this pull request Jun 21, 2026
…howcase (#104)

* feat(openspec): bootstrap OpenSpec spec layer for the demo's status showcase

Adds an OpenSpec layer mirroring reqstool-client#407's dogfooding pattern,
scoped to this repo's actual purpose: showcasing every reqstool status
outcome (pass, manual-fail, not-implemented, failing-test, skipped-test,
missing-test) across six small feature capabilities.

- openspec/specs/{greeting,billing,reporting,validation,notifications,
  audit-logging}/spec.md — one capability per status outcome, in thin
  ID-reference form against the existing requirements.yml/SVC IDs
  (REQ_PASS, REQ_MANUAL_FAIL, ...). IDs are kept as-is (no capability
  prefix) since they're already domain-named and intentionally demonstrate
  non-passing states, unlike reqstool-client's renamed/100%-passing set.
- openspec/openspecui.hooks.ts — reqstool-ai's openspecui enrichment hook.
- .reqstool-ai.yaml — single "demo" module, domain-specific (no) prefix.
- .mcp.json — project-scoped reqstool MCP server entry.

Validated: openspec validate --specs --strict (6/6 pass), reqstool
validate --strict (pass), reqstool status (1/6 complete, by design),
mvn clean verify (build succeeds; one intentionally failing test, by
design), and CLI vs MCP get_requirements_status now agree exactly across
all 6 requirements (confirmed after reqstool-client#411's fix).

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* ci(build): validate OpenSpec specs, clarify reqstool-ai prefix comment

- Add an openspec validate --specs --strict step to build.yml so spec/SSOT
  drift fails CI instead of relying on the manual run documented in #104's
  PR description; build-docs.yml's docs/** path filter doesn't cover
  openspec/**, so nothing else was catching this.
- Expand the .reqstool-ai.yaml comment explaining why req_prefix is empty
  while svc_prefix isn't.

Found by /x:full-pr-review on #104. reqstool validate --strict was
intentionally not added yet — not in the currently published PyPI release.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* ci(build): matrix reqstool CI across PyPI and reqstool-client@main

Adds an openspec validate --specs --strict step to build.yml so spec/SSOT
drift fails CI instead of relying on the manual run documented in #104's
PR description.

Runs reqstool status/validate against both the latest PyPI release and
reqstool-client's main branch in a matrix, since reqstool-client is
deliberately holding off its next release until the org-wide OpenSpec
dogfooding rollout is complete, and main already has fixes (#411) and
commands (validate) not yet published. reqstool validate --strict only
runs on the main leg since that subcommand isn't on PyPI yet. CI continues
to run the latest PyPI release as its baseline; see reqstool-demo#105 for
tracking divergence between the two legs and collapsing back to PyPI-only
once reqstool-client cuts its next release.

Also expands the .reqstool-ai.yaml comment explaining why req_prefix is
empty while svc_prefix isn't.

Found by /x:full-pr-review on #104.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* fix(ci): pin Python 3.13 for reqstool install step

build (main) failed: the runner's default Python (3.12) doesn't satisfy
reqstool-client@main's reqstool-python-decorators>=0.1.0 dependency, which
requires Python >=3.13. Add actions/setup-python@v6 pinned to 3.13,
matching reqstool-client's own CI convention (build.yml, lint.yml).

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* ci(build): use shared reqstool/openspec workflows from reqstool/.github

Replaces the inline reqstool install/status/validate steps and the
inline openspec install/validate step with the reusable building blocks
just added to reqstool/.github for this rollout:

- reqstool/.github/.github/actions/validate-reqstool (reqstool-client#412
  follow-up notwithstanding, runs reqstool validate --strict; only called
  for the main matrix leg since that subcommand isn't on PyPI yet)
- reqstool/.github/.github/actions/reqstool-status (runs reqstool status,
  fail-if-incomplete left false since this repo intentionally has
  incomplete requirements)
- reqstool/.github/.github/workflows/common-validate-openspec.yml (now a
  separate job, since it's a reusable *workflow* rather than a composite
  action)

Pinned to reqstool/.github@cd3b5e8 (main, 2026-06-21) per
reqstool/.github#40 and #41.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* fix(ci): call install-reqstool explicitly, per reqstool/.github#48

validate-reqstool/reqstool-status no longer install reqstool themselves
(reqstool/.github#48 removed their broken nested
./.github/actions/install-reqstool reference, which only resolved when
called from within reqstool/.github itself, not from a consuming repo
like this one). Call install-reqstool explicitly as its own step first.

Pinned to reqstool/.github@11a00fc (main, 2026-06-21).

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* ci(build): re-pin reqstool/.github to 5bdf4e5

Picks up reqstool/.github#59 (drop --verbosity compact from
reqstool-status, also not yet on PyPI — same situation as the validate
subcommand fixed in #48), found via this PR's pypi matrix leg failing
with "invalid choice: 'compact'".

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* fix(reqstool): use 0.1.0 as the first revision, per semver

requirements.yml and software_verification_cases.yml used 0.0.1 for every
requirement/SVC. Per semver, 0.0.x is reserved for pre-release/unstable
work before any real first version — the first published revision of a
thing should be 0.1.0, which also matches reqstool-ai's own
.reqstool-ai.yaml.template default ("Revision string for new requirements
and SVCs. Default: 0.1.0"). My earlier .reqstool-ai.yaml matched the
existing (non-conventional) 0.0.1 instead of fixing it forward.

manual_verification_results.yml has no revision field in its schema, so
nothing to change there.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

* fix(security): add explicit permissions block to build.yml

CodeQL flagged this 3 times across commits: the workflow didn't limit
GITHUB_TOKEN permissions. Add permissions: contents: read at the
workflow root, matching the existing convention in this repo
(build-docs.yml, check-semantic-pr.yml).

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>

---------

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant