Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a11beb-4eef-7fc1-94a7-597130a01ae9
119 lines
7 KiB
Markdown
119 lines
7 KiB
Markdown
# Anonymous forge consumers — ORGREF-WP-0002-T02
|
|
|
|
Machine-readable result: `access-consumers-2026-10-08.json`. Reproduce:
|
|
|
|
```bash
|
|
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.
|