Skip to content

The emitter is a pinned dev dependency; panelbench and the checkout machinery leave - #172

Merged
cayossarian merged 2 commits into
mainfrom
chore/emitter-as-a-dependency
Aug 28, 2026
Merged

The emitter is a pinned dev dependency; panelbench and the checkout machinery leave#172
cayossarian merged 2 commits into
mainfrom
chore/emitter-as-a-dependency

Conversation

@cayossarian

Copy link
Copy Markdown
Member

Why

Following the producers was a lockfile of pins, three sibling checkouts, a .env, a drift script, its workflow, a composite action and a pre-commit hook — and it still went stale the day after a release. The maintainer's decision: the emitter producing correct output is the emitter's job; everything else should fall out of standard pip behaviour.

What

  • ebus-panel-sim==0.8.0 is a dev dependency, in its own Dependabot PR. The capture script drives the installed emitter and is an importable function; a test regenerates the capture in-process and compares it to the shipped JSON, so a bump PR goes red exactly when the wire moved, with the fix command in the message.
  • Vendored catalogs are byte-checked against the installed emitter wheel's copies — always, no checkout, no skip.
  • panelbench leaves the library: its goldens, peer record, and every copy-matches-copy test. spec_lock.json keeps only the consumer's declaration (role, firmware, spec commit, implements).
  • Deleted: peer_drift.py, _lock.py, peer-drift.yml, .github/actions/peer-checkouts, the hook, the .env provenance variables. ~7,800 lines removed.
  • Each adapter ships its reference capture as package data (reference/parent_child_tree.json, reference/homie_schema.json) so downstream suites read the bytes their pinned version was tested against instead of vendoring a copy and guarding it. Reverses refactor: reference payloads become test fixtures, not package data (#162) #166 for the cost, not the principle.
  • schema-0 1.1.2, schema-1 1.1.3. Core unchanged.

Verification

1155 passed; the only skips are the live-panel differential. Conformance suite runs with no environment variables. Both wheels built and listed: reference JSON beside py.typed, nothing else new. Fable review: pass; its doc findings fixed in the second commit.

…nd the checkout machinery leave

`ebus-panel-sim==0.8.0` goes in the dev group, so the producer of the reference
capture installs like anything else and pip is the whole mechanism. The catalogs
are verified byte-for-byte against that wheel's own copies instead of a
specification checkout, which means the provenance checks always run rather than
skipping wherever nobody had cloned a sibling. The capture itself is an
importable function, and the suite re-runs it in-process and compares — so no
document records which release made the tree, and none can go stale.

Each adapter ships the capture its consumers test against as package data, so a
downstream suite reads the bytes its pinned version was tested against instead of
vendoring a copy and guarding it. That reverses #166 for the cost, not the
principle: no runtime path reads them either way.

`spec_lock.json` loses `peers` and stays the consumer's declaration; with the
block go peer_drift.py, its workflow, its composite action, its pre-commit hook
and _lock.py. `simulator_tree.json` and every test that existed only to compare
vendored copies are deleted; `simulator_wire.json` moves to
tests/fixtures/panelbench_wire.json, where it is what it always was — the flat
differential's matched pair.
@cayossarian
cayossarian merged commit 8fa1586 into main Aug 28, 2026
6 checks passed
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.

1 participant