prj-forgejo-org-refactor/inventory/access-consumers.md
tegwick 57ad4abefc Fix access inventory evidence and reconcile closure coordination
Assistant: codex
Assistant-Model: gpt-6.1-sol
Assistant-Session: 01a11beb-4eef-7fc1-94a7-597130a01ae9
2026-10-09 00:23:04 +02:00

7 KiB

Anonymous forge consumers — ORGREF-WP-0002-T02

Machine-readable result: access-consumers-2026-10-08.json. Reproduce:

python3 tools/runtime_inventory.py --output inventory/runtime-2026-10-08.json
python3 tools/access_consumers.py --root /home/worsch \
  --runtime inventory/runtime-2026-10-08.json \
  --output inventory/access-consumers-2026-10-08.json

Read-only: 161 local working trees scanned, plus a fresh runtime capture (runtime-2026-10-08.json: 135 controllers, 10 Applications, 7 AppProjects). Secrets and node registry configuration were not inspected.

What breaks when repositories and packages go private

Class Count Reads Will need
cluster-image-pull 43 workloads container images from the Forgejo registry, none with imagePullSecrets node-level registry auth (k3s registries.yaml has none for the forge, founder check below) or pull credentials per namespace. Anonymous pulls confirmed working on 2026-10-08: anonymous registry token issued, tag list 200
cluster-gitops 10 ArgoCD applications over 5 repos Git: railiance-platform (6 apps), activity-core, informed-decision, state-hub, target-revenue ArgoCD repository credentials: none exist today (founder check below)
ci-runner about 20 repos own-source tarballs and cross-repo tarballs, anonymously (below) job token for the own repository, a scoped read token across repositories
package index kaizen-agentic, vergabe-teilnahme PyPI simple/ index without credentials package-read token
federation reuse-surface about 60 capability indexes by raw URL read identity, or a published index location
code readers about 8 files, below clones, API and raw reads without token handling owner review; re-point to an authenticated path
campaign images pr-hall-of-helix, fluid-telegram Telegram fetching post images by raw URL adapter fetches privately and uploads to Telegram (accepted policy; FT-WP-0001-T14)

Lower risk: repo-gitops and repo-image-reference are the cluster consumers seen from their source repos. doc-link means links break for the public, not consumers. record-or-test is evidence and fixtures.

Per-entry review, 2026-10-08

CI: anonymous source tarballs (breaks). Workflows download their own source with plain curl/wget from /${GITHUB_REPOSITORY}/archive/<sha>.tar.gz, with no credentials: access-engine, activity-core, core-hub, coulomb-social, email-connect, glas-harness, hub-core, issue-core, kaizen-agentic, key-cape, net-kingdom, railiance-platform, reuse-surface, sbom-nexus, state-hub, tenant-engine, the-custodian, user-engine, vergabe-teilnahme. Cross-repo fetches as well: core-hub → hub-core, glas-harness → sand-boxer, state-hub → extra repos. Work-record workflows (binky-control, repo-seed, runbook-tutorials) call the forge base URL too. Fix: send the job token (Authorization: token ${{ github.token }}) for the job's own repository, and a scoped read token for cross-repo fetches. Registry pushes in the same workflows are already authenticated.

Package indexes: anonymous reads (breaks). PyPI simple/ used without credentials: kaizen-agentic install docs, and vergabe-teilnahme pyproject.toml / uv.lock (issue-core 0.2.1). npm consumers (whynot-design, markitect testdrive-jsui) already send NPM_AUTH_TOKEN.

Federation: reuse-surface (breaks). registry/federation/sources.yaml fetches about 60 capability indexes by raw URL, anonymously.

Code readers with no token handling found. activity-core release_transport.py (https clone of activity-core and railiance-platform), owner_return_eligibility.py (forge API) and run_artifacts.py; sbom-nexus source_fetch.py; repo-manager source_ref.py; frontend-patterns reference_consume.py; state-hub scripts/verify_image_pin.py. Each owner confirms and re-points it. Token-aware already: state-hub forge_projection.py, railiance-platform forgejo_package_prune.py and its provisioning scripts. activity-core context resolvers are partly token-aware. Smoke probes of /v2/ (core-hub, ops-hub) only check reachability.

Not consumers. Runbooks, docs and evidence that mention URLs; gitea.coulomb.social references (frozen legacy host); kaizen-agentic project URLs and whynot-design's SSH repository field.

Not anonymous

All 160 local clones use SSH with the founder's key (forgejo-remote). They keep working as long as that account can read the repositories.

Historical founder checks

The October 8 results below are preserved as dated owner evidence. The original inline Secret template and registry-value-stripping commands are withdrawn: the estate forbids standalone go-template/jsonpath against real Secrets, and text stripping is not a reliable boundary for registry credentials. Do not repeat them. Obtain a current sanitized receipt from the platform/node owner; Secret annotation checks use the output-suppressing platform maintenance helper specified in the-custodian's agent environment orientation, section 6.

Results, 2026-10-08 (run by the founder)

  1. ArgoCD: no repository credentials. Empty output: no repository or repo-creds Secrets. All 10 Applications read the forge anonymously.
  2. k3s: no registry auth for the forge. registries.yaml exists with mirrors and configs.auth (username, password) only for 92.205.130.254:<port>, the frozen legacy Gitea host. The port was cut off by the value-stripping command. There is no entry for forgejo.coulomb.social, so all 43 image pulls are anonymous. One node-level configs."forgejo.coulomb.social".auth entry with a read-only package identity would cover all of them at once (T06). The stale Gitea credential on the node is a cleanup item for railiance-forge or railiance-infra.

Left to owners (tracked in T06, not T02)

  • Owners confirm the code readers listed under "no token handling found".
  • Consumers outside these working trees (external sites and links, other people's clones) cannot be found by scanning; T08's anonymous probe after each wave is the backstop.

Collector corrections — 2026-10-09

The retained October 8 JSON uses schema 0.1. Its anonymous_image_pulls field was an inference from absent pod pull-secret names; only the separate founder node-auth check supports the anonymous-access conclusion for that snapshot. Do not reuse this inference for another cluster or capture.

Schema 0.2 reports image_pulls_without_named_credentials, with access marked unknown until node/service-account credential evidence exists. It preserves forge hostnames, so legacy references stay separate, and classifies package API indexes as package consumers with null repository targets (package namespace is not repository identity). scan_exclusions and scan_error_count expose coverage limits; the coordinator is omitted to avoid self-referential output. Sensitive/encrypted, binary and symlinked paths are not read. The source scan is deterministic for unchanged inputs, but no claim of full consumer completeness or deployment state follows from matching outputs.