Inventory: per-repo dev tooling drift across the 19-repo fleet #1298

Open
opened 2026-08-27 03:25:09 +00:00 by coilyco-ops · 0 comments
Owner

Step 1 of normalizing the bespoke pull-request, commit, linter, and pre-commit tooling that repos have been growing individually. Read-only inventory, no changes made.

Scope: 19 local checkouts across coilyco-bridge, coilyco-flight-deck, coilyco-gaming, coilysiren. Excludes StrangeLoopGames/Eco (vendor) and any -workdir.

Headline

Pre-commit is already 90 percent normalized, and that is not the problem. 522 hook instances across 18 repos, only 51 defined locally, and 24 of those 51 are inside agentic-os itself where they are the catalog source rather than drift. Real drift is 27 local hooks across 8 repos.

The actual problem is that the shared layer is shared in name only. Seven different pins of the catalog, and nobody on latest.

Finding 1 - the catalog pin is scattered across seven revisions

  • aos-precommit-v0.18.0 - 7 repos - agent-proxy, agentic-os-hardware, agentic-os-kai, agentic-os-xxx, factory-game-v3, galaxy-gen, voice-corpus
  • aos-precommit-v0.24.0 - 3 repos - agent-compose, factorio-mods, sirens-echo
  • aos-precommit-v0.31.0 - 2 repos - infrastructure, lore
  • aos-precommit-v0.35.0 - 2 repos - eco-app, eco-ops
  • aos-precommit-v0.33.0 - 1 repo - eco-mods
  • v0.102.0 - 1 repo - deploy
  • v0.193.0 - 1 repo - steam-ops

Latest on that train is aos-precommit-v0.43.0. Zero repos are on it. The largest cohort is 25 releases behind, and since that train only advances when an installed hook input changes, every one of those is a real hook difference.

deploy and steam-ops pin the wrong train entirely. v* is the aos CLI series (275 tags) rather than the pre-commit series (43 tags). Those tags resolve, so nothing errors, but the hooks those two repos run are whatever .pre-commit-hooks.yaml happened to look like at an unrelated commit. That looks like a mistake rather than a decision.

This reframes the coupling worry. The current model already decouples repos from aos, arguably past the point of usefulness. The risk is not that dev flow is too attached to aos, it is that "the catalog suite" describes seven different suites.

Finding 2 - trufflehog runs twice in six repos

Every repo gets trufflehog from the catalog. Six of them also define a local one:

  • eco-app, eco-ops, galaxy-gen, infrastructure, sirens-echo, steam-ops

The local variant is identical in all six and is a different invocation from the catalog's:

trufflehog git file://. --since-commit HEAD --no-verification --no-update --fail

Catalog scans the filesystem offline, local scans git history since HEAD. Arguably complementary, but the doubling is visible in output (trufflehog appears twice in an infrastructure run) and nobody appears to have chosen it. Either fold the git-history scan into the catalog hook so all 17 repos get it, or drop the local copies.

Finding 3 - a fleet voice rule enforced in 2 of 19 repos, two different ways

em-dash-check exists only in agentic-os-hardware and agentic-os-kai. Same hook id, same entry (python scripts/check-em-dashes.py), and the scripts have already drifted: 87 lines versus 107, different hashes.

aos ships no em-dash validator at all. "No em-dashes" is a fleet-wide voice rule, so this is the clearest single candidate for promotion into the catalog. It is also a worked example of the failure mode: copy-paste a hook, and the copies diverge silently.

Finding 4 - no agreed name for "run the checks"

Every repo spells it differently:

  • just ci - agentic-os-hardware
  • just precommit - agentic-os-xxx
  • just pre-commit - infrastructure
  • just test ending in pre-commit run --all-files - agent-compose
  • pre-commit run --all-files direct in CI - lore
  • just build, policy-check, role-drift-check, test, test-skips, vet, plus full pre-commit - sirens-echo

Workflow filenames disagree too: ci.yml in 11 repos, hygiene.yml in factorio-mods and lore, lint.yml in infrastructure.

I checked for the obvious latent bug here and did not find it: no repo runs pre-commit run without --all-files in CI. The inconsistency is naming, not correctness.

Four repos have no justfile at all (agent-proxy, eco-ops, coilysiren, lore) despite the base instruction to route every dev command through one.

Finding 5 - what should stay local

These are genuine domain validators with no fleet analogue, and normalizing them would be the wrong move:

  • infrastructure - forgejo-runner-config, forgejo-runner-recycle, forgejo-storage-budget, k3s-registry-config, ansible-lint, pylint
  • agentic-os-kai - validate-harness-skills, repo-skill-projection, mcp-skill-generation
  • deploy - roles-bundle-artifact, discoverability-drift
  • eco-ops - server-ad-golden, reddit-ad-golden
  • agent-compose - role-palette-snapshot
  • agentic-os-hardware - pipeline-idempotent
  • sirens-echo - prompt-snapshot

Finding 6 - the language-toolchain gap, which is where sirens-echo stands out

Go hygiene is implemented twice, in two repos, with seven hook ids and zero sharing:

  • sirens-echo - gofmt, go-vet, go-mod-tidy
  • agentic-os - warp-gofmt, warp-go-vet, aos-say-gofmt, aos-say-go-vet (per Go module)

Same three concerns each time. This is the category the catalog does not cover at all: it ships repo-shape and prose validators but no language toolchain hooks, so every repo that needs gofmt or pylint or ansible-lint writes its own. That is the structural reason bespoke local blocks keep appearing, and it is worth deciding deliberately rather than by accretion.

Suggested ordering for step 2

  1. Fix the two wrong-train pins (deploy, steam-ops). Small, unambiguous, no design needed.
  2. Decide the pin policy. A floating tag, a scheduled bump, or an explicit "pin and stay pinned" that is at least uniform. This unblocks everything else, because promoting a hook into the catalog does nothing for a repo 25 releases behind.
  3. Promote em-dash-check into the catalog and delete both local copies.
  4. Resolve the trufflehog doubling in one direction.
  5. Decide whether language-toolchain hooks belong in the catalog. If yes, the Go set is the first one and it retires seven ad hoc hook ids.
  6. Agree one verb name and one workflow filename for "run the checks."

Items 1 through 4 are mechanical once decided. Item 5 is the actual design question and is the one that determines how heavy the aos coupling gets.

Step 1 of normalizing the bespoke pull-request, commit, linter, and pre-commit tooling that repos have been growing individually. Read-only inventory, no changes made. Scope: 19 local checkouts across `coilyco-bridge`, `coilyco-flight-deck`, `coilyco-gaming`, `coilysiren`. Excludes `StrangeLoopGames/Eco` (vendor) and any `-workdir`. ## Headline **Pre-commit is already 90 percent normalized, and that is not the problem.** 522 hook instances across 18 repos, only 51 defined locally, and 24 of those 51 are inside `agentic-os` itself where they are the catalog source rather than drift. Real drift is 27 local hooks across 8 repos. **The actual problem is that the shared layer is shared in name only.** Seven different pins of the catalog, and nobody on latest. ## Finding 1 - the catalog pin is scattered across seven revisions * `aos-precommit-v0.18.0` - 7 repos - agent-proxy, agentic-os-hardware, agentic-os-kai, agentic-os-xxx, factory-game-v3, galaxy-gen, voice-corpus * `aos-precommit-v0.24.0` - 3 repos - agent-compose, factorio-mods, sirens-echo * `aos-precommit-v0.31.0` - 2 repos - infrastructure, lore * `aos-precommit-v0.35.0` - 2 repos - eco-app, eco-ops * `aos-precommit-v0.33.0` - 1 repo - eco-mods * `v0.102.0` - 1 repo - deploy * `v0.193.0` - 1 repo - steam-ops Latest on that train is `aos-precommit-v0.43.0`. **Zero repos are on it.** The largest cohort is 25 releases behind, and since that train only advances when an installed hook input changes, every one of those is a real hook difference. `deploy` and `steam-ops` pin the **wrong train entirely**. `v*` is the aos CLI series (275 tags) rather than the pre-commit series (43 tags). Those tags resolve, so nothing errors, but the hooks those two repos run are whatever `.pre-commit-hooks.yaml` happened to look like at an unrelated commit. That looks like a mistake rather than a decision. This reframes the coupling worry. The current model already decouples repos from aos, arguably past the point of usefulness. The risk is not that dev flow is too attached to aos, it is that "the catalog suite" describes seven different suites. ## Finding 2 - trufflehog runs twice in six repos Every repo gets trufflehog from the catalog. Six of them **also** define a local one: * eco-app, eco-ops, galaxy-gen, infrastructure, sirens-echo, steam-ops The local variant is identical in all six and is a different invocation from the catalog's: ``` trufflehog git file://. --since-commit HEAD --no-verification --no-update --fail ``` Catalog scans the filesystem offline, local scans git history since HEAD. Arguably complementary, but the doubling is visible in output (`trufflehog` appears twice in an `infrastructure` run) and nobody appears to have chosen it. Either fold the git-history scan into the catalog hook so all 17 repos get it, or drop the local copies. ## Finding 3 - a fleet voice rule enforced in 2 of 19 repos, two different ways `em-dash-check` exists only in agentic-os-hardware and agentic-os-kai. Same hook id, same entry (`python scripts/check-em-dashes.py`), and the scripts have **already drifted**: 87 lines versus 107, different hashes. aos ships no em-dash validator at all. "No em-dashes" is a fleet-wide voice rule, so this is the clearest single candidate for promotion into the catalog. It is also a worked example of the failure mode: copy-paste a hook, and the copies diverge silently. ## Finding 4 - no agreed name for "run the checks" Every repo spells it differently: * `just ci` - agentic-os-hardware * `just precommit` - agentic-os-xxx * `just pre-commit` - infrastructure * `just test` ending in `pre-commit run --all-files` - agent-compose * `pre-commit run --all-files` direct in CI - lore * `just build`, `policy-check`, `role-drift-check`, `test`, `test-skips`, `vet`, plus full pre-commit - sirens-echo Workflow filenames disagree too: `ci.yml` in 11 repos, `hygiene.yml` in factorio-mods and lore, `lint.yml` in infrastructure. I checked for the obvious latent bug here and **did not find it**: no repo runs `pre-commit run` without `--all-files` in CI. The inconsistency is naming, not correctness. Four repos have no justfile at all (agent-proxy, eco-ops, coilysiren, lore) despite the base instruction to route every dev command through one. ## Finding 5 - what should stay local These are genuine domain validators with no fleet analogue, and normalizing them would be the wrong move: * infrastructure - forgejo-runner-config, forgejo-runner-recycle, forgejo-storage-budget, k3s-registry-config, ansible-lint, pylint * agentic-os-kai - validate-harness-skills, repo-skill-projection, mcp-skill-generation * deploy - roles-bundle-artifact, discoverability-drift * eco-ops - server-ad-golden, reddit-ad-golden * agent-compose - role-palette-snapshot * agentic-os-hardware - pipeline-idempotent * sirens-echo - prompt-snapshot ## Finding 6 - the language-toolchain gap, which is where sirens-echo stands out Go hygiene is implemented twice, in two repos, with seven hook ids and zero sharing: * sirens-echo - `gofmt`, `go-vet`, `go-mod-tidy` * agentic-os - `warp-gofmt`, `warp-go-vet`, `aos-say-gofmt`, `aos-say-go-vet` (per Go module) Same three concerns each time. This is the category the catalog does not cover at all: it ships repo-shape and prose validators but no language toolchain hooks, so every repo that needs gofmt or pylint or ansible-lint writes its own. That is the structural reason bespoke local blocks keep appearing, and it is worth deciding deliberately rather than by accretion. ## Suggested ordering for step 2 1. Fix the two wrong-train pins (deploy, steam-ops). Small, unambiguous, no design needed. 2. Decide the pin policy. A floating tag, a scheduled bump, or an explicit "pin and stay pinned" that is at least uniform. This unblocks everything else, because promoting a hook into the catalog does nothing for a repo 25 releases behind. 3. Promote `em-dash-check` into the catalog and delete both local copies. 4. Resolve the trufflehog doubling in one direction. 5. Decide whether language-toolchain hooks belong in the catalog. If yes, the Go set is the first one and it retires seven ad hoc hook ids. 6. Agree one verb name and one workflow filename for "run the checks." Items 1 through 4 are mechanical once decided. Item 5 is the actual design question and is the one that determines how heavy the aos coupling gets.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os#1298
No description provided.