Skip to content

Commit 5abb0ce

Browse files
committed
fix: the canonical inventory is no longer inside this repo
ecosystem.yaml described itself as canonical and instructed all tooling to read it. That is the wrong shape: a product cannot own the registry of its siblings, because a product can rename itself. That is exactly what happened. The organization holds hawk and eyrie as redirects from the prior names of rho and flux, and neither rename touched the file that claimed to be the source of truth for repository names. The list also omitted beam outright. The inventory moves to GrayCodeAI/graycode-eco, a repository that is not a product. ecosystem.yaml stays here as a deprecated fallback, clearly marked and incomplete, so a standalone build of rho outside the ecosystem workspace still resolves its siblings. scripts/ecosystem-manifest.sh becomes the single reader: it prefers the roof and falls back to the local copy, warning that the fallback is not canonical. No caller needed to change, and none did. The manifest validator, workspace generation, release parity, and both GitHub composite actions all keep working unchanged. Verified: validate reports 10 repositories, list workspace yields rho and flux, generate-workspace produces the expected go.work, and release parity resolves flux to bd41f29a0dc8.
1 parent 0744164 commit 5abb0ce

7 files changed

Lines changed: 98 additions & 18 deletions

File tree

‎README.md‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -519,10 +519,19 @@ You may keep a **personal** parent **`go.work`** that lists alternate clones on
519519
| **graycode-skills** | [GrayCodeAI/graycode-skills](https://github.com/GrayCodeAI/graycode-skills) | Community skill registry |
520520
| **graycode-platform** | [GrayCodeAI/graycode-platform](https://github.com/GrayCodeAI/graycode-platform) | Web, BFF, and Rho Cloud |
521521

522-
`ecosystem.yaml` is the canonical inventory of repositories cloned as
523-
siblings in this local workspace; tooling reads it rather than carrying its
524-
own repo-name list. `flux` is the only Go module dependency outside this
525-
repo; it is consumed through its stable engine facade.
522+
The canonical inventory of sibling repositories is
523+
[`GrayCodeAI/graycode-eco/ecosystem.yaml`](https://github.com/GrayCodeAI/graycode-eco/blob/main/ecosystem.yaml),
524+
not the `ecosystem.yaml` in this repo, which is deprecated and incomplete. The
525+
inventory moved because a product must not own the registry of its siblings: it
526+
lived here, `rho` was renamed from `hawk` without signalling the other nine
527+
repositories, and the list silently omitted `beam`. See
528+
[graycode-eco/adr/0001](https://github.com/GrayCodeAI/graycode-eco/blob/main/adr/README.md).
529+
530+
`scripts/ecosystem-manifest.sh` reads the roof's file and falls back to the
531+
deprecated local copy only when the roof is not checked out alongside.
532+
533+
`flux` is the only Go module dependency in the entire ecosystem; it is consumed
534+
through its stable engine facade.
526535

527536
For the consolidated repo map and the current-vs-proposed architecture diagrams, see [docs/architecture/rho-current-vs-proposed.md](docs/architecture/rho-current-vs-proposed.md).
528537
For execution-graph ownership, automatic capture seams, and export/sync

‎docs/COMPETITIVE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ External star counts below are approximate web-search snapshots (2026-09-08), no
6363

6464
1. **Traction.** rho has no star-moat (pre-release). Leaders won via day-1 provider-agnostic + one-liner install + Web/Desktop alongside TUI. rho already ships script/brew/npm paths (`README.md:48-59`) — keep, don't add Desktop.
6565
2. **Language/distro.** Go+MIT+zero-CGO (`Makefile:54`, `go.mod:3`) matches `gh/fzf/lazygit` enterprise-safe profile. Avoid GPL/EUPL patterns (kitty/eza). Rust wave wins on published benchmarks — rho has `make bench` but publishes none (Gap-04).
66-
3. **Providers.** rho routes only via `flux/engine` facade (`docs/SECURITY-DEVELOPER.md:51-56`, `ecosystem.yaml:29-30`); custom OpenAI-compat supported (`internal/config/settings.go:50`). Count messaging ("28 first-class" per README) trails OpenCode 75+ / Hermes 300+ — fix by exposing catalog count dynamically, not by forking providers into CLI (ownership lives in router per AGENTS.md).
66+
3. **Providers.** rho routes only via `flux/engine` facade (`docs/SECURITY-DEVELOPER.md:51-56`; facade declared in `GrayCodeAI/graycode-eco/ecosystem.yaml`); custom OpenAI-compat supported (`internal/config/settings.go:50`). Count messaging ("28 first-class" per README) trails OpenCode 75+ / Hermes 300+ — fix by exposing catalog count dynamically, not by forking providers into CLI (ownership lives in router per AGENTS.md).
6767
4. **TUI/UX.** Bubble Tea v2 + vim keys + `/autonomy` + `/spec` + watch `AI!`/`AI?` + visual diff is competitive. Missing vs field: hosted share-link (ours is local `rho://` deeplink), multi-session grid (we have `mission` worktrees + daemon — unsurfaced like herdr/cmux). Gap-02.
6868
5. **Execution safety.** Host execution keeps onboarding simple, but requires strong permission, path, approval, and audit controls. Keep those controls explicit and testable; do not add a hidden execution backend.
6969
6. **Memory/context.** AST repomap + Harrier graph + compaction segments + relevance-prune + conversation-arc + 80% tool-result clearing exceeds most. Missing: Hermes-style auto-skill learning loop (we have curator archive + harness — surface it).

‎docs/ECOSYSTEM-WIRING.md‎

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
# GrayCode ecosystem wiring
22

3-
> **STALE (2026-09-18):** Diagrams below predate `eagle` removal (2026-09-04) and list 14 repos / 6 engines. Canonical inventory is `ecosystem.yaml` (now 6 repos: `rho`, `flux`, `graycode-skills`, `graycode-platform`, `rover`, `across`). Use that for workspace/boundary checks. See `PLAN.md` at eco root for remediation.
3+
> **STALE (2026-09-18):** Diagrams below predate `eagle` removal (2026-09-04) and list 14 repos / 6 engines.
44
> NOTE (2026-09-04): `eagle` contracts vendored into `rho/internal/contracts`.
5+
> **INVENTORY MOVED (2026-10-02):** the canonical machine-readable inventory is
6+
> [`GrayCodeAI/graycode-eco/ecosystem.yaml`](https://github.com/GrayCodeAI/graycode-eco/blob/main/ecosystem.yaml)
7+
> (10 products, including `beam`). The `ecosystem.yaml` in this repo is
8+
> deprecated and incomplete. Use that file for workspace and boundary checks;
9+
> `scripts/ecosystem-manifest.sh` already reads it.
510
6-
This document is the historical implementation contract. `ecosystem.yaml` is the canonical machine-readable inventory.
11+
This document is the historical implementation contract.
712

813
## Current state before this change
914

@@ -37,7 +42,7 @@ durable Queue-delivery intent.
3742

3843
```mermaid
3944
flowchart TB
40-
Manifest[rho/ecosystem.yaml\ncanonical repo and contract inventory]
45+
Manifest[GrayCodeAI/graycode-eco/ecosystem.yaml\ncanonical repo and contract inventory]
4146
Manifest --> Workspace[generated root go.work]
4247
Manifest --> Guards[boundary and release parity guards]
4348
Manifest --> OwlSnapshot[owl/ecosystem.json]
@@ -102,8 +107,9 @@ must use `directory`/`github_repo`; UI copy may use `product_name`.
102107

103108
## Contract and event flow
104109

105-
1. Engine packages expose only the facade declared in `ecosystem.yaml`; the
106-
manifest validator rejects a missing or out-of-module facade.
110+
1. Engine packages expose only the facade declared in the canonical inventory
111+
(`GrayCodeAI/graycode-eco/ecosystem.yaml`); the manifest validator rejects a
112+
missing or out-of-module facade.
107113
2. Eagle commit `9d358dde4ad8` is the cross-repository contract revision, pinned
108114
through its reachable Go pseudo-version until the next semver tag is published;
109115
the parity gate checks every declared consumer.

‎docs/README.md‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Rho Documentation
22

3-
Index for `rho/docs/`. `ecosystem.yaml` is the canonical repo inventory; `ECOSYSTEM-WIRING.md` is historical.
3+
Index for `rho/docs/`. The canonical repo inventory is
4+
[`GrayCodeAI/graycode-eco/ecosystem.yaml`](https://github.com/GrayCodeAI/graycode-eco/blob/main/ecosystem.yaml)
5+
— the `ecosystem.yaml` in this repo is deprecated and incomplete, and
6+
`ECOSYSTEM-WIRING.md` is historical.
47

58
- **Architecture** `architecture/README.md` + `architecture.md`
69
- **User Guide** `user-guide/` (skills, slash commands, permissions)

‎ecosystem.yaml‎

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,39 @@
1+
# DEPRECATED — the canonical inventory moved.
2+
#
3+
# This file is no longer the source of truth. As of 2026-10-02 the canonical
4+
# inventory is:
5+
#
6+
# GrayCodeAI/graycode-eco -> ecosystem.yaml
7+
#
8+
# Why it moved: a product cannot own the registry of its siblings. This file
9+
# lived inside `rho` and described itself as canonical, which meant `rho` could
10+
# rename itself without signalling the other nine repositories. It did exactly
11+
# that — the organization holds `hawk` and `eyrie` as redirects from the prior
12+
# names of `rho` and `flux`. The list also omitted `beam` entirely.
13+
#
14+
# What is still true below, and what is not:
15+
#
16+
# - The `contracts` block is accurate and is now maintained in the roof.
17+
# - The repository list is INCOMPLETE: `beam` is missing, and `lean-prover`
18+
# and `graycode-logo` are unaccounted for.
19+
# - `tracks_eagle` and other historical fields describe a removed ecosystem.
20+
#
21+
# Consumers should migrate:
22+
#
23+
# scripts/ecosystem-manifest.sh reads this file
24+
# scripts/generate-workspace.sh calls the above
25+
# scripts/check-module-release-parity.sh reads this file
26+
# .github/actions/checkout-flux calls the above
27+
# .github/actions/setup-deps calls the above
28+
#
29+
# The migration keeps `rho/scripts/ecosystem-manifest.sh` as the single reader,
30+
# repointed at the roof's file, with a fallback to this one when the roof is not
31+
# checked out. The scripts do not need to know where the manifest lives.
32+
#
33+
# See graycode-eco/adr/0001 for the decision and the reasoning.
34+
135
schema_version: 1
236

3-
# Canonical repository inventory for the GrayCodeAI ecosystem. Repository
4-
# directories and GitHub repository names are listed per repository;
5-
# product_name records the user-facing capability. Tooling must consume this
6-
# file instead of carrying its own repo-name list. Only repositories that
7-
# exist are listed: removed siblings stay out until they are restored.
837
contracts:
938
portable_graph_schema: rho.graph/v1
1039
cloud_graph_schema: graycode-cloud.graph/v1

‎scripts/check-module-release-parity.sh‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,14 @@ set -euo pipefail
77
# Run from the Rho repository root.
88

99
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
10-
MANIFEST="${ROOT_DIR}/ecosystem.yaml"
10+
ECO_DIR="$(cd "${ROOT_DIR}/.." && pwd)"
11+
# Prefer the roof's manifest; fall back to the deprecated in-product copy.
12+
# See scripts/ecosystem-manifest.sh and graycode-eco/adr/0001.
13+
if [[ -f "${ECO_DIR}/graycode-eco/ecosystem.yaml" ]]; then
14+
MANIFEST="${ECO_DIR}/graycode-eco/ecosystem.yaml"
15+
else
16+
MANIFEST="${ROOT_DIR}/ecosystem.yaml"
17+
fi
1118
repos=()
1219
while IFS= read -r repo; do
1320
[[ "${repo}" != "rho" && -n "${repo}" ]] && repos+=("${repo}")

‎scripts/ecosystem-manifest.sh‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,29 @@ set -euo pipefail
33

44
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
55
ECO_DIR="$(cd "${ROOT_DIR}/.." && pwd)"
6-
MANIFEST="${ROOT_DIR}/ecosystem.yaml"
6+
7+
# The canonical inventory lives in GrayCodeAI/graycode-eco, not in a product.
8+
# A tenant must not own the registry of its siblings: rho was renamed from hawk
9+
# without signalling the other nine repositories, and the in-product copy of
10+
# this list silently omitted beam. See graycode-eco/adr/0001.
11+
#
12+
# Prefer the roof. Fall back to the deprecated in-product copy only when the
13+
# roof is not checked out alongside, which happens for a standalone `go build`
14+
# of rho outside the ecosystem workspace. Callers do not need to know which one
15+
# was used.
16+
ROOF_MANIFEST="${ECO_DIR}/graycode-eco/ecosystem.yaml"
17+
LEGACY_MANIFEST="${ROOT_DIR}/ecosystem.yaml"
18+
19+
if [[ -f "${ROOF_MANIFEST}" ]]; then
20+
MANIFEST="${ROOF_MANIFEST}"
21+
elif [[ -f "${LEGACY_MANIFEST}" ]]; then
22+
MANIFEST="${LEGACY_MANIFEST}"
23+
echo "WARNING: graycode-eco is not checked out; falling back to the deprecated ${LEGACY_MANIFEST#"${ROOT_DIR}/"}" >&2
24+
echo "WARNING: it is incomplete (no beam) and must not be treated as canonical" >&2
25+
else
26+
echo "manifest not found: looked for ${ROOF_MANIFEST} and ${LEGACY_MANIFEST}" >&2
27+
exit 1
28+
fi
729

830
usage() {
931
echo "usage: $0 validate | json | list <all|workspace|engines>" >&2
@@ -14,6 +36,10 @@ usage() {
1436

1537
records() {
1638
awk '
39+
# Records are the entries under `repositories:`. The roof manifest also has
40+
# a `not_products:` block listing repositories in the GitHub organization
41+
# that are deliberately not ecosystem products; those entries have no
42+
# `directory:` key and are therefore skipped here, which is the intent.
1743
function flush() {
1844
if (directory != "") {
1945
if (module == "") module = "-"

0 commit comments

Comments
 (0)