Skip to content

E4-5 (band 3): own the 35-variable cut set, one unit per domain, in removal order #264

Closed

Description

@Strycher

Epic: #212

The bulk of the Epic. Appendix B lists the 35 external-linkage variables that must become deliberate ownership interfaces before the file separates into domains on its own. The file is one connected component until they do (inventory, section 3.5).

Taken in removal order, webServer first (24 users, the most-referenced variable in the file, absent from every previous plan). Each variable moves into the unit that owns it and is published through one header. No globals.h at any point (Q6, owner ruling).

Domains as the fan-in table groups them: web, GPS, peripheral availability, units and timezone, UI state, geocache, sensors (env, sht, imu, mag), display sleep, FRAM, battery. Expect this to be split into one child task per domain once band 2 has landed and the harness is proven. The split is proposed then, not now.

Two hinges the full table shows and fan-in does not: removing tftSleepMs (#21) drops the largest cluster from 101 to 82; removing oledAvailable (#35) drops it from 45 to 25.

Requires E4-1 (four of the five named structs are in this set) and E4-4 (the callers of logging must be free to move).

Acceptance

  • After the last domain lands, python scripts/reference-graph.py shows the largest shared-state cluster under 40 functions
  • Every one of the 35 is defined in exactly one unit; nm on src.ino.cpp.o no longer defines them
  • Per-domain nm comparison and hardware verification per FC rules

Evidence: docs/god-object-inventory.md. Regenerate the figures with python scripts/reference-graph.py --appendix.

Activity

  1. Strycher commented on Sep 7, 2026

    @Strycher
    OwnerAuthor

    🤖 Auto-promoted to Ready — all dependencies resolved (#260, #263 closed).

  2. added a commit that references this issue on Sep 7, 2026
  3. Strycher commented on Sep 7, 2026

    @Strycher
    OwnerAuthor

    All five children (#270–#274) are merged. The acceptance, measured on main after #279:

    • nm on src.ino.cpp.o defines none of the 35 cut-set variables.
    • python scripts/reference-graph.py: 3 external-linkage variables remain (the button-debounce state, touched only by handleButtons), 78 authored functions, 77 touching no shared state of the file, cut set 0, largest cluster 1.
    • Per-band nm proofs are in docs/god-object-inventory.md §10–§14.

    The third acceptance line — hardware verification per FC rules — is yours: nothing in band 3 was flashed. Left open for that reason; closing is the owner's call.

  4. added
    board:testingBoard sync: Testing column
    and removed
    board:readyBoard sync: Ready column
    on Sep 7, 2026
  5. Strycher commented on Sep 8, 2026

    @Strycher
    OwnerAuthor

    One deviation from the text of this issue, for the record. It says "taken in removal order, webServer first" and "one child task per domain". The five children (#270–#274) were cut by dependency layer instead, and the web unit went last: the relocation graph after band 2 showed webServer referenced only by the 23 web handlers, initWebServer and loop, with initWiFi calling initWebServer, so a web unit before the domains its handlers read would have needed those handlers declared in a header while they stayed in src.ino — the reach-back pattern the no-globals.h ruling forbids. The cut set says which variables must be owned; the graph says the order they can be. Reasoning in #270's body and docs/god-object-inventory.md §10; the decision log is docs/e4-session-2026-09-07.md §3.1.

  6. added a commit that references this issue on Sep 8, 2026
  7. Strycher commented on Sep 8, 2026

    @Strycher
    OwnerAuthor

    Closed on the owner's word 2026-09-08: band 3 merged (#270-#274), the cut set lives one unit per domain on main, and the units ran on hardware on the UM FeatherS3D via #280/#288.

  8. added
    board:doneBoard sync: Done column
    and removed
    board:testingBoard sync: Testing column
    on Sep 8, 2026
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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions