Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ RHO_DAEMON_API_KEY=
# The following are NOT read by rho — setting them has no effect:
# RHO_DAEMON_PORT / RHO_DAEMON_HOST — daemon binds 127.0.0.1:4590;
# override with the --host / --port flags (see `rho daemon start --help`)
# EYRIE_API_KEY / EYRIE_BASE_URL, HARRIER_API_KEY / HARRIER_ADDR —
# FLUX_API_KEY / FLUX_BASE_URL, HARRIER_API_KEY / HARRIER_ADDR —
# consumed by sibling services, not by this binary
# See docs/user-guide/05-configuration.md for the full precedence chain.
34 changes: 17 additions & 17 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ concurrency:

env:
GO_VERSION: "1.26.6"
# Module resolution: eyrie is the only GrayCodeAI module dependency and it is
# Module resolution: flux is the only GrayCodeAI module dependency and it is
# published on the public proxy. Direct-VCS fallback is retained for anything
# else.
GOPROXY: "https://proxy.golang.org,direct"
Expand All @@ -29,7 +29,7 @@ env:
# Go's reference is explicit that a committed go.work "may cause a continuous
# integration (CI) system to select and thus test the wrong versions of a
# module's dependencies" and that "CI systems should generally not be allowed to
# use the go.work file". Because ./.github/actions/checkout-eyrie clones the
# use the go.work file". Because ./.github/actions/checkout-flux clones the
# siblings at branch HEAD into the workspace parent, workspace mode would silently
# hide version skew (e.g. a shared pin that no longer matches).
# The `module` job opts back in (GOWORK: "auto") since `go work sync` and the
Expand Down Expand Up @@ -73,10 +73,10 @@ jobs:
run: bash ./scripts/check-ecosystem-boundaries.sh
- name: internal layer boundary guard
run: bash ./scripts/check-internal-layer-imports.sh
- name: eyrie client boundary guard
run: bash ./scripts/check-eyrie-client-imports.sh
- name: eyrie engine facade boundary guard
run: bash ./scripts/check-eyrie-engine-boundary.sh
- name: flux client boundary guard
run: bash ./scripts/check-flux-client-imports.sh
- name: flux engine facade boundary guard
run: bash ./scripts/check-flux-engine-boundary.sh

# -------------------------------------------------------------------------
# 2. Module hygiene — tidy, verify Rho plus the sibling Go modules via go.work.
Expand All @@ -94,7 +94,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref == 'feat/ecosystem-wiring-pr' && 'feat/ecosystem-wiring' || github.head_ref || github.ref_name }}
- name: Generate ecosystem workspace
Expand Down Expand Up @@ -145,7 +145,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand All @@ -168,7 +168,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand All @@ -187,7 +187,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand All @@ -212,7 +212,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down Expand Up @@ -241,7 +241,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down Expand Up @@ -311,7 +311,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down Expand Up @@ -419,7 +419,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c
Expand Down Expand Up @@ -477,7 +477,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down Expand Up @@ -522,7 +522,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down Expand Up @@ -552,7 +552,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/compatibility-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
fetch-depth: 0 # goreleaser needs full history for changelog

# Releases build against the sibling repos resolved via the workspace go.work.
- uses: ./.github/actions/checkout-eyrie
- uses: ./.github/actions/checkout-flux
with:
ref: ${{ github.ref_name }}

Expand Down
2 changes: 1 addition & 1 deletion .shared-templates/docs/coverage-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ repo's threshold, update both the CI file and this table in the same PR.**
| Repo | Threshold | Mechanism |
|---|---|---|
| `rho` | 65% | inline `bc` check in `ci.yml` |
| `eyrie` | 60% | inline `bc` check in `ci.yml` |
| `flux` | 60% | inline `bc` check in `ci.yml` |
| `graycode-skills` | n/a | no Go/Python test suite (skill/content registry) |

## Why thresholds differ per repo
Expand Down
4 changes: 2 additions & 2 deletions .shared-templates/scripts/check-ecosystem-boundaries.sh.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

# =============================================================================
# VARIANT 1 — Support engine (eyrie, harrier, shrike, swift, kestrel, merlin).
# VARIANT 1 — Support engine (flux, harrier, shrike, swift, kestrel, merlin).
# Engines are peers: they may depend on falcon,
# but never on rho/internal/* or another engine.
# =============================================================================
Expand Down Expand Up @@ -81,7 +81,7 @@ echo "ecosystem boundary guard passed"
# only — never on a support engine directly, and never on rho/internal.
# =============================================================================
#
# FORBIDDEN_ENGINES='github\.com/GrayCodeAI/(eyrie|harrier|shrike|swift|kestrel|merlin)(/|")'
# FORBIDDEN_ENGINES='github\.com/GrayCodeAI/(flux|harrier|shrike|swift|kestrel|merlin)(/|")'
# FORBIDDEN_INTERNAL='github\.com/GrayCodeAI/rho/internal'
#
# (same rg/grep + report pattern as Variant 1, naming "SDKs/skills must go
Expand Down
4 changes: 2 additions & 2 deletions .shared-templates/workflows/go-release.yml.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ jobs:
fetch-depth: 0 # goreleaser needs full history for changelog

# Only needed if this repo has local workspace dependencies on other
# graycode-eco repos at build time (rho itself clones eyrie this way via
# ./.github/actions/checkout-eyrie). Omit for repos with none.
# graycode-eco repos at build time (rho itself clones flux this way via
# ./.github/actions/checkout-flux). Omit for repos with none.

- name: Set up Go
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
Expand Down
8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ alwaysApply: false
# Extending rho

rho is an open-source code intelligence platform. It lives in the `graycode-eco`
workspace alongside the ecosystem repos that power it (`eyrie`,
workspace alongside the ecosystem repos that power it (`flux`,
`shrike`, `harrier`, `swift`, `kestrel`, `merlin`). This document describes how to extend
rho with custom tools, skills, hooks, and integrations.

Expand Down Expand Up @@ -192,8 +192,8 @@ Cross-repo severity and finding contracts now live in rho's `internal/contracts`
### Architecture note: provider ownership

Implement provider protocols, adapters, catalog metadata, credential mappings, and
provider contract tests in `../eyrie` (the eyrie engine's repo) first. Rho consumes providers only
through Eyrie's stable engine facade; Rho changes should be limited to host UX
provider contract tests in `../flux` (the flux engine's repo) first. Rho consumes providers only
through Flux's stable engine facade; Rho changes should be limited to host UX
and facade integration. Concentrate AI is a pay-as-you-go gateway implemented
with its native Responses API (`/v1/responses`) under the
`concentrate-payg` deployment.
Expand Down Expand Up @@ -245,7 +245,7 @@ This project is indexed by GitNexus as **rho** (97743 symbols, 322940 relationsh

### Workspace workflow (sibling repos)

rho depends on ecosystem repos (`eyrie`, etc.) as independent sibling repos in the `graycode-eco` workspace. Rho's `go.work` lists them as `../<repo>`, so local changes in any sibling are automatically picked up by rho. Each sibling is its own git repo, versioned and released independently.
rho depends on ecosystem repos (`flux`, etc.) as independent sibling repos in the `graycode-eco` workspace. Rho's `go.work` lists them as `../<repo>`, so local changes in any sibling are automatically picked up by rho. Each sibling is its own git repo, versioned and released independently.

1. Edit + test in `../<repo>` — run its tests, run `make test` in rho
2. Push from the sibling: `git push origin <branch>`
Expand Down
25 changes: 17 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed
- **Dependency renamed eyrie → flux**: rho now depends on
`github.com/GrayCodeAI/flux v0.0.1` (the provider runtime was renamed).
All imports, env vars (`EYRIE_CONFIG_DIR` → `FLUX_CONFIG_DIR`,
`EYRIE_MODEL_CATALOG_PATH` → `FLUX_MODEL_CATALOG_PATH`), boundary-guard
scripts, ecosystem manifest entries, docs, and internal identifiers were
renamed to match. User state paths move from `~/.../eyrie/provider.json`
to `~/.../flux/provider.json`.

### Security
- **Session lock TOCTOU eliminated**: `AcquireLock`'s stat → stale-if->5min → remove → O_EXCL dance could delete a live lock on misjudged staleness and let two instances open the same session. Mutual exclusion now uses an OS advisory lock (`gofrs/flock`, promoted to a direct dependency); a crashed holder's lock is reclaimed instantly because the kernel drops the flock at process death. The lock file keeps PID/timestamps purely as diagnostics.
- **Hardened atomic writes for state files**: global settings, checkpoint file contents and restores, handovers, and named checkpoints now go through `internal/safewrite` (same 0600 mode as before, plus fsync+rename atomicity and symlink refusal at the destination).
Expand All @@ -22,20 +31,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Removed
- **BREAKING — `rho credentials migrate` removed**: the subcommand, its man page entry, and the `MigrateEnvFileCredentials` wrappers are gone, and `rho path` no longer reports legacy `~/.rho/env` / `~/.rho/.env` files. Save keys through `/config`.
- **BREAKING — settings model/provider migration removed**: `LoadSettings` no longer moves `model`/`provider` from `settings.json` into Eyrie's `provider.json`, and `SetActiveSelection` is deleted. Stale `model`/`provider` values left in `settings.json` are now ignored on load (Eyrie's selection wins; `--settings` overrides still apply); select the model in `/config`.
- **BREAKING — settings model/provider migration removed**: `LoadSettings` no longer moves `model`/`provider` from `settings.json` into Flux's `provider.json`, and `SetActiveSelection` is deleted. Stale `model`/`provider` values left in `settings.json` are now ignored on load (Flux's selection wins; `--settings` overrides still apply); select the model in `/config`.
- **BREAKING — startup provider-secrets migration removed**: print/REPL/watch/TUI startup no longer calls `MigrateProviderSecrets`, and the method is dropped from the gateway `CatalogMaintenance` interface. `rho path` still fails when `provider.json` holds secrets; remove those fields manually.
- **BREAKING — `shared/types` guards removed**: `scripts/check-shared-types-imports.sh`, the `contracts-guard` make target, its lefthook and CI steps, and the matching testaudit checks are deleted because the package no longer exists. The ecosystem boundary guards still block `rho/internal` imports.

## [0.2.0] — 2026-07-13

### Changed
- **Rho/Eyrie production boundary completed**: Rho owns the product face,
sessions, tools, permissions, and public schemas while Eyrie v0.2.1 owns
- **Rho/Flux production boundary completed**: Rho owns the product face,
sessions, tools, permissions, and public schemas while Flux v0.2.1 owns
credentials, catalog resolution, provider transport, resilience, and usage
telemetry behind the stable `eyrie/engine` facade.
telemetry behind the stable `flux/engine` facade.
- **Provider routing and usage attribution hardened**: resolved route changes,
continuation segments, and terminal usage are propagated without duplicate
accounting, and production Eyrie calls use exactly one resilience layer.
accounting, and production Flux calls use exactly one resilience layer.
- **Daemon conversations are durable**: JSON and SSE chat requests create or
resume persisted sessions, expose stable session IDs, preserve metadata, and
distinguish invalid, missing, and corrupt state.
Expand All @@ -48,8 +57,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **`--permission-mode` CLI flag removed**; `--dangerously-skip-permissions` unchanged (now maps to the Autonomous tier). New `--dry-run` flag added as an unconditional kill switch (deny every tool call, regardless of tier or spec stage) — replaces `dontAsk`'s hard-lockout role.
- **Version re-baselined to `0.1.0`** across `cmd/rho/main.go`, `cmd/daemon.go`,
`flake.nix`, `.github/workflows/release.yml`, and the `update`/daemon test suites, aligning rho
with the rest of the GrayCodeAI ecosystem (`eyrie`, `shrike`, `harrier`, `kestrel`, `merlin`).
- **Architecture boundary hardening**: Rho now owns runtime request/response DTOs, transport config/provider seams, and review/verification product-boundary contracts, with `eyrie/client` usage restricted to internal adapters and guarded in CI.
with the rest of the GrayCodeAI ecosystem (`flux`, `shrike`, `harrier`, `kestrel`, `merlin`).
- **Architecture boundary hardening**: Rho now owns runtime request/response DTOs, transport config/provider seams, and review/verification product-boundary contracts, with `flux/client` usage restricted to internal adapters and guarded in CI.
- **`shared/types` removed**: Rho no longer ships the old shared type path, and local boundary checks now block any attempt to reintroduce it.

### Added
Expand Down Expand Up @@ -237,5 +246,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Project scaffold with cobra CLI and Bubbletea TUI
- Interactive chat REPL with textarea input, spinner, lipgloss styling
- eyrie wired as LLM provider dependency
- flux wired as LLM provider dependency
- GitHub Actions CI
12 changes: 6 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ GORELEASER := $(GOBIN_DIR)/goreleaser
# ---------------------------------------------------------------------------
# Phony declarations (alphabetical).
# ---------------------------------------------------------------------------
.PHONY: all bench boundaries build check-replace ci clean ecosystem-guard eyrie-client-guard eyrie-engine-guard manifest-guard peer-guard internal-layers-guard package-boundaries-guard release-parity cover cover-new fmt help install lint lint-fix \
.PHONY: all bench boundaries build check-replace ci clean ecosystem-guard flux-client-guard flux-engine-guard manifest-guard peer-guard internal-layers-guard package-boundaries-guard release-parity cover cover-new fmt help install lint lint-fix \
release security setup smoke path sync test test-10x test-live test-new test-race tidy version vet api-docs api-validate workspace

check-replace: ## Fail if go.mod has local replace directives (run before tagging)
Expand Down Expand Up @@ -121,11 +121,11 @@ vet: ## Run go vet.
ecosystem-guard: ## Fail if external ecosystem repos import rho/internal.
bash ./scripts/check-ecosystem-boundaries.sh

eyrie-client-guard: ## Fail on any production eyrie/client import.
bash ./scripts/check-eyrie-client-imports.sh
flux-client-guard: ## Fail on any production flux/client import.
bash ./scripts/check-flux-client-imports.sh

eyrie-engine-guard: ## Require all production Eyrie imports to use the stable engine facade.
bash ./scripts/check-eyrie-engine-boundary.sh
flux-engine-guard: ## Require all production Flux imports to use the stable engine facade.
bash ./scripts/check-flux-engine-boundary.sh

peer-guard: ## Fail if support engines import each other instead of depending only on Rho contracts.
bash ./scripts/check-support-repo-coupling.sh
Expand All @@ -136,7 +136,7 @@ internal-layers-guard: ## Enforce one-way dependencies across stable Rho interna
package-boundaries-guard: ## Enforce AST/package-graph boundaries with file/line diagnostics.
bash ./scripts/check-package-boundaries.sh

boundaries: manifest-guard check-replace ecosystem-guard eyrie-client-guard eyrie-engine-guard peer-guard internal-layers-guard package-boundaries-guard ## Alias for all boundary guards (matches `make boundaries` in engine repos).
boundaries: manifest-guard check-replace ecosystem-guard flux-client-guard flux-engine-guard peer-guard internal-layers-guard package-boundaries-guard ## Alias for all boundary guards (matches `make boundaries` in engine repos).

release-parity: ## Verify every go.mod ecosystem version resolves to a reachable remote commit.
bash ./scripts/check-module-release-parity.sh
Expand Down
Loading
Loading