Skip to content

Add k9-ecosystem aggregator hub (staged for extraction)#120

Merged
hyperpolymath merged 2 commits into
mainfrom
claude/nice-hopper-fzl2bl
Jun 20, 2026
Merged

Add k9-ecosystem aggregator hub (staged for extraction)#120
hyperpolymath merged 2 commits into
mainfrom
claude/nice-hopper-fzl2bl

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

What this is

A decision + scaffold for organising the 11-repo K9 family. After weighing monorepo vs. polyrepo against your existing conventions, this lands on a hub + submodules model: one k9-ecosystem hub that owns the spec and conformance suite, with the implementations and tooling kept as standalone repos and aggregated as git submodules.

The hub is authored as a standalone repo root but staged under k9-ecosystem/ here, because creating a new top-level repo was outside this session's scope. Promotion to hyperpolymath/k9-ecosystem is a one-command extraction — see k9-ecosystem/BOOTSTRAP.md.

Why hub + submodules (not a monorepo, not scattered)

Several members cannot be subdirectories without breaking their toolchains:

  • tree-sitter-k9 — the Tree-sitter CLI + bindings expect a repo named tree-sitter-* at root
  • k9-validate-action — consumed as owner/repo@ref; Marketplace needs its own repo
  • k9-pre-commit — consumers reference the repo URL; .pre-commit-hooks.yaml at root
  • vscode-k9vsce per-extension publishing

…and the five implementations each publish to a different registry (crates.io / Hex / Hackage / JSR) with independent versioning. A hub still delivers one spec source-of-truth, one conformance suite, and one front door — the same satellites/ + *-ecosystem/ submodule pattern this repo already uses.

It's a separate primary (not nested) because developer-ecosystem's charter is dev workflow tooling, whereas K9 is a configuration format. Named k9-ecosystem because k9-svc already means the Rust crate lib (k9_svc) and a hyperpolymath/standards entry.

Contents (k9-ecosystem/)

Area Files
Front door README.adoc, members/README.adoc
Members manifest .gitmodules (11 repos: implementations / tooling / ci / examples)
Spec (source of truth) spec/SPEC.adoc (v0.1 draft; k9-rs normative until ratified), spec/README.adoc
Conformance conformance/README.adoc + fixtures/minimal/{component.k9, expected.json}
Orchestration Justfile, scripts/init-submodules.sh
Governance .machine_readable/6a2/{ECOSYSTEM,STATE,META}.a2ml, LICENSE, BOOTSTRAP.md

developer-ecosystem's own ECOSYSTEM.a2ml / STATE.a2ml are indexed to reference the staged hub.

Status / how to promote

  • Extract to standalone hyperpolymath/k9-ecosystem (BOOTSTRAP.md option A), or add that repo to session scope and I'll push it directly
  • Run scripts/init-submodules.sh to populate the 11 submodules
  • Cross-link each member's 6a2/ECOSYSTEM.a2ml back to the hub
  • Ratify SPEC.adoc and resolve its [OPEN] items via fixtures

Validated locally: bash -n on the script and JSON parse on the fixture both pass. No submodules are actually cloned here (the staged .gitmodules is inert until extraction), so this PR adds plain files only.

🤖 Generated with Claude Code

https://claude.ai/code/session_019i2e5ABGBKQmMdqk8puFWx


Generated by Claude Code

claude added 2 commits June 20, 2026 18:12
Scaffold the standalone k9-ecosystem hub for the K9 self-validating
configuration format, staged under k9-ecosystem/ for delivery (intended
end-state: its own top-level primary — see k9-ecosystem/BOOTSTRAP.md).

The hub owns the canonical spec (spec/SPEC.adoc, v0.1 draft; k9-rs
normative until ratified) and a language-agnostic conformance suite
(conformance/fixtures/minimal), and aggregates the 11 K9 member repos as
git submodules grouped by role:

  implementations  k9-rs, k9_ex, k9_gleam, k9-deno, k9-haskell
  tooling          tree-sitter-k9, vscode-k9, pandoc-k9
  ci               k9-validate-action, k9-pre-commit
  examples         k9-showcase

Members stay standalone (idiomatic to crates.io/Hex/Hackage/JSR and to
the tree-sitter/vsce/pre-commit/Actions conventions); the hub provides a
single spec source-of-truth, one conformance suite, and one front door.

Includes Justfile + scripts/init-submodules.sh for submodule
orchestration and .machine_readable/6a2 governance. developer-ecosystem
ECOSYSTEM/STATE indexed to reference the staged hub.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019i2e5ABGBKQmMdqk8puFWx
The conformance fixture was a YAML-like sketch (from the k9-rs README)
that lacked the required `K9!` magic line and a `pedigree = { }` block,
so the repo's `Validate K9 contracts` gate (k9-validate-action) errored.

Rewrite it as a valid Nickel K9 contract modelled on the live corpus:
`K9!` magic, SPDX header, five-layer pedigree (Snout/Scent/Leash/Gut/
Muscle) with a `'Kennel` trust level, plus `schema_version` and
`security_level` to clear the validator's warnings. Rename to
component.k9.ncl (it is Nickel), realign expected.json, and rewrite
spec/SPEC.adoc to document the actually-enforced format rather than the
earlier guess.

The PR's other red checks (workflow security linter, trufflehog, deno
@cadre/router duplicate) are pre-existing on main and unrelated to this
diff.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019i2e5ABGBKQmMdqk8puFWx
@hyperpolymath hyperpolymath marked this pull request as ready for review June 20, 2026 18:24
@hyperpolymath hyperpolymath merged commit 518764a into main Jun 20, 2026
18 of 21 checks passed
@hyperpolymath hyperpolymath deleted the claude/nice-hopper-fzl2bl branch June 20, 2026 18:28
hyperpolymath added a commit that referenced this pull request Jun 20, 2026
…ending) (#122)

Pre-existing CI failures on `main`, split out of the now-merged
k9-ecosystem PR (#120) so that PR stayed focused. None were introduced
by #120. **Both now fixed.**

## Fixed here

**Secret Scanner / Workflow security linter + trufflehog** —
`secret-scanner.yml` had a hand-rolled `trufflehog` job that was both
unpinned (`trufflehog@main`) and passed `--fail` on top of the action's
own `--fail` (`flag 'fail' cannot be repeated`). The reusable `scan` job
(SHA-pinned `hyperpolymath/standards` secret-scanner) already runs
trufflehog — the passing `scan / trufflehog` check — so the local job
was pure duplication. Removed it.

**Language / package anti-pattern** — the root `deno.json` workspace
listed `./rescript-ecosystem/cadre-router`,
`.../cadre-router/tea-router`, `.../cadre-router/tea-router-pkg`, and
`.../cadre-tea-router` as copies of the canonical top-level
`./cadre-router` / `./cadre-tea-router`, so two members declared
`@cadre/router`. Unlisted the legacy `rescript-ecosystem/cadre-*`
entries from the workspace (files retained on disk; top-level dirs are
canonical).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_019i2e5ABGBKQmMdqk8puFWx

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants