midi2-gpu-fabric.git · FCIS_KIT_DECLARATION.md
midi2-gpu-fabric.git / FCIS_KIT_DECLARATION.md
revision db96cdbf26756c733a0317131cdcdf5e370c6acc · complete file
# FCIS_KIT_DECLARATION.md
The declaration [FCIS-KIT-01](https://github.com/Fountain-Coach/.github/blob/main/docs/FCIS-KIT-Standard.md) requires:
what this repository owns, what it consumes and in which mode, and every third-party dependency with its recorded
exception. FCIS-KIT-01 says this must be **discoverable in repository docs, not inferred from a manifest**, which is
why it is here and not only in `Package.swift`.
**Verified 2026-08-24** (updated for the `FountainTextLayoutKit` candidate) against `apps/modernization-studio/Package.{swift,resolved}`, `instrument/Package.swift`,
`seed/Package.swift`, `apps/stage-native/Package.swift`, `vendor/midi-backplane/runtimes/swift/Package.swift`, and
the upstream tag lists (`gh api repos/Fountain-Coach/<kit>/tags`).
> **This table is an inventory, and an inventory is the part most likely to stop being true.** Re-derive it, do not
> trust it: the commands that produce every column are in §5. Chapter 48's hand-written service register was wrong
> within the hour of being written; this one will rot the same way if it is read instead of checked.
---
## 1. Declaration
```
FCIS-KIT:
owns:
- LaneResolutionKit: which lane serves a role, resolved once into a value carrying its own client budget
repo: https://github.com/Fountain-Coach/LaneResolutionKit (PRIVATE)
released: v0.1.0 — annotated tag, GitHub release, suite green on the tagged commit (FCIS-KIT-07)
- FountainScenarioKit: generic Swift/MIDI2 scenario contract, lifecycle runtime, and deterministic test seam
repo: https://github.com/Fountain-Coach/FountainScenarioKit (PUBLIC — visibility decision 2026-08-17)
released: v0.1.1 — annotated tag, GitHub release, suite green on tagged commit; public documentation follows on main
- FountainCodexLaneKit: generic Codex app-server process, JSON-RPC transport, lifecycle, and MIDI2 lane boundary
repo: https://github.com/Fountain-Coach/FountainCodexLaneKit (PUBLIC — visibility decision 2026-08-20)
released: v0.1.1 — annotated tag, GitHub release, suite green on tagged commit; consumer integration remains a separate governed slice
- FountainTextLayoutKit: rendering-neutral semantic text layout and Apple-native style-token adapter
repo: https://github.com/Fountain-Coach/FountainTextLayoutKit (PUBLIC — candidate repository created 2026-08-24)
released: v0.1.0 — tag, GitHub release, and green suite at source 8fcc9e0; consumer integration remains a separate governed slice
- FountainCoachIllustrationKit: source-addressed SVG/Teatro illustration asset contract for governed publication projections
repo: in-repo candidate at kits/FountainCoachIllustrationKit (promotion and release pending)
released: not yet — local Swift package and test suite created 2026-08-27
- FountainCoachGovernancePublicationKit: target-aware governance preview and publication lifecycle contract
repo: in-repo candidate at kits/FountainCoachGovernancePublicationKit (promotion and release pending)
released: not yet — local Swift package and test suite created 2026-08-27
in-repo-modules:
- instrument: FountainStore instrumentation + Ollama eval driver
path: instrument
- FountainTelemetryKit: MIDI2Core / MIDI2Transports for the stage-native backplane
path: apps/stage-native/Packages/FountainTelemetryKit
consumes:
- kit: Fountain-Store
mode: semver
requirement: from "0.3.0" # resolved v0.3.0
- kit: FountainTextLayoutKit
mode: semver
requirement: from "0.1.0" # released v0.1.0 at source 8fcc9e0
- kit: swift-secretstore
mode: semver
requirement: from "0.1.0" # resolved 0.1.1
- kit: FountainEditorKit
mode: semver
requirement: from "0.2.0" # resolved 0.2.0
- kit: UncertaintyScoreKit
mode: semver
requirement: from "0.11.0" # resolved 0.11.0; upstream is at v0.11.2
- kit: LaneResolutionKit
mode: semver
requirement: from "0.1.0" # resolved 0.1.0 — promoted from an in-repo module 2026-08-07
- kit: FountainScenarioKit
mode: semver
requirement: from "0.1.1" # resolved 0.1.1 — promoted from Reframe in-repo modules 2026-08-17
- kit: midi2
mode: semver
requirement: exact "0.9.1" # via FountainTelemetryKit
- kit: RulesKit-SPM
mode: semver
requirement: transitive # resolved 0.1.0, via ScoreKit
- kit: ScoreKit
mode: revision
revision: 0e6a6c2
reason: >
The previous pin (73c1f2d) compiles against RulesKit API that has never been released —
`VerticalAlignStackInput` and the typed VerticalAlign/BreakAlign/Glissando operations appear in no
RulesKit-SPM tag (that repository has one tag, v0.1.0). The committed state could not build from clean;
earlier builds succeeded only on cached artifacts. 0e6a6c2 is the last revision that compiles against a
published RulesKit.
exit: >
Release RulesKit-SPM with the typed rules operations ScoreKit 73c1f2d needs, then tag ScoreKit and consume
it by semver (FCIS-KIT-04).
owner: Reframe / midi2-gpu-fabric
- kit: FountainStudioEditorKit
mode: revision
revision: 4aaeae89
reason: >
MEASURED 2026-08-07 — the pin is 8 commits AHEAD of v0.1.0 and 0 behind it, so this repository depends on
work upstream has built but never released. The pin is not a hold at a known version; it is the absence of
a release for work already in use.
exit: >
Cut v0.2.0 upstream from 4aaeae89 or later and move this dependency to `from: "0.2.0"`.
owner: Reframe / midi2-gpu-fabric
- kit: FountainKitFacebookConnector
mode: revision
revision: fedbdf56
reason: >
MEASURED 2026-08-07 — the repository has NO TAGS: it has never been released. `fedbdf56` is its initial
commit ("Initial compliance-first Facebook user posts connector", 2026-01-28) and is 2 commits behind
`main`. So this is not a deliberate hold either; it is a repository with no releases to depend on.
exit: >
Cut v0.1.0 upstream and move this dependency to `from: "0.1.0"`. Decide at that point whether the two
commits on main belong in it.
owner: Reframe / midi2-gpu-fabric
third-party-exceptions:
- package: Yams (jpsim)
capability: YAML parsing for IDL, facts and seed manifests
consumed-by: instrument, seed, vendor/midi-backplane/runtimes/swift
why-not-owned: >
A YAML parser is a commodity format implementation with no Fountain Coach semantics in it. FCIS-KIT-02's
purpose is that capabilities the organization LACKS get built in kits it owns; a conformant parser for a
published spec is not such a capability, and owning one would mean maintaining a spec implementation to no
product end.
accepted-by: OUTSTANDING — predates FCIS-KIT adoption (2026-08-02); needs the writer's acceptance on record
- package: apple/swift-* (nio, crypto, collections, atomics, numerics, system, asn1, algorithms,
argument-parser, http-types, openapi-generator, openapi-runtime, openapi-urlsession)
capability: platform and protocol foundations
consumed-by: transitive only — via Fountain-Store, ScoreKit and the OpenAPI generator
why-not-owned: first-party Apple platform libraries; owning them is not a coherent option
accepted-by: n/a — no direct dependency is declared by this repository
- package: OpenAPIKit (mattpolzin)
capability: OpenAPI document model
consumed-by: transitive — via swift-openapi-generator
why-not-owned: transitive through an Apple toolchain dependency; not selected by this repository
accepted-by: n/a — no direct dependency is declared by this repository
```
---
## 2. Compliance status, rule by rule
| Rule | State | Note |
| --- | --- | --- |
| KIT-01 Declaration | **Now met** | This file. Previously absent — the standard's §7 said "declaration pending" and `rg 'FCIS-KIT:'` found nothing repo-wide. |
| KIT-02 Owned before third-party | Met, one exception open | Every DIRECT dependency of `apps/modernization-studio` is Fountain-Coach-owned or in-repo. Yams is the only direct third-party dependency anywhere in the repository and needs an acceptance on record. |
| KIT-03 The seam is generic | Met | `LaneResolutionKit` carries no consumer types or vocabulary; verified by search in that repository (§3). |
| KIT-04 Semantic versioning | **Not met — 3 revision pins** | Three upstream repositories remain revision-pinned; FountainTextLayoutKit is now consumed by semver at v0.1.0. |
| KIT-05 Pins documented | **Now met** | All three remaining pins carry reason, exit and owner, both here and adjacent to the declaration in `Package.swift`. |
| KIT-06 In-repo / external paths | Met | **Two** in-repo modules (`instrument`, `FountainTelemetryKit`). `FountainScenarioKit` and its test kit are now consumed by semver; no External Path Dependency is committed. |
| KIT-07 Release mechanics | Met | `LaneResolutionKit` v0.1.0 — annotated tag on a clean tree with a green suite, published via `gh release create`, notes naming the seam. |
| KIT-08 Upstream first | Met | No kit source is vendored, forked or patched in place. |
| KIT-09 Bump discipline | Met | The `LaneResolutionKit` adoption changes the manifest, the resolved file, and the minimum adaptation the rename required (import + four renamed symbols) — no unrelated feature work rides with it. |
| KIT-10 Counterpart provenance | Met | Recorded per bump in `PLANS.md` (Fountain-Store v0.3.0 → consumer bump `3ac64639`; `LaneResolutionKit` v0.1.0 → this change, promotion from the in-repo module). |
| KIT-11 Evidence lives with the seam | Met | `LaneResolutionKit` is proved by its own 19 tests, not by a consumer. |
| KIT-12 Deprecation before removal | n/a | No public kit API removed. |
| KIT-13 Other standards apply | Met | See §3. |
**The two open items are KIT-04 and one KIT-02 acceptance.** Both need action outside this repository (a release upstream; the writer's acceptance), which is why they are recorded here rather than closed here. FCIS-KIT §5: "Non-compliant entries are not defects to be hidden."
The `FountainScenarioKit` promotion is complete: upstream `v0.1.1` is published before this consumer migration,
the Reframe manifest uses `from: "0.1.1"`, and the in-repo duplicate is removed. Its package-level lifecycle tests
remain in the kit; Reframe retains only the product adapter and independent live witnesses.
---
## 3. `LaneResolutionKit` — promoted to an owned kit
Governed by [ch.51 rule 10](apps/modernization-studio/docs/reframe-grounding-first-refactor/51-one-decision-decides-the-lane.md)
("the resolver is pure, and it lives in a kit").
**It lived in this repository first, deliberately.** FCIS-KIT-06 makes an in-repo module compliant, and FCIS-KIT-08
forbids patching a kit in place as a substitute for a release — *including temporarily*. So promoting before the
call sites were repointed would have meant a tagged release for every correction to a seam still being learned. The
seam moved three times during migration (`windowOverflow` gaining `payloadTokens`; role-awareness; supplied-client
lanes); each would have been a release of a shape that was still wrong.
**Promoted 2026-08-07**, once all four call sites were repointed and the last change was additive. This is the path
FCIS-KIT §6 names as its own reference precedent — UncertaintyScoreKit was "promoted from local targets to its own
repo": local first, promoted once stable.
Done at promotion:
1. **Renamed** `ReframeLaneResolution` → `LaneResolutionKit`. FCIS-KIT-03: a seam is defined by what it does, never
by who calls it, and `Reframe` in the name is who calls it. The public API was renamed off the consumer's
vocabulary too — `writerFacingName` → `displayName`, `writerFacingLine` → `displayLine`,
`SpendConsent.writerFacingSummary` → `displaySummary`, `LaneRemedy.stayOnDevice` → `.stayLocal`. Free at v0.1.0;
after publication it would have needed a deprecating release first (FCIS-KIT-12).
2. **Incident narratives moved** out of the doc comments into the kit's own `docs/INCIDENTS.md`. They were the
consumer's vocabulary sitting inside the seam — Circe, Joyce, the Copilot, the manuscript. The rules stayed; the
caller's nouns went. Checkable: `rg -niE 'reframe|storify|circe|joyce|copilot|manuscript|openai|chatgpt|codex|apple' Sources/`
in that repository returns nothing.
3. **RFC 0001 layering** — `AGENTS.md` (law only: invariants, prohibitions, safety, routing; no procedures, per
§4.3), `PLANS.md` (goal, constraints, phases, test plan, rollback, definition of done, per §5.3), and a release
skill in `.codex/skills/release/` mirrored as an identical **copy** at `.claude/skills/release/` — never a
symlink.
4. **Released** v0.1.0: annotated tag on a commit with a clean tree and a green suite, published with
`gh release create`, notes naming the seam and stating the breaking surface (none — first release).
5. **Consumed by semver** — `from: "0.1.0"`, resolved 0.1.0. The in-repo `Packages/` directory is deleted.
6. **`FCIS_COMPLIANCE.md` in the kit** records which org standards bind it and the evidence, with the reason each
non-binding one does not — quoted from that standard's own applicability line, so the judgement is checkable
rather than asserted.
**Applicability findings** (KIT-13 — being in a kit is not an exemption from the standard that governs the surface):
| Standard | Binds? | Why |
| --- | --- | --- |
| RFC 0001 | **Yes** | "All Codex-operated repositories." Four layers present and orthogonal. |
| FCIS-KIT | **Yes** | It is an owned kit, consumed by another repository. |
| Publication and Source Policy | **Yes** | Repository is **private**; carries no secrets, store records, personal data or fixtures. Making it public would be a separate decision requiring visibility decision, license review, secret and dependency scan, fixture scrub and maintainer approval. |
| FCIS-AX | No | "Applies to repositories that ship, render, or drive a user-facing interface." It ships none — no UI target, no SwiftUI/AppKit/UIKit import. AX binds the *consumer's* surface that renders a decision, which is why the kit hands that surface `displayName`, `displayLine` and typed refusals instead of leaving it to re-derive them. |
| FCIS-VRT | No | "Applies to repositories that publish or execute visual regression tests." It renders nothing. |
| FCIS-AIC-Preflight | No | Scoped to prompt-input surfaces and intelligence invocation. It invokes no model, accepts no prompt input, imports no intelligence framework. It decides *which* lane and *how large*; it never composes or sends a request. |
## 4. What this declaration does not cover
Product questions about what a kit should contain (FCIS-KIT §1 excludes them), and the AX/VRT/AIC compliance of the
application itself, which is `FCIS_AUDIT.md` and `FCIS_COMPLIANCE_PLAN.md`.
---
## 5. How to falsify this file in under a minute
FCIS-KIT §5 makes an inventory authoritative until each entry is resolved, which means a stale entry is read as
authority. Every column above is re-derivable:
```sh
# Direct dependencies, per package
rg -n '\.package\(' --glob 'Package.swift' --glob '!.build/**' --glob '!.tmp/**'
# Resolved versions and revisions
python3 -c "import json;d=json.load(open('apps/modernization-studio/Package.resolved'));\
[print(p['identity'], p['location'], p['state'].get('version') or p['state'].get('revision','')[:12]) \
for p in sorted(d['pins'], key=lambda x: x['identity'])]"
# Upstream tags — does a release exist to move to?
for r in ScoreKit FountainStudioEditorKit FountainKitFacebookConnector RulesKit-SPM UncertaintyScoreKit; do
echo "$r: $(gh api repos/Fountain-Coach/$r/tags --jq '[.[].name]|join(", ")')"
done
# How far a pin is from its tag / from main
gh api repos/Fountain-Coach/FountainStudioEditorKit/compare/v0.1.0...4aaeae89 \
--jq '"ahead=\(.ahead_by) behind=\(.behind_by)"'
# Is any committed path dependency EXTERNAL to this repository? (KIT-06 — all four must resolve inside it)
rg -n '\.package\(path: "' --glob 'Package.swift' --glob '!.build/**' --glob '!.tmp/**'
# Is the owned kit consumed by version, and does its release exist? (KIT-04, KIT-07)
rg -n 'LaneResolutionKit' apps/modernization-studio/Package.swift
gh release view v0.1.0 --repo Fountain-Coach/LaneResolutionKit --json tagName,publishedAt
```
If any command disagrees with this file, **this file is the defect** — fix it in the change that found it, and say
what was wrong, because what was wrong is the evidence that hand-maintenance failed.