Skip to content

[carve-out 2/9] Evict k9-svc/ implementations → k9-ecosystem; dedupe k9-svc/actions/validate → k9-validate-action #491

Closed

Description

@hyperpolymath

Child of #479. k9-svc/ is 1,915 files / 13MB and contradicts its own published site copy ("Implementations and CI live in the k9-ecosystem hub; the normative spec is in standards" — site/index.md, site/spec.md).

Stays: SPEC.adoc, SPEC.adoc.invariants.md, GUIDE.adoc, TESTING.adoc (conformance-relevant parts), security analyses, IANA media-type application doc.
Moves to hyperpolymath/k9-ecosystem: bindings/ (~5.4M), editors/ (~1.8M), pandoc/ (~1.8M), lsp/, tools/, k9-scan/, k9-sign/, site/, showcase/, packaging/, benchmarks/, mime/, receipt/, must/, Containerfile, compose.yaml, guix.scm.
Deleted here (exists upstream): k9-svc/actions/validate/ — a vendored copy of hyperpolymath/k9-validate-action (its in-tree SECURITY.md names the other repo as its identity). Two copies of an executable CI action is a supply-chain hazard.

Same mechanics as #490: subtree-split for history, registry regen in the same PR, --check green, mass-deletion marker if a guard exists, SPDX/licence content untouched (flag-only rule). Turn SPEC.adoc.invariants.md + the k9-coordination test vectors into a language-neutral conformance suite as the follow-up that makes this spec evidenced.

Activity

  1. added
    tech-debtKnown shortcut, drift, or hygiene owed - includes cleanup
    on Aug 24, 2026
  2. hyperpolymath commented on Aug 25, 2026

    @hyperpolymath
    OwnerAuthor

    2026-08-25 — this is the ONE carve-out that is executable today

    Destination hyperpolymath/k9-ecosystem exists (public). Every other carve-out child is blocked on a destination that 404s.

    k9-svc/ is still 1,898 files in standards, with bindings/, editors/, pandoc/, site/ and actions/ all present. Move the implementations; keep the spec text in standards.

    Recommended as the first eviction to execute — #460's own comment reaches the same ordering independently.

    Verified 2026-08-25 against live GitHub, not local checkouts.

  3. hyperpolymath commented on Aug 25, 2026

    @hyperpolymath
    OwnerAuthor

    ⚠️ Two load-bearing corrections before anyone executes this — verified 2026-08-25

    I planned this eviction in detail before starting it. Following the issue as written would destroy data and break every future PR to main. Both errors are stated below with the check that establishes them.

    Correction 1 — hyperpolymath/k9-validate-action DOES NOT EXIST

    This issue says of k9-svc/actions/validate/:

    a vendored copy of hyperpolymath/k9-validate-action … Deleted here (exists upstream)

    gh repo view hyperpolymath/k9-validate-action → 404. Paginating all 341 repos on the account finds nothing matching valid except k9-ecosystem itself.

    Deleting those 290 files as instructed would destroy content with no verified original. What actually exists is k9-ecosystem/validate-action/ (302 files) — a drifted sibling, not an upstream. This step must become reconcile-then-move, never delete.

    Correction 2 — k9-ecosystem is NOT an empty destination

    It holds 1,465 files and already has counterparts for most of what is slated to move, under different names:

    Moving from k9-svc/ Already in k9-ecosystem Common Identical Differ
    bindings/rust rs/ 215 183 32
    bindings/haskell haskell/ 251 221 30
    bindings/deno deno/ 250 221 29
    bindings/gleam gleam/ 9 2 7
    bindings/elixir ex/ 10 2 8
    actions/validate validate-action/ 246 216 30
    showcase showcase/ 11 3 8

    A naive subtree-split-and-push would silently overwrite governance scaffolding or produce a merge conflict. Nobody has established which side is authoritative for the ~30 differing files per pair.

    The good news, from inspecting the drift rather than guessing at it: it looks cosmetic — chiefly an SPDX header variant (PMPL-1.0-or-later vs MPL-2.0) that landed on one side only, plus a dropped [dev-dependencies] block in Cargo.toml. The 56–72 files unique to k9-ecosystem per pair are uniformly standalone-repo governance scaffolding (ARCHITECTURE.adoc, GOVERNANCE.adoc, MAINTAINERS, LICENSES/) — those copies were already bootstrapped in anticipation of this eviction. Cheap to resolve, but it must be resolved rather than overwritten.


    🚨 The highest risk: this breaks main for everyone, not just this PR

    .machine_readable/scorecards/k9-svc.scorecard.a2ml contains 8 executable check = shell commands, and every one points at a file slated to move — k9-svc/examples/hello.k9, k9-svc/mime/*, k9-svc/must, k9-svc/bindings/*, k9-svc/Containerfile, k9-svc/.github/workflows/*.

    That scorecard is executed by build-scorecards.sh --check --strict --verify, invoked from registry-verify.yml — which is the required status check Registry + topology in sync (confirmed live in ruleset Optimus-Branch).

    Move the implementation without rewriting that scorecard in the same PR and every subsequent PR to main fails, repo-wide.

    Second break, immediate and visible

    Root Justfile has 6 hardcoded cd k9-svc/bindings/rust && cargo … references in the build, test, fmt, lint and clean recipes, plus one in run-required-test-suite.sh. Every contributor's just build breaks the moment bindings/ moves. Same commit, not a follow-up.

    ⚠️ Do NOT rename the K9-SVC contractile validation job

    It sounds k9-svc-specific and looks like obvious cleanup during this eviction. It is repo-wide — it runs the Mustfile structural checks, and both scripts contain zero k9-svc paths. It is also a required status check. Renaming it without updating the ruleset atomically blocks every PR to the repository.


    Corrected execution order

    1. Reconcile first — resolve the ~30 differing files per pair against k9-ecosystem. A maintainer must eyeball these; do not let either side silently win.
    2. Rewrite k9-svc.scorecard.a2ml so its 8 checks point at the new locations, in the same PR. Gated by a required check.
    3. Update scripts/build-registry.sh, regenerate REGISTRY.a2ml + TOPOLOGY.adoc (just registry) — same gate.
    4. Update the root Justfile's 6 references — same commit as the move.
    5. Move the implementation dirs, landing into the reconciled paths. Resolve actions/validate against k9-ecosystem/validate-action/, not a nonexistent repo.
    6. Fix ~15 relative links + 3 image:: embeds in GUIDE.adoc / TESTING.adoc / README.adoc, which stay but reference examples/ and assets/.
    7. Fix k9-ecosystem/spec/README.adoc — it points at docs/CONTRACTILE-SPEC.adoc (no such path) and claims k9-svc "does not exist yet".
    8. Prune k9-svc/* from .hypatia-baseline.json — already anticipated in maintainer notes there.

    Alert closure, measured

    All 29 HYP-S009 alerts under k9-svc/ sit in files classified MOVE — none in a KEEP file, so there is no tension between closing alerts and preserving the spec. bindings/ alone closes 10 of 29.

    One genuine open question for you

    examples/ (9 files) and assets/ (4 SVGs) are load-bearing for docs that stay: GUIDE.adoc embeds three SVGs and walks through examples/hello.k9 by relative path, and the scorecard's M1 check literally runs head -c3 k9-svc/examples/hello.k9. But k9-ecosystem/conformance/ has already started a more rigorous fixture set that could supersede examples/.

    Suggested split: keep assets/ (pure illustration, no implementation coupling), move examples/ and rewrite the links, letting conformance/ take over the fixture role. Say if you'd rather keep both.


    Also corrected: k9-svc/k9-scan and k9-svc/must are executable scripts, not directories as the issue implies; k9-svc/guix.scm does not exist (it is manifest.scm).

    Horizon: every claim above is from the live GitHub API — full recursive trees for both repos (untruncated), blob-SHA diffs across all seven colliding pairs, the live code-scanning and ruleset APIs, and a full 341-repo listing. The stale local checkout was not used. What I sampled rather than read in full: the 290-file actions/validate tree and the ~900 files under bindings/*, which were diffed by blob SHA with a handful read in full to characterise the drift.

  4. added
    status:needs-ownerUnassigned and needs someone to take it
    and removed
    status:needs-ownerUnassigned and needs someone to take it
    on Aug 25, 2026
  5. hyperpolymath commented on Aug 26, 2026

    @hyperpolymath
    OwnerAuthor

    Owner ruling 2026-08-26 recorded, so this is no longer blocked:

    • examples/ MOVES to k9-ecosystem; the ~15 relative links and 3 image:: embeds in GUIDE.adoc / TESTING.adoc / README.adoc get rewritten to absolute
    • assets/ STAYS — pure illustration, embedded by a doc that stays, no implementation coupling
    • Reconciliation rule: standards wins on source content (it is newer and carries real fixes; k9-ecosystem has expect("TODO: handle error") placeholders), k9-ecosystem's licence-comment line wins on policy, and its standalone-repo governance scaffolding is kept

    Proceeding with the 8-step order in the corrected plan above.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtKnown shortcut, drift, or hygiene owed - includes cleanup

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions