chore: remove the Device Support package pilot and its format - #133
Conversation
This is FTW's driver repository. The package pilot gave five drivers a third version line beside the catalog DRIVER version and the manifest version, under package ids that cannot contain "_" where catalog ids do. Nothing published or consumed it: the release workflow never called the packager, CI built unsigned candidates only, and no release carries a package or index asset. Removed: - packages/v1 (recipes for esphome-dsmr, foxess_h3_smart, pixii, sdm630 and sungrow, the separate pixii and sungrow target files, and the sungrow PILOT.md); - tools/driver_package.py, tools/build_candidate.py, tools/derive_sungrow_ftw_observe.py, make package-driver and the packages CI job; - the package-v1 and migration specs, the driver inventory and Blixt reference specs, and every sourceful.driver-* JSON schema, with the tests that validated them; - package fields and the pilot's own override entries from the support status, the always-empty "Stable package" column from the catalog page, and the now unused jsonschema dependency; - package and Device Support text from AGENTS.md, README.md, CONTRIBUTING.md, SECURITY.md, SOURCE_IMPORT.md and the specs. spec/control-runtime-v2.md keeps only FTW Core's v2 command interface and spec/signing.md only the FTW channel. Tests that held a rule against both a catalog driver and its package target now hold it against the catalog driver. No driver Lua, manifest or version changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuerPFZFG88kgu8sWVHeq7 Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c0ebc7cf2c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| The driver returns only `status`, `code`, optional `message`, `device_state`, | ||
| applied values and evidence names. The host creates the | ||
| `sourceful.driver-command-result/v1` record, adds the command and lease IDs, | ||
| driver identity, completion time and the number of allowed host writes, and | ||
| records the result. A nil, boolean or string Lua result fails the v2 call. |
There was a problem hiding this comment.
Restore definitions for the retained v2 records
The retained FTW v2 contract still requires sourceful.driver-command/v1 and sourceful.driver-command-result/v1, but this commit deletes their only schemas and a repo-wide search finds no remaining authoritative definition. Anyone implementing or validating this interface can no longer determine required fields, status/device-state enums, identifier constraints, or bounds, allowing Core and drivers to drift on a safety-sensitive control boundary; define the package-independent record shapes here or link to the authoritative FTW contract.
AGENTS.md reference: AGENTS.md:L17-L23
Useful? React with 👍 / 👎.
| } | ||
| } | ||
| } | ||
| {} |
There was a problem hiding this comment.
Preserve the historical signed-beta records
Replacing all overrides with {} also resets sdm630's recorded 1.1.1 betas and sungrow's 1.3.0 beta to null in the generated support status. Those are historical provenance rather than candidate-package metadata, and the retained support-status contract explicitly says this field records an older beta whose provenance must not be overwritten; consumers of support-status.json will now incorrectly report that these signed betas never existed. Keep minimal overrides for these historical versions even if the package recipes and candidate-specific gates are removed.
Useful? React with 👍 / 👎.
|
Automated maintenance pass (device-driver repo review): not merging. Content looks sound on its own evidence: all 5 CI checks green, no driver Lua/manifest/version changes, the signed-channel preflight reports no published-artifact diff ( Holding rather than merging for two reasons:
Recommend: Fredrik reviews and merges this directly in the web UI, then #132 gets rebased on top (it currently fails Generated by Claude Code |
Owner decision
Fredrik (repository owner), 2026-09-25: device-drivers is FTW's driver repository. It must not carry schemas, specs, tooling or automation for Device Support, Zap firmware or Blixt. Knowledge can be carried over by hand, with no direct coupling. As the first step, this PR removes the Device Support package pilot and the package format.
Why the pilot goes:
tools/driver_package.py. CI built only unsigned candidates (thepackagesjob invalidate.yml). No release has a package or index asset.DRIVERversion and the manifest version._, but catalog ids do. The wider aim is one id and one version per driver.If Device Support needs a package later, it can be rebuilt from the catalog driver. Git history keeps the pilot at 489c937.
Removed
packages/v1/: recipes for esphome-dsmr, foxess_h3_smart, pixii, sdm630 and sungrow, the separate target filespixii/targets/ftw.lua,sungrow/targets/ftw.luaandsungrow/targets/ftw-observe.lua, andsungrow/PILOT.md.tools/driver_package.py,tools/build_candidate.pyandtools/derive_sungrow_ftw_observe.py. Only the pilot, its tests andtest_esphome_dsmr_aliases.pyimported them.make package-driver, with itsTARGETandARTIFACT_DIRvariables.packagesCI job.tools/bump_driver.py,tools/new_driver.pyandtools/check_public_boundary.py.jsonschemadependency (uv.lockonly drops it and its transitive packages).spec/driver-package-v1.mdandspec/driver-package-v1-migration.md.spec/driver-inventory-v1.mdandspec/blixt-lua-reference-architecture.md, which describe the inventory format and Blixt's use of packages.spec/schemas/sourceful.driver-*.jsonschemas.tests/test_driver_package.py.tests/test_driver_runtime_contracts.py, which only validated the removed schemas.test_ftw_legacy_parity.py,test_host_api_profile.py,test_no_undefined_locals.py,test_absent_optional_registers.py,test_sungrow_model_family.pyand the Lua harnesstest_all_drivers.lua.package_id,candidate_package_version,stable_package_versionandcontrol_enabledare removed from the generator and the generated files. All four came from the recipes.support-status-overrides.jsonentries are removed (pixii, goodwe, sdm630, sungrow). They described only the pilot's own package targets and candidate versions, such as "Version 1.3.2 … must not run on the pilot site". Those packages no longer exist.drivers/lua/README.md,drivers/lua/GUIDELINES.md,drivers/INTEGRATION_OVERVIEW.md, CODEOWNERS and the PR template. AGENTS.md "Where a driver change has to land" now lists two places, not three.Kept, and why
spec/control-runtime-v2.md: trimmed to FTW Core's v2 command interface. That coversdriver_command_v2anddriver_default_mode_v2, write scope, leases and the HIL gate. FTW Core implements this interface ingo/internal/drivers/control_v2.go, and the catalog driverfoxess_h3_smartimplements it too. The package envelope,control_enabledand Blixt profile text is gone.spec/signing.md: trimmed to the FTW channel. The canonical-bytes section now describes the FTW manifest, which uses the same canonical JSON.host_api_min/max,read_only = true, and no write-capable host call.driver_package.pywas the esphome test above and the runtime-contract tests. Those tests validated only the removed schemas.SOURCE_IMPORT.mdandsource-import-delta.jsonstill record where the initial import came from. The delta file still lists the three recipe paths as part of that record. Only the present-tense sentence about the private service consuming this repository is removed.check_public_boundary.py: still forbids the private repository name and signing-role strings. Those guards prevent coupling.foxess_h3_smart.lua:168-170andsungrow.lua:793. They are left for the id/version branch, because editing them needs a version bump.Test evidence
make check: green. 4365 passed, 1068 skipped. On untouchedmainit was 4406 passed, 1069 skipped.ftw-v2cases.tools/ftw_repository.py check-versionsagainst the publisheddrivers-betamanifest) reports{"added": [], "changed": [], "drivers": 88}. No published artifact changes.make sitebuilds.drivers.jsontarget records no longer carrystableorcontrol_enabled.test_all_drivers.luadoes not run in CI:sungrow-ftw-v2.maintoo and are unchanged.Overlaps
fix/one-identity-per-driver(one id and one version per driver) is not a PR yet. It touches the same files:tools/bump_driver.py;drivers/tests/test_no_undefined_locals.py;drivers/tests/test_esphome_dsmr_aliases.py. It renamesesphome-dsmr.luatoesphome_dsmr.lua, so the rewritten read-only check here needs that path after a rebase.support-status.jsonandSUPPORT_STATUS.md. Regenerate them after rebasing.Remaining couplings, not removed here
tools/generate_support_status.py,support-status.json,SUPPORT_STATUS.md,support-status-overrides.json(now{}),spec/support-status.mdand the site's per-target table.ftw-coreandblixt-l1, and every value is now a default. Candidate for full removal, which changes the catalog page.spec/host-api-profile.json(theblixt-l1profile, theftw_to_blixtdialect and Blixt emit-key rules),spec/host-api.mdandtools/host_api_check.py.tests/test_host_api_profile.py,tests/test_blueprint.pyanddrivers/tests/test_modbus_drivers.py.blueprint/BLUEPRINT.luacomments, the README Scope and "One driver per device" paragraphs, the GUIDELINES.md intro,docs/WRITING-A-DRIVER.md:275, and the site text "publishes for FTW and Blixt".tools/bump_driver.pyrewritingDRIVER_MANIFESTversions.DRIVER_MANIFESTtables in acuvim, deye-svk, 50-125k-svk, 50-125k-svk-slew, 50-125k-svk-ac-slew, konja-261-svk, sdm630 and foxess_h3_smart.blixt-l1/driver_package.pycomment and the sungrow package-target comment.go/internal/driverrepo/sourceful.go). FTW's own channel publishes v1 control.spec/control-runtime-v2.md, foxess_h3_smart's v2 entrypoints anddrivers/tests/test_foxess_h3_smart_control.pyare reachable in FTW only through Device Support.tools/build_luac.shbuilds 32-bit Lua 5.5 "compatible with ESP32-C3 (Zap gateway)".make checkand the harness use that build.bytecode_sha256,bytecode_signature,bytecode_sizeandsignatureare empty in all 88 manifests. They are still read bytools/generate_index.pyand described inspec/manifest-v2.md.tools/import_ftw_baseline.pyreports against a Zap bytecode limit.drivers/INTEGRATION_OVERVIEW.mdis a stale overview of gateway firmware and the cloud.dkb_id(Hugin DKB profile id) is set in 47 manifests. It is also written bynew_driver.pyandmigrate_manifests.pyand described inspec/manifest-v2.md.baselines/ftw/source-map.jsonhaspackage_eligibilityon all 37 entries, written bytools/import_ftw_baseline.py.drivers/type_mapping.yamlmaps names to Nova Core, but nothing reads it.drivers/lua/zap.luais an FTW driver for a Zap P1/HAN meter and stays.🤖 Generated with Claude Code
https://claude.ai/code/session_01MuerPFZFG88kgu8sWVHeq7