Skip to content

chore(deps): bump the github-actions group across 1 directory with 6 updates - #3212

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/github-actions-61c32fecf9
Closed

chore(deps): bump the github-actions group across 1 directory with 6 updates#3212
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/github-actions-61c32fecf9

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 10, 2026

Copy link
Copy Markdown
Contributor

Bumps the github-actions group with 6 updates in the / directory:

Package From To
actions/checkout 6.0.2 7.0.1
actions/setup-node 6.4.0 7.0.0
fullsend-ai/fullsend/.github/workflows/reusable-dispatch.yml 0.32.0 0.35.1
actions/setup-python 6.2.0 7.0.0
docker/login-action 4.1.0 4.6.0
actions/stale 10.2.0 11.0.0

Updates actions/checkout from 6.0.2 to 7.0.1

Release notes

Sourced from actions/checkout's releases.

v7.0.1

What's Changed

Full Changelog: actions/checkout@v7...v7.0.1

v7.0.0

What's Changed

New Contributors

Full Changelog: actions/checkout@v6.0.3...v7.0.0

v6.1.0

What's Changed

https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/ for more details about this breaking change

Full Changelog: actions/checkout@v6.0.3...v6.1.0

v6.0.3

What's Changed

New Contributors

Full Changelog: actions/checkout@v6...v6.0.3

Changelog

Sourced from actions/checkout's changelog.

Changelog

v7.0.1

v7.0.0

v6.0.3

v6.0.2

v6.0.1

v6.0.0

v5.0.1

v5.0.0

v4.3.1

v4.3.0

v4.2.2

v4.2.1

... (truncated)

Commits

Updates actions/setup-node from 6.4.0 to 7.0.0

Release notes

Sourced from actions/setup-node's releases.

v7.0.0

What's Changed

Enhancements:

Bug fixes:

Documentation updates:

Dependency update:

New Contributors

Full Changelog: actions/setup-node@v6...v7.0.0

v6.5.0

What's Changed

Full Changelog: actions/setup-node@v6.4.0...v6.5.0

Commits
  • 8207627 Migrate to ESM and upgrade dependencies (#1574)
  • 04be95c Add cache-primary-key and cache-matched-key as outputs (#1577)
  • 7c2c68d docs: Update caching recommendations to mitigate cache poisoning risks (#1567)
  • 6a61c03 Merge pull request #1569 from jasongin/update-actions-cache-5.1.0
  • 30eb73b Resolve high-severity audit issues
  • 4e1a87a Update dist
  • 360237f Strict equality
  • 4f8aac5 Bump @​actions/cache to 5.1.0, log cache write denied
  • f4a67bb Only use mirrorToken in getManifest if it's provided (#1548)
  • 0355742 Remove dummy NODE_AUTH_TOKEN export (#1558)
  • Additional commits viewable in compare view

Updates fullsend-ai/fullsend/.github/workflows/reusable-dispatch.yml from 0.32.0 to 0.35.1

Release notes

Sourced from fullsend-ai/fullsend/.github/workflows/reusable-dispatch.yml's releases.

v0.35.1

Changelog

Bug Fixes

  • dddd4c7c4bb743965d1b6b467b140ebe32e3d371: fix(#5254): skip redundant uploads for already-uploaded skill paths (@​fullsend-ai-coder[bot])
  • 14867d70fcaf9eb3847cc1f356f9390ed391beb1: fix(#5575): drop issues: read resurrected by rebase in org-mode dispatch (@​waynesun09)
  • 9f9a9cae4eccb53a6893efbcd0cadccb0e5c2829: fix(#5575): match linked-PR closing keywords instead of substring search (@​waynesun09)
  • 49cb559fdc1c04e9eb7aaa73de4efa5dea8de9cd: fix(dispatch): pass pr-head-sha to action.yml in harness-run job (@​waynesun09)

Refactoring

  • 8f3a4363f192f243bba41306e0bb5f428d6a14e0: refactor: move VitePress config from website/ to docs/ (@​rh-hemartin)

v0.35.0

fullsend github setup now accepts --config <path-or-url> and --config-hash <sha256> flags for installing vendor-curated configuration presets. When provided, the installer fetches the preset, validates its SHA-256 digest, and commits it as .fullsend/config.base.yaml alongside a stub config.yaml with override fields. Without --config, behavior is unchanged.

The token mint foreign authorization system now supports repo-level grants. The fullsend foreign allow|list|revoke commands accept a new --repo flag to manage FULLSEND_FOREIGN_<ROLE>_REPOS variables at the repository level, enabling per-repo foreign grants and intra-org cross-repo access. Org-level grants continue to work as before; repo-level grants are a union fallback.

GitLab scaffold templates received several fixes: dynamic job names that show descriptive labels on the GitLab Jobs page, corrected WIF impersonation URLs, direct WIF for inference credentials, and a resource-group self-heal mechanism that sets process_mode: newest_first on every run to prevent stale locks from cancelled pipelines.

Plugin resolution for URL-sourced harnesses is fixed. Relative plugin paths (e.g. plugins/gopls-lsp) that previously failed ValidateFilesExist because they resolved against the target repo instead of the base URL now resolve and cache correctly. Several related fixes improve chmod handling on cached plugins and parsing of raw-content URLs in lock files.

---## Changelog

Features

  • 5efbc730d58031fe58a814b4a85437c5898261bc: feat(#4912): add --config and --config-hash preset install flags (@​fullsend-ai-coder[bot])
  • e786bb08570be37cf07dbb0e03034c4250673a7e: feat(#5833): add repo-level foreign allow-list for mint (@​fullsend-ai-coder[bot])
  • 04e0e929d6ad1f2a584e6c8df1c573209d34ed03: feat(#5958): GitLab scaffold dynamic job names, WIF fixes, resource group self-heal (@​ggallen)

Bug Fixes

  • 29a5da1ad70b6180abdd2e378022ad9b83f35c90: fix(#5965): scope lint-md-links hook to only staged .md files (@​fullsend-ai-coder[bot])
  • 67f301ad468f9f0dedd84d555afa8db159eaccf5: fix: add --repo to foreign CLI and address review findings on PR #5945 (@​fullsend-ai-coder[bot])
  • 0965996e4b2d8f1701be70d8b4069e434c667319: fix: add foreign-repo-scoped shape label and doc comments for PR #5945 (@​fullsend-ai-coder[bot])
  • bad02f9bd7287f01d7f5335e9edfd737ef8ec10b: fix: address review feedback on PR #5945 (@​fullsend-ai-coder[bot])
  • 085564756d5f17c26d6079dc37e1d651c0eacaef: fix: address review feedback on PR #5953 (@​fullsend-ai-coder[bot])
  • 732ca039cb9eb99dfcc96a52385bdc4ea3b61269: fix: chmod cached plugins and extract shared ChmodPluginDir helper (@​rh-hemartin)
  • 78f54edefc685cbae26583732eabe52b711ddedb: fix: derive skill dir names from raw-content URLs in resolveFromLock (@​waynesun09)
  • 139a65ff30e46990f828784a4d01ddc3f1552cde: fix: parse raw-content URLs in resolveFromLock for base-composed plugins (@​rh-hemartin)
  • ca3fd995cc53ab2f9872fa188c6070fab434be54: fix: propagate chmod errors and update stale comment (@​rh-hemartin)
  • f74180499a9a731f52c5f4812361df641da3f89a: fix: resolve relative plugin paths from URL-sourced harnesses (@​rh-hemartin)
  • 1e4e3852008e60b67dc85f39c7485eb4bdcd91c5: fix: separate org-level and repo-level FOREIGN authorization scopes (@​fullsend-ai-coder[bot])
  • 87c7dc677f7d05243be30ec6cda777e33b0d3d2a: fix: validate plugin basename and tidy comments in resolveBasePlugins (@​rh-hemartin)

v0.34.0

Jira integration lands as an experimental input driver. Running fullsend poll --input-driver jira-poll watches a Jira Cloud project for new issues, status changes, and comments, then dispatches fullsend agents through the same harness router used by GitHub and GitLab events. Basic and Bearer token auth are supported; OAuth 2.0 client-credentials was evaluated and removed in favor of simpler token-based flows.

fullsend repos has been streamlined from nine subcommands down to four: install (absorbing add, sync, diff, and upgrade), uninstall (absorbing remove, with --manifest-only and --uninstall-only modes), migrate (replacing the old repos init), and status. A new repos set-default command lets you set forge-level defaults in repos.yaml, and repos install now detects existing WIF secrets so you can skip redundant credential flags on re-enrollment. GitLab repos are now fully supported through repos install and repos uninstall with a new --gitlab-bot-token flag, and agent runs on GitLab now post status comments to issues and merge requests.

Token mint authorization has been hardened in several ways. Mint requests must now include a non-empty repos field — callers wanting installation-wide scope must send repos: ["*"] explicitly instead of omitting the field. Per-repo callers no longer need their org listed in ALLOWED_ORGS, shrinking the org-wide trust surface. A new workflow-host allow-list (mint workflow-host add|remove|list and the WORKFLOW_HOST_REPOS env var) decouples workflow-host trust from caller enrollment, giving admins finer-grained control over which repos can host reusable workflows.

Harness resolution now supports local file paths in profiles: and providers: fields, and plugins: can reference URLs with SHA-256 integrity hashes — matching the pattern already used by agents, policies, and skills. The deprecated customized/ directory overlay has been fully removed from reusable workflows and scaffold templates (per ADR 0064), and the migrate-customizations CLI command has been deleted.

Telemetry now respects OpenTelemetry SDK defaults: the OTEL_TRACES_EXPORTER and OTEL_EXPORTER_OTLP_PROTOCOL env vars are no longer overridden, and new variables (OTEL_SDK_DISABLED, OTEL_EXPORTER_OTLP_CERTIFICATE, OTEL_EXPORTER_OTLP_HEADERS) are forwarded through all managed workflows. The CLI version is now resolved from the reusable workflow ref SHA, so agents report the exact binary version that ran them rather than a generic "latest" label.

The new /nextwork slash command builds a readiness-oriented queue of your assigned issues and PRs, surfaces blockers and staleness, and offers --apply for trivial next actions.

... (truncated)

Commits
  • 19b3583 Merge pull request #6008 from fullsend-ai/agent/6005-extend-triage-dispatch-p...
  • be87fe5 Merge pull request #5921 from fullsend-ai/renovate/registry.access.redhat.com...
  • 0896d20 ci(#6005): extend triage dispatch polling to 120s
  • f398f78 Merge pull request #5578 from fullsend-ai/fix-5575-dispatch-pr-check
  • e0d8a20 Merge pull request #5992 from fullsend-ai/test-5987-branch-namespace
  • 14867d7 fix(#5575): drop issues: read resurrected by rebase in org-mode dispatch
  • d0dfce4 Merge pull request #5999 from AshwinUgale/docs/testing-agents-significance
  • 9a86f59 Merge branch 'main' into docs/testing-agents-significance
  • 133ae91 docs(#5575): document org-mode fail-open of the linked-PR guard
  • 9f9a9ca fix(#5575): match linked-PR closing keywords instead of substring search
  • Additional commits viewable in compare view

Updates actions/setup-python from 6.2.0 to 7.0.0

Release notes

Sourced from actions/setup-python's releases.

v7.0.0

What's Changed

Enhancements

Bug Fix

Dependency Upgrade

New Contributors

Full Changelog: actions/setup-python@v6...v7.0.0

v6.3.0

What's Changed

Enhancement

Dependency update

Documentation

New Contributors

Full Changelog: actions/setup-python@v6.2.0...v6.3.0

Commits

Updates docker/login-action from 4.1.0 to 4.6.0

Release notes

Sourced from docker/login-action's releases.

v4.6.0

Full Changelog: docker/login-action@v4.5.2...v4.6.0

v4.5.2

Full Changelog: docker/login-action@v4.5.1...v4.5.2

v4.5.1

Full Changelog: docker/login-action@v4.5.0...v4.5.1

v4.5.0

Full Changelog: docker/login-action@v4.4.0...v4.5.0

v4.4.0

Full Changelog: docker/login-action@v4.3.0...v4.4.0

v4.3.0

Full Changelog: docker/login-action@v4.2.0...v4.3.0

v4.2.0

... (truncated)

Commits
  • dbcb813 Merge pull request #1051 from docker/dependabot/npm_and_yarn/aws-sdk-dependen...
  • 5bcb015 [dependabot skip] chore: update generated content
  • b30b2f2 build(deps): bump the aws-sdk-dependencies group across 1 directory with 2 up...
  • 9087f1e Merge pull request #1057 from docker/dependabot/npm_and_yarn/js-yaml-5.2.2
  • 0009830 [dependabot skip] chore: update generated content
  • 2325523 build(deps): bump js-yaml from 5.2.1 to 5.2.2
  • 4ec1d4a Merge pull request #1056 from docker/dependabot/npm_and_yarn/postcss-8.5.22
  • 5fc99ba Merge pull request #1053 from docker/dependabot/github_actions/aws-actions/co...
  • e512bd5 Merge pull request #1052 from docker/dependabot/github_actions/codeql-actions...
  • a146c91 Merge pull request #1059 from crazy-max/harden-buildx-scope-paths
  • Additional commits viewable in compare view

Updates actions/stale from 10.2.0 to 11.0.0

Release notes

Sourced from actions/stale's releases.

v11.0.0

What's Changed

Enhancement

Dependency Update

Full Changelog: actions/stale@v10...v11.0.0

v10.4.0

What's Changed

Bug Fix

Dependency Updates

New Contributors

Full Changelog: actions/stale@v10.3.0...v10.4.0

v10.3.0

What's Changed

Bug Fix

Dependency Updates

New Contributors

Full Changelog: actions/stale@v10...v10.3.0

Commits
  • 4391f3d Fix 24 high severity vulnerabilities by overriding brace-expansion to 5.0.8 (...
  • eaf9131 refactor: update imports to use ES module syntax and improve test structure (...
  • 1e223db Bump undici to 6.27.0 via override, clean up stale license files, and version...
  • 9461cb1 fix: only-issue-types does not affect PRs (#1338)
  • eb5cf3a chore: upgrade dependencies and bump version to 10.3.0 (#1335)
  • db5d06a Enhancement: ignore stale labeling events (#1311)
  • See full diff in compare view

@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Aug 10, 2026
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Aug 10, 2026
@openshift-ci

openshift-ci Bot commented Aug 10, 2026

Copy link
Copy Markdown

Hi @dependabot[bot]. Thanks for your PR.

I'm waiting for a redhat-developer member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work.

Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@github-actions github-actions Bot added the non-workspace-changes PR changes files outside workspace directories label Aug 10, 2026
@dependabot
dependabot Bot force-pushed the dependabot/github_actions/github-actions-61c32fecf9 branch from 94d77a1 to bb58582 Compare August 11, 2026 18:03
…updates

Bumps the github-actions group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `6.0.2` | `7.0.1` |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.4.0` | `7.0.0` |
| [fullsend-ai/fullsend/.github/workflows/reusable-dispatch.yml](https://github.com/fullsend-ai/fullsend) | `0.32.0` | `0.35.1` |
| [actions/setup-python](https://github.com/actions/setup-python) | `6.2.0` | `7.0.0` |
| [docker/login-action](https://github.com/docker/login-action) | `4.1.0` | `4.6.0` |
| [actions/stale](https://github.com/actions/stale) | `10.2.0` | `11.0.0` |



Updates `actions/checkout` from 6.0.2 to 7.0.1
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@de0fac2...3d3c42e)

Updates `actions/setup-node` from 6.4.0 to 7.0.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@48b55a0...8207627)

Updates `fullsend-ai/fullsend/.github/workflows/reusable-dispatch.yml` from 0.32.0 to 0.35.1
- [Release notes](https://github.com/fullsend-ai/fullsend/releases)
- [Commits](fullsend-ai/fullsend@3cfa255...19b3583)

Updates `actions/setup-python` from 6.2.0 to 7.0.0
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@a309ff8...5fda3b9)

Updates `docker/login-action` from 4.1.0 to 4.6.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](docker/login-action@4907a6d...dbcb813)

Updates `actions/stale` from 10.2.0 to 11.0.0
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@b5d41d4...4391f3d)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-python
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/stale
  dependency-version: 11.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/login-action
  dependency-version: 4.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: fullsend-ai/fullsend/.github/workflows/reusable-dispatch.yml
  dependency-version: 0.35.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot
dependabot Bot force-pushed the dependabot/github_actions/github-actions-61c32fecf9 branch from bb58582 to d6a0a45 Compare August 12, 2026 20:51
@sonarqubecloud

Copy link
Copy Markdown

gustavolira pushed a commit that referenced this pull request Aug 17, 2026
…ailing

The `smoke` check has been red since 2026-08-10 — including on PRs that change nothing
but GitHub Actions SHAs (#3212) — with:

  Acquire connection error: Error: Could not locate the bindings file
  status: fail-start

Cause: #3180 bumped the `packageManager` pin to yarn@4.17.1, and that release makes
`enableScripts: false` the default (`yarn config enableScripts` now reports
`Source: <default>, Value: false`). `better-sqlite3` therefore never builds its native
binding, so `startTestBackend()` cannot open its in-memory database and every backend
boot fails. The last green run is the last one whose log still says
"better-sqlite3 must be built because it never has been before".

Nothing about the failure names yarn or install scripts, which is why it read as a
harness bug: the plugins load fine (`backend loaded 3/3`) and only the boot fails.

Opt that one package into building via `dependenciesMeta` rather than setting
`enableScripts: true` for the whole tree — `isolated-vm`, `keytar`, `cpu-features`,
`ssh2`, `protobufjs` and `esbuild` all list install scripts too, and none of them need
to run for this harness. Yarn's safer new default stays in place for them.

Verified locally against a real workspace, reproducing and then fixing:

  before: backend loaded 3/3, start=false, status: fail-start
  after:  backend loaded 3/3, start=true,  status: pass

`yarn install --immutable` is clean; the lockfile change is the 3-line `dependenciesMeta`
entry.

This is unrelated to the rest of this PR — it is fixed here because it gates the same
check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gustavolira pushed a commit that referenced this pull request Aug 17, 2026
…ailing

The `smoke` check has been red since 2026-08-10 — including on PRs that change nothing
but GitHub Actions SHAs (#3212) — with:

  Acquire connection error: Error: Could not locate the bindings file
  status: fail-start

Cause: #3180 bumped the `packageManager` pin to yarn@4.17.1, and that release makes
`enableScripts: false` the default (`yarn config enableScripts` now reports
`Source: <default>, Value: false`). `better-sqlite3` therefore never builds its native
binding, so `startTestBackend()` cannot open its in-memory database and every backend
boot fails. The last green run is the last one whose log still says
"better-sqlite3 must be built because it never has been before".

Nothing about the failure names yarn or install scripts, which is why it read as a
harness bug: the plugins load fine (`backend loaded 3/3`) and only the boot fails.

Opt that one package into building via `dependenciesMeta` rather than setting
`enableScripts: true` for the whole tree — `isolated-vm`, `keytar`, `cpu-features`,
`ssh2`, `protobufjs` and `esbuild` all list install scripts too, and none of them need
to run for this harness. Yarn's safer new default stays in place for them.

Verified locally against a real workspace, reproducing and then fixing:

  before: backend loaded 3/3, start=false, status: fail-start
  after:  backend loaded 3/3, start=true,  status: pass

`yarn install --immutable` is clean; the lockfile change is the 3-line `dependenciesMeta`
entry.

This is unrelated to the rest of this PR — it is fixed here because it gates the same
check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gustavolira added a commit that referenced this pull request Aug 18, 2026
…ess denominator (#3282)

* feat(smoke-tests-native): validate module-federation remote shape, not just presence

The frontend half of the harness checked that `dist/mf-manifest.json` exists. Presence
is not enough: the remotes router in @backstage/backend-dynamic-feature-service logs the
reason and `continue`s past a manifest missing any field it needs, so
`GET /.backstage/dynamic-features/remotes` still answers `200 []`. What reaches the
browser is an app that boots cleanly with no plugins and no error — the failure shape
that is hardest to notice.

Validate what that router actually requires (`name`, `metaData.remoteEntry.name`, a
non-empty `exposes`, and the remote entry asset on disk) and report it per package as
`frontend.bundles[].mf`.

`servable` and `nfsFeatures` are reported apart because they are two different problems:

  - `servable: false` is an artifact defect and fails the run.
  - `nfsFeatures: []` on a servable remote is upstream migration state — the remote is
    served, but nothing it exposes carries a feature type the new frontend system
    mounts — so it warns. Nine published frontend packages are in that state today
    (argocd, qe-theme, the six @roadiehq/*, and plugin-techdocs-module-addons-contrib);
    failing them would turn six workspaces red for work that belongs upstream.

Verified against real published artifacts: `--workspace acr` reports a servable remote
with two NFS entry points, and `--workspace theme` warns on qe-theme while staying green.

Two existing tests wrote `{}` as the manifest body and passed on presence alone; they now
carry the shape observed on backstage-community-plugin-acr:bs_1.52.0__1.27.0.

Refs: RHIDP-15286, RHIDP-15082, RHIDP-16009

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(nfs-readiness): count frontend-plugin-module as frontend surface

The report's role filter admitted only `frontend-plugin`, so every
`frontend-plugin-module` package was bucketed `backend-only` — "not applicable" — even
though those packages carry `backstage.features` and load through the same
module-federation remote as a plugin.

Five packages were invisible and four of them are already NFS-ready:

  @red-hat-developer-hub/backstage-plugin-analytics-module-adoption-insights   nfs-ready
  @backstage-community/plugin-analytics-module-ga4                             nfs-ready
  @backstage-community/plugin-analytics-module-matomo                          nfs-ready
  @backstage-community/plugin-analytics-module-newrelic-browser                nfs-ready
  @backstage/plugin-techdocs-module-addons-contrib                             no-features

The published total therefore read 75 frontend packages where the real surface is 80.
The bug appeared twice — once in the classification branch, and again in the jq filters
computing the markdown denominators, so fixing only the first would have classified a
module correctly and then left it out of the count printed next to it.

Also document two ways the counts mislead, in the report's own output:

  - `mixed` and `legacy-only` are structurally unreachable. Both need
    `backstage.features` to be non-empty while containing no NFS type, but the CLI
    populates that field *from* the entry points it detects, so a plugin with no NFS
    entry point gets an empty field and lands in `no-features`. A `mixed: 0 /
    legacy-only: 0` line is the expected output shape, not a clean bill of health.
  - `no-features` merges two states this report cannot separate: a package shipping no
    MF bundle at all, and one whose served remote merely exposes no NFS entry point.
    @roadiehq/backstage-plugin-{argo-cd,datadog,github-insights} are the second kind —
    they do expose an `alpha` module. smoke-tests-native reports that distinction.

Refs: RHIDP-15286

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: add the NFS e2e triage sheet for RHIDP-15286

Reference material for the epic's per-workspace tickets: what the NFS migration actually
requires per workspace, whether the suite still needs OpenShift once migrated, and what
its assertions are really about.

Three things it records that were not written down anywhere:

  - The unit of cluster cost is the Playwright project, not the workspace. The 24
    workspaces declare 46 projects (the project name is the namespace, and `-app-next`
    is what switches e2e-test-utils into NFS mode) and 246 tests. Six app-next lanes
    exist, two skipped in nightly. "One task per workspace" is really ~40 lanes.

  - "Needs a cluster" and "needs a live external service" are different constraints, and
    only the first costs a cluster claim. Classifying by that — none / svc / ctr / ocp —
    puts about 29 of the 46 projects outside OpenShift, three of them needing no external
    dependency at all. That is a bound on what a cluster-free lane could cover, not a plan.

  - The migration recipe as the four merged workspaces actually did it, including the two
    locator diffs (acr's "ACR IMAGES" vs "Image Registry", tekton's "Tekton" vs "CI").
    Those are not flakiness: under NFS the suites' Scalprum mountPoints config is inert
    and the tab comes from the plugin's own EntityContentBlueprint. They are the epic's
    own evidence that a large share of these assertions are about declarative wiring.

It proposes no spec deletion, and the workspaces whose subject is OpenShift stay on Prow.

Two per-workspace columns are there to be checked before a lane is written: `artifact`
(several suites load RHDH's baked-in copy rather than the artifact this repo publishes, so
an NFS lane inherits that) and `scalprum` (config keys NFS does not read, each needing an
`app.extensions` equivalent or the plugin loads and contributes nothing).

Refs: RHIDP-15286, RHIDP-15287, RHIDP-15082, RHIDP-16009

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(smoke-tests-native): build better-sqlite3 so backend boots stop failing

The `smoke` check has been red since 2026-08-10 — including on PRs that change nothing
but GitHub Actions SHAs (#3212) — with:

  Acquire connection error: Error: Could not locate the bindings file
  status: fail-start

Cause: #3180 bumped the `packageManager` pin to yarn@4.17.1, and that release makes
`enableScripts: false` the default (`yarn config enableScripts` now reports
`Source: <default>, Value: false`). `better-sqlite3` therefore never builds its native
binding, so `startTestBackend()` cannot open its in-memory database and every backend
boot fails. The last green run is the last one whose log still says
"better-sqlite3 must be built because it never has been before".

Nothing about the failure names yarn or install scripts, which is why it read as a
harness bug: the plugins load fine (`backend loaded 3/3`) and only the boot fails.

Opt that one package into building via `dependenciesMeta` rather than setting
`enableScripts: true` for the whole tree — `isolated-vm`, `keytar`, `cpu-features`,
`ssh2`, `protobufjs` and `esbuild` all list install scripts too, and none of them need
to run for this harness. Yarn's safer new default stays in place for them.

Verified locally against a real workspace, reproducing and then fixing:

  before: backend loaded 3/3, start=false, status: fail-start
  after:  backend loaded 3/3, start=true,  status: pass

`yarn install --immutable` is clean; the lockfile change is the 3-line `dependenciesMeta`
entry.

This is unrelated to the rest of this PR — it is fixed here because it gates the same
check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(smoke-tests-native): align MF validation with the router's actual guards

Review of this PR found the shape check did not match the router it claims to mirror.
Three divergences, verified against the installed
@backstage/backend-dynamic-feature-service source and against real published artifacts:

1. `exposes: []` was reported as a failure. It is not one — the router's guard is
   `!exposes || !Array.isArray(exposes) || !exposes.every(...)`, and `[]` is truthy, is an
   array, and `[].every()` is vacuously true. The remote is served; it just exposes
   nothing. Failing it would have failed an artifact that works, and the previous commit
   locked that in with a green test.

2. An `exposes` entry missing a `name` was NOT reported. That is the case the router does
   reject, and the old `.filter()` silently dropped the bad entry and passed as long as
   some other entry survived — exactly the "defect invisible at runtime" this check exists
   to catch. Now mirrors the router's `.every()` predicate verbatim.

3. `metaData.remoteEntry.path` was ignored. Real manifests emit it alongside `name`
   (empty for a root-level entry, a subdirectory otherwise), so resolving `dist/<name>`
   alone reported a missing asset for a bundle the MF runtime loads fine.

Also stop gating the whole module-federation branch on a file literally named
`remoteEntry.js`. The router's default `getRemoteEntryType()` is `"manifest"`, so it
serves mf-manifest.json as the entry and the asset can be named anything the manifest
declares. Gating on the filename hid such remotes entirely: with no `dist-scalprum/` the
bundle was reported as having no frontend layout at all, and with one it was counted as
legacy-only — the same undercount the readiness-report role filter was making.

And add `nfsFeaturesExposed`: `backstage.features` was read without checking the manifest
actually exposes those entry points. A package declaring `./alpha` while exposing only `.`
left NFS nothing to resolve, yet both `servable` and `nfsFeatures` looked healthy, so no
warning fired. The gap widened once empty `exposes` became servable. `nfsFeaturesExposed`
is the field to judge "will NFS mount anything" by; `nfsFeatures` still reports what the
package declares.

Each behaviour was made to fail first, then fixed: the three new tests go red on the old
code, and mutating `nfsFeaturesExposed` back to `nfsFeatures`, dropping the `path`
segment, or restoring the `remoteEntry.js` gate each turns its own test red.

Docs corrected in the same commit: both the README field table and the triage sheet
claimed the router requires a non-empty `exposes`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(smoke-tests-native): make the NFS-entry-point signal testable

Mutation testing during review showed the warn branch had no test and could not get one:
`native-smoke.ts` ends in `process.exit(await main())`, so nothing in it is importable,
and `validateFrontends` is not exported. Deleting the branch left every test green.

The package already has the answer to this — `harness-logic.ts` exists precisely so the
harness's pure decisions can be tested away from the I/O shell (`computeStatus`,
`describeInstallShortfall`, `partitionBootable`). So `isServableWithoutNfsEntryPoint`
moves there with five cases covering the two inputs that matter, including the one the
inline condition got wrong: a package declaring an NFS feature the remote does not expose.
Mutating the predicate back to `nfsFeatures` turns that test red.

Also make `mf` required on `FrontendBundleInfo` rather than `mf?: … | null`. Every
producer sets it; the optionality existed only so five pre-PR object literals in
`aggregate-report.test.ts` kept compiling. A type that says "optional" because a test
omits it documents the test, not the system — the literals now carry `mf: null`.

While here, the module docstring in `native-smoke.ts` still described step 4 as
"presence only, never executed", which this PR falsified. It is the first thing a reader
sees, so it is corrected to say what the two halves now do.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(nfs-readiness): decide "is frontend surface" once, and cover every reader

All three reviewers flagged the same thing independently: the previous commit fixed the
role filter but left the question answered two different ways — an exact-pair test in the
classifier and `startswith("frontend-plugin")` in three jq filters eighty lines below.

That is not hypothetical drift. Driven with a fixture whose role is `frontend-plugin-widget`,
the package is counted in the frontend total, printed in the frontend tier table with
status `backend-only`, and printed again in the backend-only table — the same package in
both, under a tier header claiming a ratio for something never classified. Latent today
(metadata carries exactly four roles: 75 `frontend-plugin`, 5 `frontend-plugin-module`,
55 `backend-plugin`, 51 `backend-plugin-module`), but two expressions of one predicate is
how the classifier and the denominator came apart in the first place.

So decide it once, in `is_frontend_role()`, and carry the answer in the emitted JSON as
`frontend`. The three filters now `select(.frontend)` instead of re-deriving it.

Test coverage followed the same review: mutation testing showed the two per-tier filters
were entirely uncovered — narrowing either one passed all five tests, silently dropping a
row from the table and a unit from the header count. And
`test_backend_roles_stay_out_of_the_frontend_denominator` named the denominator while
asserting only a package's status, so a mutant sweeping `backend-plugin-module` into the
frontend total passed it; it is renamed to what it actually checked, and the markdown
fixture gained both backend roles so the denominator assertion constrains something. All
three mutants are now killed.

The tests also now use `shell_harness.run_script` rather than hand-rolling
`subprocess.run` twice with `__import__("os").environ["PATH"]` inline — that helper
already exists for exactly this, is used by two sibling suites, and brings a scrubbed
environment and a timeout the hand-rolled version lacked. `NFS_SCRIPT` joins the other
script constants.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(smoke-tests-native): keep `servable` meaning what it says, and match nfsModuleFilter

Second review pass, against the real `@backstage/backend-dynamic-feature-service` router
and `rhdh:packages/backend/src/modules/nfsModuleFilter.ts`. Four corrections, three of them
to code the first pass wrote.

**`servable` was false for remotes the router serves.** The field is documented as the
router's verdict, but a missing or escaping remote-entry asset was folded into the same
`problems` list as the router's own guards, so it flipped `servable` and prefixed the
message with "would be skipped by the remotes router". On the default path the router
probes mf-manifest.json itself (`getRemoteEntryType()` returns `"manifest"`) and never
reads `metaData.remoteEntry.path` at all — it serves those remotes. Router guards and
bundle faults are now separate: only the former sets `servable`, and the message says which
kind it is. Three tests asserted the old behaviour and were encoding the bug; they now pin
the documented meaning.

**The entry-point mapping is now prefix-insensitive, and the dead branch is gone.**
`exposedNameOf` special-cased `"."`, but `".".replace(/^\.\//, "")` is already `"."` — the
branch could not change an answer, which is why mutating it away changed nothing.
`canonicalEntryPoint` normalises both sides instead, matching `nfsModuleFilter`'s own
`moduleName === '.' || startsWith('./') ? moduleName : './' + moduleName`. Stripping only
one side assumed the two agree on the prefix; a manifest emitting `"./alpha"` literally
would have been reported as exposing nothing.

**The `exposes` guard's crash paths are now covered.** Only the `"name" in e` conjunct was
pinned; dropping `e !== null` or `typeof e === "object"` left every test green. Both are
crash paths — `"name" in null` throws, nothing catches it, and the throw escapes
`validateFrontendBundle` to abort the whole sweep rather than fail one package. One fixture
array covers all three.

**`"."` is on the hot path and was untested.** 12 of the 44 published frontend artifacts
declare `"."` as their NFS entry point; no fixture exercised that half of the mapping.

Also: the JSDoc and the README layout table still required `dist/remoteEntry.js` for the
new frontend system, which the previous commit stopped doing — and a test assertion pinned
that stale guidance, so correcting the message turned it red.

Every behaviour was made to fail first, and each fix was verified to kill its own mutant.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(smoke-tests-native): stop claiming NFS mounts nothing when metadata cannot say

The warning this PR added asserted "NFS will mount nothing" for any servable remote with
no reachable NFS entry point. For the larger of the two cases that is not true, and the
claim had already reached 19 Jira tickets before the check surfaced it.

`rhdh:packages/backend/src/modules/nfsModuleFilter.ts`:

    if (!features || Object.keys(features).length === 0) {
      return undefined;
    }

With no `backstage.features`, the filter installs **no** resolver — so the router advertises
*every* exposed module and `@backstage/frontend-dynamic-feature-loader` decides at runtime
by the `$$type` of each module's default export. `backstage.features` narrows what is
advertised; it does not gate loading. So "declares nothing" means "cannot be told from
metadata", not "mounts nothing".

`isServableWithoutNfsEntryPoint` becomes `describeNfsShortfall`, returning the message for
whichever case applies:

- declares NFS entry points but does not expose them → the filter keeps no modules, so NFS
  mounts nothing. Definitive.
- declares no `backstage.features` → the filter is bypassed; only executing the bundle can
  say. The harness now says that instead of guessing.

Moving the text into `harness-logic.ts` also puts it under test — the previous commit made
the decision testable but left the message itself in the unreachable
`process.exit()`-terminated module.

`docs/nfs-e2e-triage.md` carried the same wrong claim about the nine `no-features` packages
and is corrected with the mechanism and the practical consequence: do not assume a lane for
those workspaces shows an empty page, and do not assume it works either.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(nfs-readiness): pin the predicate's exactness, and stop duplicating it again

Mutation testing found the previous commit's own thesis unguarded: changing
`contains_exact`'s `==` to a prefix glob passed all seven tests. Exact-match-versus-prefix
is precisely what that commit was about — its message walks through a `frontend-plugin-widget`
fixture landing in both the frontend tier table and the backend-only table at once — but
that fixture never landed. It does now, and it kills the mutant.

The same commit also consolidated one duplicated predicate and created another:
`is_frontend_role` and `is_nfs_type` were the same loop, same exact match, same return
convention, one having been given `local` for its loop variable and the other not. Both now
delegate to `contains_exact`.

And the classifier converted the predicate's exit code into the string `"true"`/`"false"`
and then re-tested the *string* — re-asking, four lines later, the question the change
exists to answer once. Flattened.

Smaller items from the same pass: a `_markdown()` helper so the two markdown tests stop
repeating the invocation; `cwd=repo_root` passed through so the fixture's hermeticity claim
holds by construction rather than by the script addressing everything through `REPO_ROOT`;
and `shell_harness.py`'s docstring, which still called itself coverage-only and omitted
`REPO_ROOT` — the seam this whole suite depends on.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: clear the five SonarCloud issues this PR introduced

All five are mine, and the interesting one is a consequence of the review passes rather
than of the original change.

**typescript:S3776 — `inspectMfRemote` cognitive complexity 20 > 15** (`loader.ts`). The
function accreted across two review passes: parse, extract four manifest fields, mirror the
router's guards, resolve and contain an untrusted path, probe the asset, intersect the NFS
entry points. It had grown two adjacent comments saying nearly the same thing about what
the router does not check — a reliable sign one body was holding several ideas. Split into
`readManifestFields`, `routerGuardProblems` and `bundleAssetProblems`, which also gives the
router-versus-bundle distinction the previous commit introduced a name instead of a comment.

**typescript:S7776 — `NFS_FEATURE_TYPES` should be a `Set`** (`loader.ts`). It was an array
because an earlier review finding asked for the `as const` type assertion to go. A `Set` is
better still, and it is what `rhdh:packages/backend/src/modules/nfsModuleFilter.ts` uses for
the same list.

**typescript:S6582 — prefer an optional chain** (`harness-logic.ts`). `mf === null ||
!mf.servable` becomes `!mf?.servable`; the two agree on all three inputs, and mutating the
guard away still turns a test red.

**shelldre:S7679 ×2 — assign the positional parameter to a local**
(`nfs-readiness-report.sh`). Introduced by the `contains_exact` extraction the last commit
made: the two one-line delegations passed `$1` straight through, so neither said what its
parameter was.

Gates: `yarn check` green (130 tests), `pytest` green (442), shellcheck clean, and the
harness re-verified against the published `acr` and `theme` artifacts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(smoke-tests-native): do not let an unreadable package.json read as "declares nothing"

From the fullsend review (finding: edge-case, `loader.ts` `readNfsFeatures`). Its own
severity assessment was "very low", and that was right when the code was written — it is
not right any more, which is why this is worth fixing rather than noting.

The catch is unreachable for malformed JSON: `discoverPlugins` skips such packages and
warns before `validateFrontendBundle` ever runs, and `validateFrontendBundle` returns early
when package.json is absent. So only a genuine I/O error reaches it.

What changed is the meaning of the value it returns. Since `describeNfsShortfall` branches
on `nfsFeatures.length === 0` to say "declares no backstage.features, so nfsModuleFilter
installs no filter", an EISDIR or EACCES would now be reported as a fact about the
artifact. Stating a read failure as a verdict is precisely the mistake this PR fixed twice
already.

It now warns loudly and says what it is doing, matching how `discoverPlugins` handles the
same class of problem two functions up, and reusing `errorMessage` from `./util`.

Tested by making package.json a directory — `existsSync` passes, `readFileSync` throws
EISDIR — which reaches the catch deterministically and portably. Made to fail first;
restoring the silent `return []` turns it red.

The other four findings from that review are not applied; see the PR discussion for which
and why. One of them (`!mf?.servable`) would reintroduce SonarCloud S6582, and the bot
retracts it in the same sentence it raises it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(smoke-tests-native): name the real schemaVersion consumers

Answers the fullsend review on report.ts:28 ("Verify no external consumer checks
schemaVersion"). Verified: there is none. The consumers are `sweep.ts` via `isReport`, and
`aggregate.ts` via `isSweepSummary` plus `aggregate-report.ts` reading
`report.frontend.bundles[]` — all three inside this package and all updated in this PR.

Two things that look like consumers and are not:

- `native-smoke.yaml` and `community-plugin-sweep.yaml` move these files around as
  artifacts but never parse `schemaVersion`. The sweep's `download-artifact` has no
  `run-id`, so it only ever reads the current run's shards — an older schema cannot reach
  a newer aggregator. (The one workflow that does fetch across runs,
  `workspace-tests.yaml`, fetches `published-exports-pr-N` from `pr-actions.yaml`, a
  different artifact entirely.)
- Every other `results.json` in the repo is Playwright's report — `run-e2e.sh`,
  `e2e-triage-agent.yaml`, the e2e-failure-analysis skill — and
  `check-backstage-compatibility.yaml`'s `"schemaVersion": 1` is a shields.io badge.

Recording that in the comment because of what the verification turned up: the comment
claimed "the parity runs comparing native vs Docker verdicts" parse this file, and no such
consumer exists anywhere in the repo. That comment is the checklist a future maintainer
reads before a bump, so a phantom entry in it is worse than no list. It now names the three
real ones and says that is the whole set.

No behaviour change; the exact-match guard is deliberate and documented, and stays.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(smoke-tests-native): use errorMessage() in the manifest-parse catch

From the fullsend review (finding: error-message-format). The catch in `inspectMfRemote`
still inlined `err instanceof Error ? err.message : String(err)` while `readNfsFeatures`,
about 130 lines away in the same file, calls `errorMessage()` from `./util` — which is
exactly that ternary. I introduced the inconsistency in the previous commit by importing
the helper for one catch and leaving the other on the inline form.

Not touched: the same inline ternary in `loadBackendPlugins`. It predates this PR and is
outside the diff, so it stays for a separate change rather than widening this one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test+refactor(smoke-tests-native): pin the empty exposes name, and name the helpers verb-first

Two non-blocking observations from the fullsend review, both verified before acting.

**Empty `exposes` name was an unpinned boundary.** Checked against the router's guard:
`"name" in {name: ""}` is true, so it does not skip the remote — it advertises `[""]` as an
exposed module. So `servable` must stay true to mirror it, while the empty name is dropped
from the usable list because NFS has nothing to resolve for it. Both halves are now pinned:
mutating the length filter away, and mutating the guard to reject empty names, each turn the
new test red. The behaviour was already right; only the test was missing.

**`routerGuardProblems` / `bundleAssetProblems` → `findRouterGuardProblems` /
`findBundleAssetProblems`.** The package leans verb-first for anything non-trivial
(`accumulate*`, `build*`, `collect*`, `compute*`, `derive*`, `describe*`, `discover*`,
`find*`, `load*`, `parse*`, `read*`, `resolve*`, `select*`, `validate*`), and `findSummaries`
already establishes `find` here. `check*` was suggested but reads as returning a boolean;
these return the problems, so `find*` says both what it does and what comes back.

Not applied, for the third time asked: splitting the `better-sqlite3` fix into its own PR.
It is 5 lines and it unblocks the `smoke` job that validates this PR's own changes, so the
bisect-history argument does not outweigh reopening a PR already awaiting human approval.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: reconcile with #3284, which replaced the report's baked-in status

Rebase onto origin/main brought in #3284 ("infer NFS readiness for baked-in plugins from
source exports"), which removes the `baked-in` status entirely: a plugin with a local dist
path now has its `backstage.features` inferred from the upstream package.json exports, so it
lands in `nfs-ready` or `unknown` instead. The textual conflict was one hunk; the semantic
fallout was larger and is what this commit handles.

**The pytest case asserted the dead status.** Its property is still the one that matters — a
`frontend-plugin-module` with a local path must reach the classification branch rather than
being short-circuited to `backend-only` — and that branch is precisely what #3284 rewrote.
Renamed to say what it pins, and it now asserts `frontend is True` and `status == "unknown"`,
which is the honest answer for a fixture with no `source.json`: inference cannot run.
Exercising a successful inference needs network access to raw.githubusercontent.com, which
this hermetic suite deliberately does not have.

**`baked-in` now meant two different things in the triage sheet.** The `artifact` column is
my own vocabulary for which copy an e2e suite loads (the published OCI artifact or RHDH's
bundled one) — a different question from the report's classification, and unaffected. The
two rows that used the report's sense are corrected: `extensions` is still not published as
OCI, so the MF-manifest check cannot reach it, but the report now infers `nfs-ready` for it
from source. The column legend says explicitly that it is not the report's status.

Verified the two changes compose rather than just co-exist: the merged script reports
**80 total frontend plugins** (the denominator fix from this PR, up from 75) *and*
`extensions` as `nfs-ready` with `{"./alpha": "@backstage/FrontendPlugin"}` (the inference
from #3284). Gates after rebase: 132 TS tests, 442 python tests, shellcheck clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(smoke-tests-native): stop a failed read from becoming an NFS verdict

From the fullsend review of the rebased head (finding: [medium] logic-error). Correct, and
it is the half I left undone one commit earlier: I made `readNfsFeatures` warn on an I/O
error but left it returning `[]`, and `describeNfsShortfall` then said "the remote is served
but declares no backstage.features" — a statement about the artifact derived from a failure
to look at it. My own test named that gap and asserted only the warning.

Relying on the caller's control flow to suppress the verdict is not enough, and that is
what settled the approach. `validateFrontends` happens to skip the warning branch when
there is an error, but `describeNfsShortfall` is exported and callable on any `mf`, and more
to the point the misleading record is *persisted*: a consumer reading
`mf.servable: true, mf.nfsFeatures: []` out of results.json cannot tell an I/O error from a
package that declares nothing.

So `MfRemoteInfo` gains `nfsFeaturesError`, `describeNfsShortfall` returns null when it is
set, and the read failure also joins the bundle problems so the run fails and says why.
Schema 4 → 5, with the changelog line and the consumer list already documented two commits
back.

Two smaller findings from the same review, both verified first:

- The combined error read "would be skipped by the remotes router … is servable but its
  bundle is broken" when both problem sets fired — self-contradictory, and I wrote that
  wording. Now "has bundle problems"; whether it is servable is `mf.servable`, not the
  string's job.
- The "declaring no features" test leaned on the `mfRemote()` factory defaults without
  asserting them, so a later change to those defaults would have left it matching a message
  about a different state. It now pins its own inputs.

Also groups the shell-script tests into `TestClassification` / `TestMarkdownOutput`, matching
the class-based style 13 of the 17 sibling suites in `scripts/tests/` use, and separating two
groups that until now differed only by a comment and their fixture.

Not applied: renaming `MfManifestFields.exposes` to `usableExposes`. It feeds
`MfRemoteInfo.exposes`, which is in the results.json schema and must keep its name — giving
the internal field a different name would imply the two hold different data when one is just
the filtered form of the other.

Every behaviour was made to fail first; dropping the read-error guard turns two tests red.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: t <t@example.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dependabot @github

dependabot Bot commented on behalf of github Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

Looks like these dependencies are updatable in another way, so this is no longer needed.

@dependabot dependabot Bot closed this Aug 18, 2026
@dependabot
dependabot Bot deleted the dependabot/github_actions/github-actions-61c32fecf9 branch August 18, 2026 18:16
@fullsend-ai-retro

fullsend-ai-retro Bot commented Aug 18, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 6:20 PM UTC · Completed 6:28 PM UTC

Commit: d6a0a45 · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #3212 — Dependabot auto-closed, zero agent interaction

PR: #3212chore(deps): bump the github-actions group across 1 directory with 6 updates

What happened

Dependabot opened PR #3212 on 2026-08-10 to bump 6 GitHub Actions dependencies (actions/checkout, actions/setup-node, actions/setup-python, docker/login-action, actions/stale, fullsend-ai/fullsend) across 24 workflow YAML files. All changes were mechanical SHA-pinned version bumps with no logic changes.

The PR sat for 8 days with no human review and no agent involvement — the needs-ok-to-test gate was never cleared. On 2026-08-18, Dependabot auto-closed it because the same dependencies became updatable in a new consolidated PR (#3317, which adds 2 additional dependencies). The close event triggered a fullsend retro dispatch — the only agent interaction on this PR.

Assessment

This retro run is a pure token waste: a bot-authored, auto-closed, unmerged PR with zero triage/code/review/fix agent interaction and zero human review. There is nothing to retrospect.

The root cause is that the pull_request_target / closed event in the repo's fullsend shim workflow does not filter by PR author type, so Dependabot PR closures dispatch the retro agent unconditionally.

Existing issue coverage

This problem is extensively documented across 22+ open issues on fullsend-ai/fullsend. The most directly relevant:

  • #5817 — Meta-issue proposing consolidation of all overlapping "skip retro/agent dispatch" issues. Documents a case where a single Renovate bot PR received 7 retro dispatches over 3 weeks.
  • #1411 — Skip retro dispatch for unmerged PRs with no agent interaction.
  • #3221 — Skip fullsend agent dispatch for bot-authored dependency update PRs.
  • #5943 — Skip retro dispatch for any unmerged PR with zero fullsend agent involvement.

This PR provides additional evidence for those issues: another wasted retro dispatch on a zero-interaction Dependabot PR. No new proposals are warranted — all potential improvements are already tracked, and the consolidation effort (#5817) is the right next step.

No proposals filed

Every improvement this retro could suggest (skip retro for bot PRs, skip retro for zero-agent-interaction PRs, skip retro for unmerged PRs, add author-type filtering to the shim workflow) is already covered by existing open issues on fullsend-ai/fullsend.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code needs-ok-to-test non-workspace-changes PR changes files outside workspace directories

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants