Skip to content

docs(backstage-plugins): fix install guide inaccuracies found in end-to-end test - #818

Open
kaviththiranga wants to merge 2 commits into
openchoreo:mainfrom
kaviththiranga:fix/backstage-plugins-install-guide-accuracy
Open

docs(backstage-plugins): fix install guide inaccuracies found in end-to-end test#818
kaviththiranga wants to merge 2 commits into
openchoreo:mainfrom
kaviththiranga:fix/backstage-plugins-install-guide-accuracy

Conversation

@kaviththiranga

Copy link
Copy Markdown
Contributor

What

Fixes inaccuracies in the Backstage plugins install guide found by following it end to end against a live OpenChoreo v1.2.1 cluster (auth + authz enabled) with plugin set 1.2.2, from a stock create-app scaffold.

Applied to both docs/ (next) and versioned_docs/version-v1.2.x/, since lastVersion is v1.2.x and that is what readers get at /docs/.

Fixes

1. ${GITHUB_PACKAGES_TOKEN} breaks every yarn command (§3) — the snippet used a bare variable reference. Yarn expands .yarnrc.yml variables on every invocation, so with the variable unset, yarn tsc, yarn start and yarn lint all abort with Usage Error: Environment variable not found (GITHUB_PACKAGES_TOKEN) before doing anything. Reproduced on Yarn 4.4.1 and 4.13.0. Now uses the :- empty-default form, plus a warning explaining why and a troubleshooting entry.

2. The .yarnrc.yml example was from a different scaffold than the guide targets (§3) — it showed yarnPath: .yarn/releases/yarn-4.13.0.cjs plus npmMinimalAgeGate / npmPreapprovedPackages. Those belong to the 1.53-era scaffold. The scaffold for Backstage 1.51.0, which this guide pins to, has a two-line .yarnrc.yml with Yarn 4.4.1 and no age gate. Following the guide literally gave a wrong yarnPath and two keys that do nothing. The example now shows only what needs adding, and the age gate moved to a note.

3. Node.js version was wrong (§1, compatibility matrix) — said "20 or 22". Both the 1.51 and 1.53 scaffolds declare "engines": { "node": "22 || 24" }, so Node 20 does not work. Now "22 or 24".

4. An empty catalog was reported as complete success (§4.5, troubleshooting) — with permission.enabled: true the catalog is empty until OpenChoreo sign-in completes, which is correct behaviour, but nothing says so. The provider logs Successfully processed N entities, there is no error or warning, and the provider's Template entities are not filtered, so the Scaffolder fills with OpenChoreo templates while the catalog looks empty. Added a warning at the verify step and rewrote the troubleshooting entry.

5. The troubleshooting entry for that symptom named the wrong cause — "Catalog provider runs but no entities show up" advised adding kinds to catalog.rules.allow. Entities emitted by an EntityProvider bypass catalog.rules entirely; catalog.rules only governs static catalog.locations. Demonstrable: the provider's Template entities are admitted even when Template is absent from the allow-list. Retitled to the actual symptom and corrected.

6. catalog.rules comment in §4.4 said "The catalog must accept Domain entities from the OpenChoreo provider", which is the same misconception. Reworded.

7. §7 named no config flag — sections 5 and 6 each set one; §7 had no configure step. It shares openchoreo.features.workflows.enabled with §6, which matters if you install §7 without §6. Added as §7.4.

8. Stale prerelease callout — the intro said 1.2.0 "is still under active development" and to install via @next. 1.2.0 shipped 2026-07-24 and ^1.2.0 now resolves to 1.2.2, so the tip steered new adopters onto prereleases. Rewritten as a general note about the latest / next dist-tags.

Additions

Avoiding the downgrade (§1, §2, matrix) — the guide had you scaffold at create-app@latest and then versions:bump --release 1.51.0 down to the tested line. @backstage/create-app@0.8.3 is the release that ships Backstage 1.51.0, so npx @backstage/create-app@0.8.3 lands there directly. Added as the recommended path for new apps; versions:bump is kept for existing apps on another release line. Besides removing an install-then-downgrade cycle, it keeps @backstage/* version churn out of the first commit, so the diff that adds OpenChoreo contains only OpenChoreo changes.

Optional packs need cluster-side planes (§1) — the Observability and CI/Build packs require the corresponding OpenChoreo planes, which are opt-in on the k3d quick start (./install.sh --with-observability --with-build). Not mentioned anywhere in this guide; without them the tabs render but have no data.

403 does not match expected scopes (troubleshooting) — a gh CLI token is rejected by npm.pkg.github.com regardless of its scopes; you need a classic PAT with read:packages. This is easy to hit since the guide links to token creation without saying the CLI token will not do.

create-app has no --name flag (§1) — the bare command prompts, which breaks scripted installs. Added the printf form.

Verification

  • Followed the corrected guide from scratch on a clean create-app@0.8.3 scaffold: yarn tsc exits 0, dev server starts, Successfully processed 62 entities (1 domains, 4 systems, 26 components, 3 environments, ...), zero errors in the backend log.
  • npm run build succeeds with no broken-link errors; prettier --check clean.

Not addressed

openchoreo.defaultOwner: openchoreo-users (§4.4) points at a Group that nothing in the Core install creates, so every synced entity gets a dangling owner and the log shows Unable to stitch group:default/openchoreo-users. Harmless, but the fix is a product call — either wire @openchoreo/backstage-plugin-catalog-backend-module-openchoreo-users into Core, or have the guide point defaultOwner at a group that exists. Happy to follow up whichever way maintainers prefer.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@kaviththiranga, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 31 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 971dac98-66b8-48c8-9f50-3d385af38ec0

📥 Commits

Reviewing files that changed from the base of the PR and between 7617d71 and a1b9c07.

⛔ Files ignored due to path filters (1)
  • versioned_docs/version-v1.2.x/platform-engineer-guide/backstage-plugins/entity-views.mdx is excluded by !versioned_docs/**
📒 Files selected for processing (1)
  • docs/platform-engineer-guide/backstage-plugins/entity-views.mdx
📝 Walkthrough

Summary by CodeRabbit

  • Documentation
    • Updated Backstage compatibility guidance for Node.js 22/24, Yarn 4.4.1, and supported scaffolding versions.
    • Expanded installation instructions, including GitHub Packages configuration, prerequisites, workflows, and verification.
    • Added troubleshooting guidance for token configuration, package access, authentication, authorization, and empty catalogs.
    • Clarified version downgrade behavior and how provider-generated catalog entities are handled.

Walkthrough

The Backstage plugin documentation now covers updated compatibility versions, stable installation prerequisites, Yarn and GitHub Packages configuration, catalog permission behavior, workflow feature flags, and troubleshooting steps.

Changes

Backstage plugin documentation

Layer / File(s) Summary
Compatibility and installation prerequisites
docs/platform-engineer-guide/backstage-plugins/compatibility-matrix.mdx, docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx
Documents Backstage 1.51.0, OpenChoreo plugin 1.2.x, Node.js 22/24, Yarn 4.4.1, pinned scaffolding, and optional cluster planes.
Package configuration and token handling
docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx, docs/platform-engineer-guide/backstage-plugins/troubleshooting.mdx
Updates Yarn 4 GitHub Packages configuration, empty token defaults, minimum-age handling, and token scope troubleshooting.
Catalog, workflow, and troubleshooting guidance
docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx, docs/platform-engineer-guide/backstage-plugins/troubleshooting.mdx
Clarifies provider-emitted catalog entities, permission-based filtering, workflow feature flags, and catalog diagnostics.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Suggested reviewers: yashodgayashan

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies documentation fixes for inaccuracies found during end-to-end testing.
Description check ✅ Passed The description clearly explains the purpose, changes, testing, and known limitation, although it does not use the required template headings or checklist.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx`:
- Around line 24-32: Update all OpenChoreo install and upgrade commands in this
guide, including the migration guide, to constrain package versions to the
tested 1.2.x minor by replacing caret ranges such as ^1.2.0 with ~1.2.0 or
1.2.x. Preserve the separate `@next` prerelease command.
- Around line 637-639: Update the catalog rules guidance in catalog-sync.mdx,
installing-into-existing-backstage.mdx, and troubleshooting.mdx so
catalog.rules.allow is not required for EntityProvider entities submitted
through EntityProviderConnection.applyMutation. Retain the requirement only for
static catalog.locations, and keep the installation and troubleshooting
explanations consistent across all three files.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: f91520ff-89b9-4eb6-a1b5-29855deed287

📥 Commits

Reviewing files that changed from the base of the PR and between 6f27d81 and 7617d71.

⛔ Files ignored due to path filters (3)
  • versioned_docs/version-v1.2.x/platform-engineer-guide/backstage-plugins/compatibility-matrix.mdx is excluded by !versioned_docs/**
  • versioned_docs/version-v1.2.x/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx is excluded by !versioned_docs/**
  • versioned_docs/version-v1.2.x/platform-engineer-guide/backstage-plugins/troubleshooting.mdx is excluded by !versioned_docs/**
📒 Files selected for processing (3)
  • docs/platform-engineer-guide/backstage-plugins/compatibility-matrix.mdx
  • docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx
  • docs/platform-engineer-guide/backstage-plugins/troubleshooting.mdx

Comment on lines +24 to 32
:::tip Tracking prereleases

The install commands on this page reference `@openchoreo/<pkg>@^1.2.0`, which will be the GA dist-tag of the next plugin release. While `1.2.0` is still under active development, install via the `next` dist-tag to get the latest prerelease today:
The install commands on this page reference `@openchoreo/<pkg>@^1.2.0`, which resolves to the newest stable `1.2.x` release. Stable releases are published under the `latest` dist-tag; prereleases go to `next`. To track the cutting edge instead:

```bash
yarn workspace app add @openchoreo/backstage-plugin@next
```

Once `1.2.0` GA is announced, swap `@next` for `@^1.2.0` to pin to the stable release.

:::

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find every documented package range that can escape the tested 1.2.x line.
rg -n '`@openchoreo/`[^[:space:]`]+@\^1\.2\.0' docs

Repository: openchoreo/openchoreo.github.io

Length of output: 6626


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- installation page: compatibility and range guidance ---'
rg -n -C 5 'compatib|1\.2\.x|1\.2\.0|\^1\.2\.0|~1\.2\.0|latest|next|stable|prerelease' \
  docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx

echo '--- migration page: compatibility and range guidance ---'
rg -n -C 4 'compatib|1\.2\.x|1\.2\.0|\^1\.2\.0|~1\.2\.0|latest|next|stable|prerelease' \
  docs/platform-engineer-guide/backstage-plugins/migration-1.1-to-1.2.mdx

echo '--- repository version policy references ---'
rg -n -i -C 3 'compatibility matrix|supported versions|version matrix|semver|dist-tag|backstage-plugin' \
  docs README.md .github 2>/dev/null | head -n 300

echo '--- standalone semver boundary check ---'
python3 - <<'PY'
from functools import total_ordering

`@total_ordering`
class V:
    def __init__(self, s):
        self.t = tuple(map(int, s.split('.')))
    def __lt__(self, other): return self.t < other.t
    def __eq__(self, other): return self.t == other.t
    def __repr__(self): return '.'.join(map(str, self.t))

lower = V("1.2.0")
upper = V("2.0.0")
for raw in ("1.2.0", "1.2.9", "1.3.0", "1.9.9", "2.0.0"):
    v = V(raw)
    print(raw, "satisfies ^1.2.0:", lower <= v < upper,
          "satisfies ~1.2.0:", V("1.2.0") <= v < V("1.3.0"))
PY

Repository: openchoreo/openchoreo.github.io

Length of output: 50389


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- compatibility matrix ---'
matrix=$(fd -i -t f 'compatibility-matrix' docs | head -n 1)
printf 'file: %s\n' "$matrix"
wc -l "$matrix"
cat -n "$matrix"

echo '--- exact affected command blocks ---'
sed -n '160,198p' docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx
sed -n '700,715p' docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx
sed -n '760,775p' docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx
sed -n '816,831p' docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx
sed -n '12,80p' docs/platform-engineer-guide/backstage-plugins/migration-1.1-to-1.2.mdx

echo '--- semver boundary probe ---'
python3 - <<'PY'
def v(s):
    return tuple(int(x) for x in s.split("."))

tests = ("1.2.0", "1.2.9", "1.3.0", "1.9.9", "2.0.0")
for item in tests:
    x = v(item)
    caret = v("1.2.0") <= x < v("2.0.0")
    tilde = v("1.2.0") <= x < v("1.3.0")
    print(f"{item}: ^1.2.0={caret}, ~1.2.0={tilde}")
PY

Repository: openchoreo/openchoreo.github.io

Length of output: 16683


Restrict OpenChoreo package ranges to the tested minor.

The compatibility matrix supports only plugin set 1.2.x, but ^1.2.0 accepts 1.3.0 through <2.0.0. Use ~1.2.0 or 1.2.x in all OpenChoreo install and upgrade commands, including the migration guide.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx`
around lines 24 - 32, Update all OpenChoreo install and upgrade commands in this
guide, including the migration guide, to constrain package versions to the
tested 1.2.x minor by replacing caret ranges such as ^1.2.0 with ~1.2.0 or
1.2.x. Preserve the separate `@next` prerelease command.

Comment on lines +637 to +639
# Only needed for static `catalog.locations` you add yourself. Entities emitted by
# an EntityProvider — which is how the OpenChoreo sync works — bypass catalog.rules
# entirely, so this block does not gate the OpenChoreo entities.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

For Backstage v1.51.0, do entities submitted through EntityProviderConnection.applyMutationpass throughcatalog.rules? Cite the Backstage v1.51.0 source code or official documentation.

💡 Result:

In Backstage v1.51.0, entities submitted through EntityProviderConnection.applyMutation are not subject to catalog.rules validation [1][2][3]. Catalog rules are primarily designed to control the ingestion of entities originating from locations (such as those defined in catalog.locations) [1][4][2]. They are enforced by the DefaultCatalogProcessingOrchestrator within the processing pipeline [3], specifically applying to entities that have an associated location spec [1][3]. Entities submitted directly via an EntityProvider through applyMutation bypass this location-based rule enforcement [1]. As outlined in the official Backstage documentation, EntityProviders provide entities directly to the catalog engine [5][6]. While these entities undergo standard catalog processing steps (such as validation by EntityPolicies and processors), they do not trigger the catalog.rules check that applies to file-based or URL-based location ingestion [1][4][3].

Citations:


🏁 Script executed:

#!/bin/bash
set -eu
for f in \
  docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx \
  docs/platform-engineer-guide/backstage-plugins/troubleshooting.mdx \
  docs/platform-engineer-guide/backstage-plugins/catalog-sync.mdx
do
  echo "=== $f ==="
  wc -l "$f"
  case "$f" in
    *installing-into-existing-backstage.mdx) sed -n '620,650p' "$f" ;;
    *troubleshooting.mdx) sed -n '265,295p' "$f" ;;
    *catalog-sync.mdx) sed -n '25,55p' "$f" ;;
  esac
done

echo "=== references to catalog.rules and EntityProvider ==="
rg -n -C 3 'catalog\.rules|EntityProvider|applyMutation' docs/platform-engineer-guide/backstage-plugins

Repository: openchoreo/openchoreo.github.io

Length of output: 8990


🏁 Script executed:

#!/bin/bash
set -eu
python3 - <<'PY'
import json
import urllib.request

base = "https://raw.githubusercontent.com/backstage/backstage/v1.51.0/"
paths = [
    "plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts",
    "plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts",
    "plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts",
]
for path in paths:
    url = base + path
    print(f"=== {url} ===")
    try:
        with urllib.request.urlopen(url, timeout=20) as response:
            text = response.read().decode()
    except Exception as exc:
        print(f"FETCH_ERROR: {exc}")
        continue
    lines = text.splitlines()
    for i, line in enumerate(lines, 1):
        if any(term in line for term in ("rules", "applyMutation", "location")):
            lo, hi = max(1, i - 5), min(len(lines), i + 8)
            print("\n".join(f"{n}: {lines[n-1]}" for n in range(lo, hi + 1)))
            print("---")
PY

Repository: openchoreo/openchoreo.github.io

Length of output: 1037


🏁 Script executed:

#!/bin/bash
set -eu
base='https://raw.githubusercontent.com/backstage/backstage/v1.51.0'
for path in \
  plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts \
  plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts \
  plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts \
  plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts
do
  url="$base/$path"
  echo "=== $url ==="
  body="$(curl -ksSfL "$url" || true)"
  if [ -z "$body" ]; then
    echo "FETCH_ERROR_OR_EMPTY"
    continue
  fi
  printf '%s\n' "$body" | nl -ba | grep -E -C 8 'catalog\.rules|rules|applyMutation|EntityProvider|location' || true
done

Repository: openchoreo/openchoreo.github.io

Length of output: 889


🏁 Script executed:

#!/bin/bash
set -eu
base='https://raw.githubusercontent.com/backstage/backstage/v1.51.0'
for path in \
  plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts \
  plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts \
  plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts \
  plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts
do
  url="$base/$path"
  echo "=== $url ==="
  curl -ksSfL "$url" | grep -E -C 8 'catalog\.rules|rules|applyMutation|EntityProvider|location' || true
done

Repository: openchoreo/openchoreo.github.io

Length of output: 8904


🏁 Script executed:

#!/bin/bash
set -eu
python3 - <<'PY'
import json, ssl, urllib.request

ctx = ssl._create_unverified_context()
url = 'https://api.github.com/repos/backstage/backstage/git/trees/v1.51.0?recursive=1'
req = urllib.request.Request(url, headers={'User-Agent': 'review-inspection'})
with urllib.request.urlopen(req, context=ctx, timeout=30) as response:
    tree = json.load(response)['tree']
for item in tree:
    path = item.get('path', '')
    if 'catalog-backend' in path and (
        'EntityProvider' in path or 'entityProvider' in path or
        'EntitiesCatalog' in path or 'CatalogService' in path or
        'rules' in path.lower()
    ):
        print(path)
PY

Repository: openchoreo/openchoreo.github.io

Length of output: 965


🏁 Script executed:

#!/bin/bash
set -eu
python3 - <<'PY'
import ssl, urllib.request

ctx = ssl._create_unverified_context()
base = 'https://raw.githubusercontent.com/backstage/backstage/v1.51.0/'
paths = [
    'plugins/catalog-backend/src/service/DefaultCatalogService.ts',
    'plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts',
    'plugins/catalog-backend/src/providers/EntityProviderConnection.ts',
    'plugins/catalog-backend/src/providers/EntityProviderManager.ts',
]
for path in paths:
    url = base + path
    print(f'=== {url} ===')
    try:
        req = urllib.request.Request(url, headers={'User-Agent': 'review-inspection'})
        with urllib.request.urlopen(req, context=ctx, timeout=20) as response:
            lines = response.read().decode().splitlines()
    except Exception as exc:
        print(f'FETCH_ERROR: {exc}')
        continue
    for i, line in enumerate(lines, 1):
        if any(term in line for term in ('applyMutation', 'rulesEnforcer', 'deferredEntities', 'locationKey', 'originLocation')):
            lo, hi = max(1, i - 12), min(len(lines), i + 18)
            print('\n'.join(f'{n}: {lines[n-1]}' for n in range(lo, hi + 1)))
            print('---')
PY

Repository: openchoreo/openchoreo.github.io

Length of output: 10922


🏁 Script executed:

#!/bin/bash
set -eu
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
curl -ksSfL 'https://codeload.github.com/backstage/backstage/tar.gz/refs/tags/v1.51.0' -o "$tmp"
tar -tzf "$tmp" |
  grep -E 'catalog-backend/.+(EntityProvider|CatalogService|ProcessingManager|Database|rules)' |
  head -80

Repository: openchoreo/openchoreo.github.io

Length of output: 2115


🏁 Script executed:

#!/bin/bash
set -eu
tmp="$(mktemp)"
dir="$(mktemp -d)"
trap 'rm -f "$tmp"; rm -rf "$dir"' EXIT
curl -ksSfL 'https://codeload.github.com/backstage/backstage/tar.gz/refs/tags/v1.51.0' -o "$tmp"
tar -xzf "$tmp" -C "$dir"
root="$(find "$dir" -maxdepth 1 -type d -name 'backstage-*' -print -quit)"
grep -R -n -E -C 8 'applyMutation|rulesEnforcer|deferredEntities|locationKey' \
  "$root/plugins/catalog-backend" \
  --include='*.ts' --include='*.tsx' | head -300

Repository: openchoreo/openchoreo.github.io

Length of output: 38424


🏁 Script executed:

#!/bin/bash
set -eu
tmp="$(mktemp)"
dir="$(mktemp -d)"
trap 'rm -f "$tmp"; rm -rf "$dir"' EXIT
curl -ksSfL 'https://codeload.github.com/backstage/backstage/tar.gz/refs/tags/v1.51.0' -o "$tmp"
tar -xzf "$tmp" -C "$dir"
root="$(find "$dir" -maxdepth 1 -type d -name 'backstage-*' -print -quit)"

echo '=== applyMutation and provider connection ==='
grep -R -n -E -C 15 'applyMutation|EntityProviderConnection|connectEntityProviders' \
  "$root/plugins/catalog-backend" "$root/packages/catalog-node" \
  --include='*.ts' --include='*.tsx' | head -500

echo '=== relevant catalog service files ==='
find "$root/plugins/catalog-backend/src" -type f \
  \( -iname '*catalog*' -o -iname '*provider*' -o -iname '*refresh*' \) \
  -print | sort

Repository: openchoreo/openchoreo.github.io

Length of output: 50387


Remove the catalog.rules.allow requirement for EntityProvider entities.

Backstage 1.51.0 does not apply catalog.rules to entities submitted through EntityProviderConnection.applyMutation. Update catalog-sync.mdx and its troubleshooting guidance. Keep installing-into-existing-backstage.mdx and troubleshooting.mdx consistent. Retain catalog.rules guidance only for static catalog.locations.

📍 Affects 2 files
  • docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx#L637-L639 (this comment)
  • docs/platform-engineer-guide/backstage-plugins/troubleshooting.mdx#L279-L282
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@docs/platform-engineer-guide/backstage-plugins/installing-into-existing-backstage.mdx`
around lines 637 - 639, Update the catalog rules guidance in catalog-sync.mdx,
installing-into-existing-backstage.mdx, and troubleshooting.mdx so
catalog.rules.allow is not required for EntityProvider entities submitted
through EntityProviderConnection.applyMutation. Retain the requirement only for
static catalog.locations, and keep the installation and troubleshooting
explanations consistent across all three files.

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