Create the compositor repository, package it, and publish it #337

Open
opened 2026-08-25 17:08:59 +00:00 by coilyco-ops · 3 comments
Member

Parent

#329

What to build

Give the compositor its own repository and release train, taking umbra's position in the pairing: it owns the roster language and the engine, and acompose is downstream of it and never its peer.

  • New public repository under coilyco-flight-deck, MIT licensed per standing policy for shareable work.
  • justfile as the sole verb manifest, the agentic-os catalog pre-commit suite, and CI running the same recipes.
  • Move the compositor from #333 into it, along with evalkit. The eval runner travels with the engine, following the precedent that umbra ships specgen rather than splitting it into a separate repo. That colocation is also what keeps the graded artifact and the shipped artifact identical. aos-eval grading stays in agentic-os.
  • Publish to PyPI on push to canonical main, matching the release posture the estate already uses.
  • README, AGENTS, and docs/FEATURES.md trifecta from the first commit.

HITL. Creating a public repository and claiming a PyPI distribution name are externally visible and effectively irreversible, so both need Kai's explicit go-ahead at the moment of creation rather than standing authorization.

Acceptance criteria

  • Repository exists with the name settled in #330, MIT licensed, with the trifecta present.
  • The compositor and evalkit live in it, and agent-compose no longer carries either.
  • pip install <name> from PyPI, then composing a bundle from YAML, works on a machine with no Go toolchain present.
  • Push to main publishes the next release without manual dispatch, with dispatch retained as the override path.
  • The README states the pairing explicitly, including that acompose is downstream and not a peer.
  • agent-compose's docs point at the new repository as the owner of composition.

Blocked by

  • Blocked by #330 for the name
  • Blocked by #333 for the code that moves
## Parent #329 ## What to build Give the compositor its own repository and release train, taking umbra's position in the pairing: it owns the roster language and the engine, and `acompose` is downstream of it and never its peer. * New public repository under `coilyco-flight-deck`, MIT licensed per standing policy for shareable work. * `justfile` as the sole verb manifest, the agentic-os catalog pre-commit suite, and CI running the same recipes. * Move the compositor from #333 into it, along with `evalkit`. The eval runner travels with the engine, following the precedent that umbra ships `specgen` rather than splitting it into a separate repo. That colocation is also what keeps the graded artifact and the shipped artifact identical. `aos-eval` grading stays in agentic-os. * Publish to PyPI on push to canonical `main`, matching the release posture the estate already uses. * README, AGENTS, and `docs/FEATURES.md` trifecta from the first commit. **HITL.** Creating a public repository and claiming a PyPI distribution name are externally visible and effectively irreversible, so both need Kai's explicit go-ahead at the moment of creation rather than standing authorization. ## Acceptance criteria - [ ] Repository exists with the name settled in #330, MIT licensed, with the trifecta present. - [ ] The compositor and `evalkit` live in it, and agent-compose no longer carries either. - [ ] `pip install <name>` from PyPI, then composing a bundle from YAML, works on a machine with no Go toolchain present. - [ ] Push to `main` publishes the next release without manual dispatch, with dispatch retained as the override path. - [ ] The README states the pairing explicitly, including that acompose is downstream and not a peer. - [ ] agent-compose's docs point at the new repository as the owner of composition. ## Blocked by - Blocked by #330 for the name - Blocked by #333 for the code that moves
Author
Member

Unblocked on the name: housecast

#330 is settled. Kai chose housecast. This clears "Blocked by #330 for the
name", and the first acceptance criterion now reads against a concrete string.

  • Repository - coilyco-flight-deck/housecast. Verified free on Forgejo and the
    GitHub mirror at 2026-08-25T18:50:55Z.
  • PyPI distribution - housecast. Verified free at the same moment on both the
    JSON API and the PEP 503 simple index, checked against a control string that
    also returned 404.
  • house-cast is a separate PyPI name under PEP 503 normalization and is also
    free. Worth holding alongside housecast so the hyphen never becomes a
    near-miss squat.

What the name claims, for the README criterion. A house cast is the resident
standing company of a theatre: a fixed troupe held by one house under one set of
conventions, able to mount any role in its book. That is the roster. house is
the authority noun, since a House constitutes its members and grants each one
marks distinguishing them from their siblings. cast carries both casting a play
and casting metal, and the second sense is the immutable bundle. It sits in
umbra's position and cannot be heard as an accessory to acompose.

Two things to carry into the README rather than discover later. housecast
also parses as house plus forecast, and three of the four existing GitHub
repositories under that string are housing-price forecasters, all dead and
zero-star. And cast is a live Python concept, so type casting is the first
reading for a beat. Neither is occupation, both are reading risks, and the
hyphenated house-cast forces the correct parse in print if that is wanted.

Full search record, alternates, and what the name forecloses are in #330.

On the HITL note in this issue

The note here is right and I want it visible against what I filed. I opened #347
asking for the PyPI names to be claimed ahead of the repository, on the grounds
that the naming register is being consumed fast. The urgency argument stands
and the authorization claim in it did not.
I labeled it autonomy/headless,
which contradicts this issue's standing position that claiming a PyPI
distribution name is externally visible, effectively irreversible, and needs
Kai's explicit go-ahead at the moment of the claim rather than standing
authorization. I have corrected #347 to autonomy/async-consult and said so
there. The claim should still happen soon, and it should happen with Kai present.

## Unblocked on the name: `housecast` #330 is settled. Kai chose `housecast`. This clears "Blocked by #330 for the name", and the first acceptance criterion now reads against a concrete string. * Repository - `coilyco-flight-deck/housecast`. Verified free on Forgejo and the GitHub mirror at 2026-08-25T18:50:55Z. * PyPI distribution - `housecast`. Verified free at the same moment on both the JSON API and the PEP 503 simple index, checked against a control string that also returned 404. * `house-cast` is a separate PyPI name under PEP 503 normalization and is also free. Worth holding alongside `housecast` so the hyphen never becomes a near-miss squat. **What the name claims, for the README criterion.** A house cast is the resident standing company of a theatre: a fixed troupe held by one house under one set of conventions, able to mount any role in its book. That is the roster. `house` is the authority noun, since a House constitutes its members and grants each one marks distinguishing them from their siblings. `cast` carries both casting a play and casting metal, and the second sense is the immutable bundle. It sits in umbra's position and cannot be heard as an accessory to `acompose`. **Two things to carry into the README rather than discover later.** `housecast` also parses as house plus forecast, and three of the four existing GitHub repositories under that string are housing-price forecasters, all dead and zero-star. And `cast` is a live Python concept, so type casting is the first reading for a beat. Neither is occupation, both are reading risks, and the hyphenated `house-cast` forces the correct parse in print if that is wanted. Full search record, alternates, and what the name forecloses are in #330. ## On the HITL note in this issue The note here is right and I want it visible against what I filed. I opened #347 asking for the PyPI names to be claimed ahead of the repository, on the grounds that the naming register is being consumed fast. **The urgency argument stands and the authorization claim in it did not.** I labeled it `autonomy/headless`, which contradicts this issue's standing position that claiming a PyPI distribution name is externally visible, effectively irreversible, and needs Kai's explicit go-ahead at the moment of the claim rather than standing authorization. I have corrected #347 to `autonomy/async-consult` and said so there. The claim should still happen soon, and it should happen with Kai present.
Author
Member

The repository exists. Bootstrap split out to housecast#1

Kai created coilyco-flight-deck/housecast at 2026-08-27T09:28:38Z. That
satisfies the HITL gate this issue carries for repository creation, and it is
the half of that gate that has now been spent. The PyPI claim in #347 is
untouched and still needs Kai in the room.

The repository is empty, so the first acceptance criterion here is partly met
and partly not. The name is settled and the repository exists under it. MIT and
the trifecta do not, because nothing has been committed.

Split the scaffold out rather than growing it here. housecast#1 carries the
first commit: trifecta, MIT license, the catalog pre-commit suite, justfile, CI,
.ward/ward.yaml, and the repo-housecast pointer skill. It deliberately
excludes the compositor, evalkit, the publish workflow, and the PyPI claim,
so it is unblocked by #333 and by #347 and can land today. This issue keeps the
packaging and publication slice and stays blocked on #333 for the code that
moves.

Four calls made in housecast#1 so a build does not stop to ask, all reversible
and all named there with reasoning: merge-remote-main as the lane,
housecast unhyphenated as the shipped spelling with house-cast held
defensively, band = "small" for documentation layout, and no resident
checkout until real code lands.

Filed from the Portfolio Director seat, which defers
boundary-build-foundational-software. The build is handed to the Agentic
Platform Engineer seat.

## The repository exists. Bootstrap split out to housecast#1 Kai created `coilyco-flight-deck/housecast` at 2026-08-27T09:28:38Z. That satisfies the HITL gate this issue carries for repository creation, and it is the half of that gate that has now been spent. The PyPI claim in #347 is untouched and still needs Kai in the room. The repository is empty, so the first acceptance criterion here is partly met and partly not. The name is settled and the repository exists under it. MIT and the trifecta do not, because nothing has been committed. **Split the scaffold out rather than growing it here.** housecast#1 carries the first commit: trifecta, MIT license, the catalog pre-commit suite, justfile, CI, `.ward/ward.yaml`, and the `repo-housecast` pointer skill. It deliberately excludes the compositor, `evalkit`, the publish workflow, and the PyPI claim, so it is unblocked by #333 and by #347 and can land today. This issue keeps the packaging and publication slice and stays blocked on #333 for the code that moves. Four calls made in housecast#1 so a build does not stop to ask, all reversible and all named there with reasoning: `merge-remote-main` as the lane, `housecast` unhyphenated as the shipped spelling with `house-cast` held defensively, `band = "small"` for documentation layout, and no resident checkout until real code lands. Filed from the Portfolio Director seat, which defers `boundary-build-foundational-software`. The build is handed to the Agentic Platform Engineer seat.
Author
Member

The move is done. The publish is what is left.

agent-compose@6086991 and housecast@c4c2825. Composition no longer lives here.

Moved to housecast: the compositor from #333, evalkit, challenges.yaml, evaluations/ and its committed evidence, the eval workflow scripts, and the typos config that keeps a spelling fix from editing a preserved model answer.

Deleted here: all of the above, plus internal/person/personality_anchors_test.go. That test asserted every melded personality has a grading anchor, and both the roster and evaluations/personality-anchors.yaml moved, so the check moved with them rather than reaching across a repository boundary.

No Go runs in housecast. The eval scripts called go run ./cmd/agent-compose roster and compose. housecast gained a roster subcommand emitting the same person.json shape evalkit already read, so the swap was a swap: the entity roster and the 94-line challenge matrix are identical whether derived from the Go snapshot or housecast's.

Acceptance criteria

  • Repository exists, MIT, trifecta present - yes, since housecast#1.
  • The compositor and evalkit live in it, and agent-compose no longer carries either - yes.
  • pip install, then composing from YAML, works with no Go toolchain - yes, by the Forgejo route rather than PyPI. Verified from a scratch project that depends only on housecast and composes a bundle.
  • Push to main publishes the next release - not done. This is the PyPI half and it is deliberately out of scope for now.
  • README states the pairing including acompose downstream - yes.
  • agent-compose's docs point at housecast as the owner of composition - yes, including a docs/FEATURES.md entry, since where composition lives is a public boundary.

Packaging, and why there is no PyPI

Consumers depend on housecast from Forgejo through [tool.uv.sources], pinned by tag, which is the shape the estate already uses for aos-eval:

dependencies = ["housecast>=0.1.4"]

[tool.uv.sources]
housecast = { git = "https://forgejo.coilysiren.me/coilyco-flight-deck/housecast.git", tag = "housecast-v0.1.4" }

Tags housecast-v0.1.0 through v0.1.4 exist. A git tag is not a publish and reaches nobody outside the estate. The PyPI publish workflow and the name claim in #347 both remain untouched and both still want Kai. No placeholder was uploaded.

The engine installs without Inspect: eval dependencies sit behind an eval extra, so checks/ here pulls a light engine while housecast's own gates run --all-extras.

What stays in agent-compose, on purpose

checks/ holds the #333 differential oracle, which only works where both engines exist. It now runs against housecast resolved from Forgejo, so it proves the published artifact composes identically rather than a sibling working copy. It is deleted with the Go semantic layer under #339.

checks/palette.py came back out of the move. It reads internal/color/color.go and internal/palette/ directly, so it measures this repository's Go palette and its inputs do not exist in housecast.

Three things that went wrong, recorded

  • I force-moved the housecast-v0.1.0 tag rather than cutting a new one. Later fixes used fresh tags.
  • I pushed twice on a red gate, both times because a commit-and-push chain ran without gating on the check script first. Both were caught and fixed in the following commit.
  • The eval extra broke CI in a way no local run saw, because the local venv still carried the dependencies from an earlier sync. That is the same stale-environment failure as the from evalkit import palette import that kept resolving after the module moved.

Leaving this issue open for the publish. Everything else it asks for has landed.

## The move is done. The publish is what is left. `agent-compose@6086991` and `housecast@c4c2825`. Composition no longer lives here. **Moved to housecast:** the compositor from #333, `evalkit`, `challenges.yaml`, `evaluations/` and its committed evidence, the eval workflow scripts, and the typos config that keeps a spelling fix from editing a preserved model answer. **Deleted here:** all of the above, plus `internal/person/personality_anchors_test.go`. That test asserted every melded personality has a grading anchor, and both the roster and `evaluations/personality-anchors.yaml` moved, so the check moved with them rather than reaching across a repository boundary. **No Go runs in housecast.** The eval scripts called `go run ./cmd/agent-compose roster` and `compose`. housecast gained a `roster` subcommand emitting the same `person.json` shape evalkit already read, so the swap was a swap: the entity roster and the 94-line challenge matrix are identical whether derived from the Go snapshot or housecast's. ## Acceptance criteria * Repository exists, MIT, trifecta present - yes, since housecast#1. * **The compositor and evalkit live in it, and agent-compose no longer carries either** - yes. * **`pip install`, then composing from YAML, works with no Go toolchain** - yes, by the Forgejo route rather than PyPI. Verified from a scratch project that depends only on `housecast` and composes a bundle. * Push to `main` publishes the next release - **not done.** This is the PyPI half and it is deliberately out of scope for now. * README states the pairing including acompose downstream - yes. * **agent-compose's docs point at housecast as the owner of composition** - yes, including a `docs/FEATURES.md` entry, since where composition lives is a public boundary. ## Packaging, and why there is no PyPI Consumers depend on housecast from Forgejo through `[tool.uv.sources]`, pinned by tag, which is the shape the estate already uses for `aos-eval`: ```toml dependencies = ["housecast>=0.1.4"] [tool.uv.sources] housecast = { git = "https://forgejo.coilysiren.me/coilyco-flight-deck/housecast.git", tag = "housecast-v0.1.4" } ``` Tags `housecast-v0.1.0` through `v0.1.4` exist. A git tag is not a publish and reaches nobody outside the estate. **The PyPI publish workflow and the name claim in #347 both remain untouched and both still want Kai.** No placeholder was uploaded. The engine installs without Inspect: eval dependencies sit behind an `eval` extra, so `checks/` here pulls a light engine while housecast's own gates run `--all-extras`. ## What stays in agent-compose, on purpose `checks/` holds the #333 differential oracle, which only works where both engines exist. It now runs against housecast resolved from Forgejo, so it proves the *published* artifact composes identically rather than a sibling working copy. It is deleted with the Go semantic layer under #339. `checks/palette.py` came back out of the move. It reads `internal/color/color.go` and `internal/palette/` directly, so it measures this repository's Go palette and its inputs do not exist in housecast. ## Three things that went wrong, recorded * I force-moved the `housecast-v0.1.0` tag rather than cutting a new one. Later fixes used fresh tags. * I pushed twice on a red gate, both times because a commit-and-push chain ran without gating on the check script first. Both were caught and fixed in the following commit. * The `eval` extra broke CI in a way no local run saw, because the local venv still carried the dependencies from an earlier sync. That is the same stale-environment failure as the `from evalkit import palette` import that kept resolving after the module moved. Leaving this issue open for the publish. Everything else it asks for has landed.
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/agent-compose#337
No description provided.