From 29c8d873ed23c77e30b41ad700b76b79d0c02e21 Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sat, 17 Oct 2026 07:02:55 +0200 Subject: [PATCH 1/3] docs: propose a stepwise plan to make FTW safe for agents to change Agents write most of FTW, and review bots raised 1,150 findings on 573 of their pull requests. This plan groups those findings into recurring mistake classes, proposes a structural fix for each at the highest level that works, backtests each fix against the history, and orders the fixes into independently mergeable steps. Steps 1, 2 and 4 are draft PRs #1676, #1677 and #1678. tools/agent-pitfalls holds the script and the labels so a reviewer can rerun or spot-check every number. --- docs/agent-friendly-plan.md | 254 +++++++ tools/agent-pitfalls/README.md | 15 + tools/agent-pitfalls/findings.csv | 1151 +++++++++++++++++++++++++++++ tools/agent-pitfalls/findings.py | 118 +++ 4 files changed, 1538 insertions(+) create mode 100644 docs/agent-friendly-plan.md create mode 100644 tools/agent-pitfalls/README.md create mode 100644 tools/agent-pitfalls/findings.csv create mode 100644 tools/agent-pitfalls/findings.py diff --git a/docs/agent-friendly-plan.md b/docs/agent-friendly-plan.md new file mode 100644 index 000000000..2fd935220 --- /dev/null +++ b/docs/agent-friendly-plan.md @@ -0,0 +1,254 @@ +# Making FTW safe for agents to change (proposed) + +Status: proposed. Every step below is a separate pull request. Steps 1, 2 +and 4 exist as drafts. The rest are designs. Nothing has merged. + +Agents write most of FTW. 919 of the 2,250 commits on `master` carry a +Claude co-author trailer, and 346 of the 1,415 pull requests come from +`agent/`, `codex/`, `claude/` or `cursor/` branches. Both counts are lower +bounds, since many agent PRs carry no marker. Review bots then raised +1,150 inline findings on 573 of those pull requests. 760 of the 1,735 +conventional commits on `master` are `fix` commits. + +Agents copy the nearest example and take the shortest path that compiles. +If the repository lets a wrong change look right from inside one file, an +agent will make it. This plan changes the repository so that the wrong +change fails to compile, fails CI, or cannot be written. + +## How the method works + +The method comes from @poteto's pstack skills (`/correct`, `/architect`, +`/create-verification-skill`). It treats repeated agent mistakes as defects +in the repository, not in the agent. + +1. **Collect the corrections.** Read what reviewers and the owner keep + pointing out: review comments, fix commits, reverts, issues, and the + rules in AGENTS.md. Here the main source is the 1,150 bot findings, plus + the 71 issues labelled `bug` or `release-blocker`. +2. **Group them into classes.** One finding is an accident. A class is a + mistake that keeps coming back. A class counts once it has happened + twice. +3. **Fix each class at the highest level that works.** In order: + architecture (one owner, one way to do the task, so the wrong way does + not exist), then types (the bad state cannot be written), then a lint or + CI check whose error names the fix, then a behaviour test. Docs come last, + because nothing fails when an agent skips them. +4. **Sketch the shape before the code.** For an architectural fix, write + the types and signatures first and compare at least two shapes + (`/architect`). +5. **Answer open questions by building, not by asking.** Whether the race + detector finds anything is a fact you can observe, so the prototype runs + it. +6. **Backtest.** For each proposed structure, count how many historical + mistakes it would have caught, then rank the structures by that count. + A structure that would have caught nothing does not earn its cost. +7. **Prove each check on a real past mistake.** A new check must fail on a + commit that actually had the bug, and pass on today's `master`. +8. **Give agents a way to prove behaviour.** A verification skill starts + the real app and drives it, so "it works" means a run, not a reading of + the code. +9. **Keep a rule table.** AGENTS.md pairs each rule with the thing that + enforces it. A rule with no enforcer is the next candidate for steps 3–7. + +## The data + +`tools/agent-pitfalls/findings.py` is the lever. It extracts the findings, +classifies them, backtests them and prints the report. Classification and +backtest are LLM judgements, made in batches of 40. +`tools/agent-pitfalls/findings.csv` holds every label, so a reviewer can +spot-check any row. + +Codex labelled all 1,150 findings, and Grok labelled 920 of them +independently as a second rater. The two agreed on 78.9 % of those 920 +(726). Both raters put the same four classes in their top five. + +| Class | Findings | PRs | P1 or High | +|---|---:|---:|---:| +| concurrency-lifecycle: races, ordering, cancellation, restart, retry | 208 | 149 | 59 | +| incomplete-wiring: new behaviour missing on some entry point, or a refactor drops a path | 197 | 145 | 70 | +| legacy-state: stored config, DB rows or YAML seeds on existing installs ignored | 102 | 79 | 45 | +| unknown-as-value: missing, stale or failed data used as 0, default or last value | 101 | 83 | 32 | +| duplicated-truth: one rule in several places, or docs contradicting code | 95 | 71 | 8 | +| power-units-sign | 77 | 64 | 34 | +| release-ci | 77 | 67 | 32 | +| ui-contract | 75 | 58 | 11 | +| security | 73 | 56 | 31 | +| silent-failure | 56 | 47 | 12 | +| other | 89 | 71 | 16 | + +The bugs that escaped to issues (71) follow the same top classes: +concurrency-lifecycle 15, security 12, legacy-state 10, unknown-as-value 8. + +## The top five pitfalls + +**1. Concurrency and lifecycle (208).** Examples: OCPP not restarted on a +config hot-reload (#979), a stale driver-restart callback acting on an old +config copy (#1628), and Lua VM state lost when reprobing fails (#982). +CI runs `go test` without `-race`. Agents often report "race tests pass" +from local runs, yet #787 and #789 merged with data races in test fakes. +- **Level: CI check now, architecture later.** The race detector is the + cheapest check that fails on real past mistakes, and it is the highest + level available without redesigning goroutine ownership. +- **Why not higher yet.** Goroutine ownership is spread across 12,803 lines + in `go/cmd/ftw` (4,169 of them in `main.go`). That redesign is step 5. + +**2. Incomplete wiring (197).** A behaviour is added to one entry point and +missed on another. Examples: the setup wizard writes `cfg.ev_charger` but +never ships the Zaptec runtime driver (#977); OCPP chargers never receive +setpoints because only the plain send path was wrapped (#979); box-page +approvals do not return rejected results (#1646). Writes to Core arrive +through the HTTP API, the web UI, Home Assistant, the app protocol, the +CLI and the watchdog. Where a single door exists, it works. +`control.ApplyMode` is commented as "the one door into a mode change", and +the app protocol reuses the API handler through `Via(appproto.OpSetMode)`. +But callers still take `CtrlMu` themselves, and `internal/api` calls the +driver registry's `Send` directly in three places. Inferred from the +findings, not measured: most wiring misses are paths without such a door. +- **Level: architecture (step 5).** No lint can tell that a new entry point + forgot a rule. Only a single door can guarantee it. + +**3. Stored state on existing installs (102).** A change works on a fresh +box and breaks an upgraded one. Examples: a removed config key that old +YAML still sets (#124); legacy price rows left valid after a currency +marker was added (#748); a legacy YAML planner value skipped on upgrade +(#1018). Migrations live in `internal/state` +(ad hoc `ALTER TABLE`), `internal/config`, `internal/cars`, +`internal/driverrepo` and one-off functions in `cmd/ftw`. No test boots +Core on data from an older release. +- **Level: architecture plus a test (step 7).** One migration registry, and + an upgrade corpus that CI boots. + +**4. Missing or stale data used as a value (101).** Examples: offline EV +telemetry summed into the dispatch EV total (#36); stale PV readings used +as the live prediction anchor (#85); `siteLoadW` built from stale readings +and returning 0 when the meter is missing (#310). `telemetry.Store` keeps a +reading after its driver goes stale, and `Get`, `ReadingsByType` and +`ReadingsByDriver` return it unfiltered. Health filtering is opt-in. There +are 147 direct reads outside the package, 35 of them `ReadingsByType` +calls, against 11 `TelemetryLive()` checks. Direct reads of `RawW` and +`SmoothedW` alone grew from 44 in 8 files (1 May) to 101 in 20 files +(17 October). +- **Level: lint now (step 2), then types (step 3).** The ratchet stops new + cases today. Step 3 makes the safe accessor the only one. + +**5. Duplicated truth (95).** 40 of these findings are in `docs/`, where +prose restates code and drifts from it. Others are web constants that copy +Go, or Lua host helpers that docs promise but the host does not expose +(#20, #22). +- **Level: architecture (step 6).** Generate from one Go definition, or + delete the prose. + +## Backtest + +For every finding, the backtest asked: had this structure existed before +the PR, would the mistake fail to compile, fail CI, or be impossible to +write? The judge (Codex) was told to be strict, so "might help" counts as +no. Because this is an LLM judgement, treat the counts as a ranking, not a +precise rate. + +| Structure | Caught | P1 or High | Mostly in | +|---|---:|---:|---| +| S5 one source of truth, generated or deleted docs | 85 | 14 | duplicated-truth 54, incomplete-wiring 18 | +| S1 one write path into Core, shared case table per adapter | 69 | 28 | incomplete-wiring 36, concurrency 9 | +| S2 race detector and lifecycle harness in CI | 37 | 12 | concurrency 35 | +| S3 typed freshness at the telemetry boundary | 33 | 14 | unknown-as-value 32 | +| S4 migration registry plus upgrade corpus | 30 | 17 | legacy-state 27 | +| S6 distinct unit types for W, Wh, SoC, A, money | 8 | 1 | power-units-sign 7 | +| Any of the six | 257 of 1,150 | | | + +Besides the LLM judge, two checks were tested against git history +directly: +- The race detector fails on the parent commits of #787 and #789, and + passes on `master`. +- The telemetry ratchet fails on the merged commits of #36, #85, #310 and + #647. Over 1,423 first-parent commits it would have fired 42 times. Of the + 33 of those that came from numbered PRs, 10 had an unknown-as-value + finding. + +S6 is dropped for now. It would have caught 8 findings, and the existing +`internal/units` reflection tests already cover kWp and SoC scale. The +other 893 findings (78 %) need judgement, or a structure not on this list. + +## Steps + +Each step merges on its own and leaves `master` working. They are ordered +by what the backtest and the proofs support, cheapest first. + +1. **Race detector in CI.** Draft #1676. One job, one script, no product + code. It catches the concurrency class at the CI level. +2. **Telemetry read ratchet.** Draft #1677. It stops unknown-as-value from + growing, and its error names the safe accessor. +3. **Health-gated telemetry accessors** (S3, types). Add + `Store.Live(driver, type) (Reading, bool)` and + `Store.LiveByType(type) []Reading`. They return copies and skip stale, + offline and faulted drivers. Migrate the 147 reads package by package, + with the ratchet proving each count only falls. Then make `Get` and + `ReadingsByType` unexported, and delete the ratchet once the count is 0. +4. **verify-ftw skill.** Draft #1678. It is a scripted launch, doctor, + drive and cleanup over the simulators, proved end to end. Agents use it + before claiming behaviour. +5. **One write path into Core** (S1, architecture). Settings and control + requests become typed commands handled by one Core service that owns the + locks. The API, web, HA, app protocol, CLI and watchdog become adapters. + One case table runs against every adapter. Start with the existing mode + door (`control.ApplyMode`), then driver control and EV, then settings. + An import check like `check-cloudlink-imports.sh` keeps adapters from + reaching control internals. This step also splits `cmd/ftw/main.go` + along the same seams. Run `/architect` with two competing sketches + before writing code. +6. **One source of truth** (S5). Generate the web's shared constants and + field lists from one definition, the way `appproto/gencontract` already + turns `contract/registry.yaml` into Go constants for the box and FTW + Cloud. Generate the Lua host API reference from + `go/internal/drivers/lua.go`. + Delete docs that restate code, and add a drift check to CI. +7. **Migration registry and upgrade corpus** (S4). Every change to + persisted shapes registers one migration. CI boots Core on state + captured from the last stable and the last beta, runs each migration + twice, and compares the result. +8. **AGENTS.md rule table.** Shrink the prose and add a table that pairs + each rule with its enforcer. This waits for #1364, which also edits + AGENTS.md and has right of way. + +## Proposed AGENTS.md rule table + +Status of today's rules. "No check found" means I found nothing in +`.github/scripts`, `scripts/`, the Makefile or the workflows. Tests may +cover a rule indirectly. + +| Rule | Enforced by | +|---|---| +| FTW Cloud uplink imports only `go/protocol` | `check-cloudlink-imports.sh` | +| `go/protocol` imports nothing from the box | `check-protocol-boundary.sh` | +| No agent planning documents | `check-no-planning-docs.sh` | +| User-visible change needs a changeset | `changeset-check.yml` | +| Database queries stay in `go/internal/state` | No check found. `internal/driverrepo` and `internal/backup` import `database/sql` today | +| Planner output is never sent directly to hardware | No check found. `internal/mpc` does not depend on `internal/drivers` today, so an import check would pass | +| Sign conversion only at the driver boundary | No check found | +| Stale site-meter data stops dispatch | Control tests; seen live in the verify-ftw run | +| No new race | Step 1 | +| No new direct telemetry read | Step 2, then step 3 types | + +The two "no check found" rules that pass today (planner and database) +cost one import check each, written the same way as the cloudlink check. +They are good first follow-ups once steps 1 and 2 land. + +## Open questions settled by prototypes + +- *Does the race detector find anything today, or would the CI job be red + on day one?* It passes on all 16 package trees on `master`. It fails on + the two historical races. +- *Can a check for stale reads be precise enough?* As a ratchet on new + reads, it fired on 42 of 1,423 commits, and it caught four of the PRs + where review found the stale-read bug. +- *Can an agent run Core end to end without hardware?* Yes, with the + simulators on isolated ports, in about 15 seconds after the build. + +## Left for the owner + +- Whether the CI cost of the race job is worth it on every Core PR, or only + on PRs that touch the listed packages. +- Whether `tools/agent-pitfalls/` stays in the repo, or the plan merges + without it. +- The order of steps 5–7. The backtest ranks S5 and S1 above S4 by count, + and S1 and S4 above S5 by P1/High findings. diff --git a/tools/agent-pitfalls/README.md b/tools/agent-pitfalls/README.md new file mode 100644 index 000000000..281030993 --- /dev/null +++ b/tools/agent-pitfalls/README.md @@ -0,0 +1,15 @@ +# Agent pitfalls + +The lever behind [docs/agent-friendly-plan.md](../../docs/agent-friendly-plan.md). + +```bash +gh api --paginate 'repos/srcfl/ftw/pulls/comments?per_page=100' | jq -s add > review_comments.json +python3 findings.py extract review_comments.json findings.json +python3 findings.py classify findings.json labels.json codex # or grok, sonnet +python3 findings.py backtest findings.json backtest.json codex +python3 findings.py report findings.json labels.json backtest.json +``` + +`findings.csv` holds the labels behind the plan's numbers: one row per bot +finding, the Codex and Grok classes (Grok labelled 920 of 1,150) and the +structures the backtest judged would have caught it. diff --git a/tools/agent-pitfalls/findings.csv b/tools/agent-pitfalls/findings.csv new file mode 100644 index 000000000..ff062cfd5 --- /dev/null +++ b/tools/agent-pitfalls/findings.csv @@ -0,0 +1,1151 @@ +url,pr,path,bot,priority,class_codex,class_grok,caught_by +https://github.com/srcfl/ftw/pull/1#discussion_r3084423145,1,docs/architecture.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/2#discussion_r3084429921,2,docs/tsdb.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/2#discussion_r3084429922,2,docs/tsdb.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/4#discussion_r3084441553,4,docs/api.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/5#discussion_r3084445164,5,docs/operations.md,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign,S5 +https://github.com/srcfl/ftw/pull/5#discussion_r3084445172,5,docs/operations.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/6#discussion_r3084449616,6,docs/testing.md,chatgpt-codex-connector[bot],P2,release-ci,other, +https://github.com/srcfl/ftw/pull/7#discussion_r3084455020,7,docs/writing-a-driver.md,chatgpt-codex-connector[bot],P2,release-ci,other, +https://github.com/srcfl/ftw/pull/9#discussion_r3084456896,9,docs/ml-models.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/11#discussion_r3084461912,11,go/internal/configreload/CLAUDE.md,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/13#discussion_r3084492502,13,README.md,chatgpt-codex-connector[bot],P2,release-ci,duplicated-truth, +https://github.com/srcfl/ftw/pull/14#discussion_r3084983090,14,docs/driver-catalog.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/14#discussion_r3084983100,14,docs/writing-a-driver-with-claude-code.md,chatgpt-codex-connector[bot],P2,release-ci,silent-failure, +https://github.com/srcfl/ftw/pull/16#discussion_r3084990890,16,README.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/17#discussion_r3085001569,17,README.md,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/17#discussion_r3085001574,17,docs/testing-drivers-live.md,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,duplicated-truth, +https://github.com/srcfl/ftw/pull/15#discussion_r3085005861,15,drivers/huawei.lua,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/25#discussion_r3085018093,25,drivers/victron.lua,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/25#discussion_r3085018098,25,drivers/victron.lua,chatgpt-codex-connector[bot],P1,power-units-sign,other, +https://github.com/srcfl/ftw/pull/25#discussion_r3085018106,25,drivers/victron.lua,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/18#discussion_r3085018394,18,drivers/sdm630.lua,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/23#discussion_r3085018427,23,drivers/sma.lua,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/19#discussion_r3085020822,19,drivers/fronius.lua,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/30#discussion_r3085021627,30,drivers/solaredge.lua,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/20#discussion_r3085023137,20,drivers/growatt.lua,chatgpt-codex-connector[bot],P1,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/21#discussion_r3085029414,21,drivers/kostal.lua,chatgpt-codex-connector[bot],P1,other,other, +https://github.com/srcfl/ftw/pull/22#discussion_r3085029755,22,drivers/pixii.lua,chatgpt-codex-connector[bot],P1,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/31#discussion_r3085043033,31,drivers/ferroamp_modbus.lua,chatgpt-codex-connector[bot],P1,other,other,S1 +https://github.com/srcfl/ftw/pull/31#discussion_r3085043044,31,drivers/ferroamp_modbus.lua,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/33#discussion_r3086321332,33,web/app.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/35#discussion_r3086341549,35,docs/writing-a-driver.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/36#discussion_r3086355316,36,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/37#discussion_r3087173670,37,go/internal/ocpp/server.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/37#discussion_r3087173679,37,go/internal/ocpp/handlers.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S1 +https://github.com/srcfl/ftw/pull/40#discussion_r3088464945,40,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,power-units-sign, +https://github.com/srcfl/ftw/pull/41#discussion_r3088533020,41,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/41#discussion_r3088533028,41,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/43#discussion_r3090751062,43,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/43#discussion_r3090751066,43,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/45#discussion_r3090791707,45,go/internal/pvmodel/service_test.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/44#discussion_r3090797856,44,drivers/huawei.lua,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/44#discussion_r3090797858,44,drivers/solaredge.lua,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/47#discussion_r3090802191,47,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/48#discussion_r3090906092,48,go/internal/ha/bridge_test.go,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/49#discussion_r3090910663,49,docs/host-api.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/52#discussion_r3090922284,52,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,other, +https://github.com/srcfl/ftw/pull/53#discussion_r3091170090,53,.github/workflows/release.yml,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/53#discussion_r3091170130,53,.dockerignore,Copilot,none,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/53#discussion_r3091170152,53,Dockerfile,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/56#discussion_r3091332977,56,go/internal/drivers/lua.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/57#discussion_r3091344645,57,web/settings.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,ui-contract,S1 S5 +https://github.com/srcfl/ftw/pull/57#discussion_r3091344649,57,web/settings.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract,S5 +https://github.com/srcfl/ftw/pull/57#discussion_r3091344653,57,web/settings.js,chatgpt-codex-connector[bot],P2,legacy-state,unknown-as-value, +https://github.com/srcfl/ftw/pull/58#discussion_r3091354709,58,go/internal/config/config.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/58#discussion_r3091354715,58,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/59#discussion_r3091359056,59,drivers/easee_cloud.lua,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/61#discussion_r3091417840,61,drivers/easee_cloud.lua,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/63#discussion_r3091450297,63,web/app.js,Copilot,none,ui-contract,unknown-as-value, +https://github.com/srcfl/ftw/pull/63#discussion_r3091450335,63,web/app.js,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/63#discussion_r3091450363,63,go/internal/api/api.go,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/65#discussion_r3091996601,65,go/internal/config/config.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/65#discussion_r3091996610,65,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/66#discussion_r3092244569,66,web/setup.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,ui-contract,S5 +https://github.com/srcfl/ftw/pull/66#discussion_r3092244573,66,web/setup.html,chatgpt-codex-connector[bot],P1,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/68#discussion_r3092250420,68,web/app.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/67#discussion_r3092271224,67,go/cmd/forty-two-watts/bootstrap.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068140,72,drivers/easee_cloud.lua,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068254,72,web/settings.js,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068317,72,web/index.html,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068398,72,web/app.js,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068445,72,go/internal/config/config.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068506,72,go/internal/api/api.go,Copilot,none,silent-failure,silent-failure,S1 +https://github.com/srcfl/ftw/pull/72#discussion_r3094068542,72,go/internal/evcloud/easee.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068623,72,go/internal/evcloud/evcloud.go,Copilot,none,concurrency-lifecycle,silent-failure, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068704,72,web/settings.js,Copilot,none,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068757,72,web/app.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/72#discussion_r3094068787,72,go/internal/config/config.go,Copilot,none,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/73#discussion_r3095080552,73,go/internal/api/api.go,chatgpt-codex-connector[bot],P1,ui-contract,unknown-as-value, +https://github.com/srcfl/ftw/pull/73#discussion_r3095080560,73,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/76#discussion_r3096301596,76,web/settings.js,Copilot,none,ui-contract,ui-contract,S5 +https://github.com/srcfl/ftw/pull/76#discussion_r3096301627,76,web/setup.js,Copilot,none,ui-contract,incomplete-wiring, +https://github.com/srcfl/ftw/pull/76#discussion_r3096301648,76,drivers/zap.lua,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/77#discussion_r3097806258,77,.github/workflows/release.yml,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/72#discussion_r3098744334,72,web/app.js,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/72#discussion_r3098744377,72,go/internal/evcloud/easee.go,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/79#discussion_r3099413508,79,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/85#discussion_r3099906155,85,go/internal/pvmodel/service.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/87#discussion_r3100088116,87,go/internal/forecast/forecast_solar.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/88#discussion_r3100142597,88,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/91#discussion_r3100815449,91,go/internal/forecast/forecast_solar.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/91#discussion_r3100815453,91,web/settings.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/93#discussion_r3100937455,93,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P1,power-units-sign,unknown-as-value, +https://github.com/srcfl/ftw/pull/95#discussion_r3102334532,95,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/95#discussion_r3102334535,95,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,unknown-as-value, +https://github.com/srcfl/ftw/pull/97#discussion_r3104571630,97,go/internal/loadmodel/model.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/97#discussion_r3104571633,97,go/internal/pvmodel/model.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/99#discussion_r3104590596,99,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P1,power-units-sign,unknown-as-value, +https://github.com/srcfl/ftw/pull/99#discussion_r3104590600,99,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/100#discussion_r3104616334,100,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P1,other,other, +https://github.com/srcfl/ftw/pull/100#discussion_r3104616336,100,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/101#discussion_r3104631866,101,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,unknown-as-value,S1 +https://github.com/srcfl/ftw/pull/101#discussion_r3104631870,101,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,legacy-state, +https://github.com/srcfl/ftw/pull/101#discussion_r3104631874,101,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S5 +https://github.com/srcfl/ftw/pull/104#discussion_r3104808257,104,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/104#discussion_r3104808258,104,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/105#discussion_r3104850558,105,web/diagnose.js,chatgpt-codex-connector[bot],P1,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/105#discussion_r3104850559,105,web/diagnose.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/107#discussion_r3105003440,107,docker-compose.yml,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/107#discussion_r3105003457,107,docs/self-update.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/107#discussion_r3105003465,107,go/cmd/ftw-updater/main.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/107#discussion_r3105003472,107,go/cmd/forty-two-watts/main.go,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/107#discussion_r3105003475,107,docs/self-update.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/107#discussion_r3105003481,107,web/update-badge.js,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/107#discussion_r3105003488,107,go/internal/api/api_selfupdate.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/107#discussion_r3105003493,107,go/internal/api/api_selfupdate.go,Copilot,none,ui-contract,ui-contract,S5 +https://github.com/srcfl/ftw/pull/107#discussion_r3105003499,107,web/update-badge.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/107#discussion_r3105003506,107,docs/self-update.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/111#discussion_r3105153030,111,go/internal/proxy/proxy.go,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/111#discussion_r3105153035,111,go/internal/proxy/proxy.go,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/111#discussion_r3105153038,111,go/cmd/forty-two-watts/main.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/111#discussion_r3105153041,111,docs/development.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/111#discussion_r3105153046,111,docs/development.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/111#discussion_r3105153047,111,go/internal/proxy/proxy.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/112#discussion_r3105176733,112,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/112#discussion_r3105176734,112,web/app.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/112#discussion_r3105176735,112,web/diagnose.js,chatgpt-codex-connector[bot],P2,ui-contract,unknown-as-value, +https://github.com/srcfl/ftw/pull/113#discussion_r3105199443,113,web/next.css,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/113#discussion_r3105199453,113,web/next.html,Copilot,none,ui-contract,other, +https://github.com/srcfl/ftw/pull/113#discussion_r3105199464,113,web/next.html,Copilot,none,ui-contract,other, +https://github.com/srcfl/ftw/pull/113#discussion_r3105199475,113,web/next-app.js,Copilot,none,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/113#discussion_r3105199477,113,web/next-app.js,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/113#discussion_r3105199482,113,web/next-app.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/113#discussion_r3105199488,113,web/next-app.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/115#discussion_r3106051354,115,drivers/solaredge_pv.lua,Copilot,none,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/115#discussion_r3106051371,115,drivers/pixii.lua,Copilot,none,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/116#discussion_r3106057120,116,drivers/ctek.lua,Copilot,none,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/116#discussion_r3106057126,116,drivers/ctek_mqtt.lua,Copilot,none,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/116#discussion_r3106057128,116,drivers/ctek_v2.lua,Copilot,none,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/116#discussion_r3106057131,116,docs/driver-catalog.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/116#discussion_r3106057134,116,go/internal/configreload/watcher.go,Copilot,none,other,other,S1 +https://github.com/srcfl/ftw/pull/116#discussion_r3106057137,116,docs/driver-catalog.md,Copilot,none,other,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/116#discussion_r3106057147,116,web/setup.js,Copilot,none,incomplete-wiring,incomplete-wiring,S1 S5 +https://github.com/srcfl/ftw/pull/116#discussion_r3106057154,116,web/setup.js,Copilot,none,incomplete-wiring,incomplete-wiring,S1 S5 +https://github.com/srcfl/ftw/pull/119#discussion_r3106403837,119,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/121#discussion_r3106409816,121,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/121#discussion_r3106409818,121,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P2,legacy-state,unknown-as-value, +https://github.com/srcfl/ftw/pull/122#discussion_r3106412204,122,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/124#discussion_r3106450628,124,go/internal/config/config.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/126#discussion_r3106554577,126,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/128#discussion_r3106959009,128,web/setup.html,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/128#discussion_r3106959016,128,web/components/ftw-update-check.js,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/116#discussion_r3106960256,116,web/setup.js,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/116#discussion_r3106960263,116,web/setup.js,Copilot,none,incomplete-wiring,incomplete-wiring,S1 S5 +https://github.com/srcfl/ftw/pull/116#discussion_r3106960268,116,web/setup.js,Copilot,none,ui-contract,incomplete-wiring, +https://github.com/srcfl/ftw/pull/116#discussion_r3106960270,116,web/setup.js,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/116#discussion_r3106960277,116,drivers/ctek.lua,Copilot,none,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/116#discussion_r3106960285,116,drivers/ctek_v2.lua,Copilot,none,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/131#discussion_r3107040333,131,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,incomplete-wiring, +https://github.com/srcfl/ftw/pull/132#discussion_r3107045903,132,go/cmd/forty-two-watts/nova_claim.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/132#discussion_r3107045904,132,go/internal/nova/publisher.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/132#discussion_r3107045905,132,go/internal/nova/publisher.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/136#discussion_r3107283843,136,go/internal/pvmodel/model.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,other, +https://github.com/srcfl/ftw/pull/138#discussion_r3107672879,138,go/cmd/forty-two-watts/main.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/138#discussion_r3107672884,138,go/cmd/forty-two-watts/main.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/138#discussion_r3107672891,138,go/internal/control/ev_dispatch.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/138#discussion_r3107672895,138,go/internal/control/ev_dispatch.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/138#discussion_r3107672898,138,go/internal/control/ev_dispatch_test.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690679,137,web/next-app.js,Copilot,none,ui-contract,unknown-as-value, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690689,137,web/components/ftw-history-card.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690692,137,web/components/ftw-history-card.js,Copilot,none,ui-contract,other, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690694,137,web/components/ftw-history-card.js,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690695,137,web/components/ftw-energy-flow.js,Copilot,none,ui-contract,other, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690702,137,go/internal/api/api.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690706,137,go/internal/api/api.go,Copilot,none,silent-failure,unknown-as-value, +https://github.com/srcfl/ftw/pull/137#discussion_r3107690712,137,go/internal/api/api.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/141#discussion_r3109060377,141,web/update-badge.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/144#discussion_r3109214511,144,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,incomplete-wiring, +https://github.com/srcfl/ftw/pull/148#discussion_r3109386133,148,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/148#discussion_r3109386138,148,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/149#discussion_r3109430148,149,web/update-badge.js,chatgpt-codex-connector[bot],P1,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/149#discussion_r3109430152,149,go/internal/api/api_selfupdate.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/150#discussion_r3109448893,150,web/components/ftw-energy-flow.js,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/150#discussion_r3109448932,150,web/settings.js,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/150#discussion_r3109448988,150,web/components/ftw-history-card.js,Copilot,none,ui-contract,other, +https://github.com/srcfl/ftw/pull/150#discussion_r3109449022,150,web/components/ftw-bar-chart.js,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/150#discussion_r3109449042,150,web/components/ftw-energy-flow.js,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/150#discussion_r3109449062,150,web/components/ftw-energy-flow.js,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/152#discussion_r3109534658,152,go/internal/api/api_selfupdate.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/152#discussion_r3109534662,152,go/cmd/ftw-updater/main.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/152#discussion_r3109534667,152,go/cmd/ftw-updater/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,incomplete-wiring, +https://github.com/srcfl/ftw/pull/154#discussion_r3109661971,154,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/156#discussion_r3110054341,156,web/settings.js,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/156#discussion_r3110054381,156,web/settings.js,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/156#discussion_r3110054417,156,web/index.html,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/156#discussion_r3110054458,156,web/components/ftw-pv-arrays-3d.js,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/156#discussion_r3110054489,156,web/components/ftw-pv-arrays-3d.js,Copilot,none,concurrency-lifecycle,incomplete-wiring, +https://github.com/srcfl/ftw/pull/156#discussion_r3110054526,156,web/components/ftw-pv-arrays-3d.js,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/159#discussion_r3112899814,159,go/internal/notifications/service.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/159#discussion_r3112899872,159,go/cmd/forty-two-watts/main.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/159#discussion_r3112899901,159,go/internal/notifications/service.go,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/159#discussion_r3112899925,159,go/internal/notifications/service.go,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/159#discussion_r3112899954,159,go/internal/notifications/service.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/159#discussion_r3112899992,159,web/settings/tabs/notifications.js,Copilot,none,duplicated-truth,legacy-state, +https://github.com/srcfl/ftw/pull/159#discussion_r3112900010,159,web/settings/tabs/notifications.js,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/163#discussion_r3114978189,163,go/internal/ha/bridge.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S1 +https://github.com/srcfl/ftw/pull/163#discussion_r3114978190,163,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure,S1 +https://github.com/srcfl/ftw/pull/169#discussion_r3118050029,169,go/internal/api/api.go,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/169#discussion_r3118050078,169,web/next-app.js,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/169#discussion_r3118050096,169,web/next-app.js,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/169#discussion_r3118050111,169,web/next-app.js,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/169#discussion_r3118050134,169,web/index.html,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/169#discussion_r3118050166,169,web/components/ftw-energy-flow.js,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/169#discussion_r3118050203,169,go/internal/devtools/backfill.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/169#discussion_r3118050239,169,go/internal/state/store.go,Copilot,none,power-units-sign,duplicated-truth, +https://github.com/srcfl/ftw/pull/171#discussion_r3122315107,171,drivers/pixii_pv.lua,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/171#discussion_r3122315148,171,drivers/pixii_pv.lua,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/171#discussion_r3122315170,171,drivers/pixii_pv.lua,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/171#discussion_r3122315197,171,docker-compose.yml,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/179#discussion_r3127246203,179,go/internal/api/api_sysinfo.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/179#discussion_r3127246218,179,web/settings/tabs/system.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/179#discussion_r3127246224,179,go/internal/api/api_sysinfo.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/179#discussion_r3127246234,179,go/internal/api/api_sysinfo.go,Copilot,none,incomplete-wiring,silent-failure, +https://github.com/srcfl/ftw/pull/179#discussion_r3127246241,179,go/internal/api/api_sysinfo.go,Copilot,none,ui-contract,other, +https://github.com/srcfl/ftw/pull/180#discussion_r3127248501,180,web/index.html,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/181#discussion_r3129054294,181,docs/self-update.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/181#discussion_r3129054330,181,go/internal/selfupdate/selfupdate_test.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/181#discussion_r3129054349,181,go/internal/selfupdate/registry.go,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/181#discussion_r3129054367,181,go/internal/selfupdate/registry.go,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/181#discussion_r3129054385,181,go/internal/selfupdate/registry.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/181#discussion_r3129054405,181,docs/self-update.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/189#discussion_r3136372412,189,go/internal/mpc/baselines.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,power-units-sign, +https://github.com/srcfl/ftw/pull/189#discussion_r3136372418,189,go/internal/mpc/baselines.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,power-units-sign, +https://github.com/srcfl/ftw/pull/189#discussion_r3136372421,189,web/plan.js,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/190#discussion_r3136417474,190,web/next-app.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/191#discussion_r3136714901,191,web/plan.js,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/191#discussion_r3136714907,191,web/plan.js,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/192#discussion_r3141956714,192,web/setup.html,chatgpt-codex-connector[bot],P2,ui-contract,other, +https://github.com/srcfl/ftw/pull/194#discussion_r3142225480,194,.github/workflows/rpi-image-build.yml,chatgpt-codex-connector[bot],P2,release-ci,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/196#discussion_r3142248852,196,.github/workflows/rpi-image-build.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/197#discussion_r3142256983,197,deploy/pi-gen/stage-42w/00-install-packages/00-packages,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/198#discussion_r3143475677,198,go/internal/savings/decompose.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign,S6 +https://github.com/srcfl/ftw/pull/200#discussion_r3143477605,200,deploy/pi-gen/stage-42w/03-port-redirect/files/42w-port-redirect.nft,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/201#discussion_r3143484983,201,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/201#discussion_r3143484984,201,go/internal/api/api_savings.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S5 +https://github.com/srcfl/ftw/pull/202#discussion_r3143516429,202,web/savings.js,chatgpt-codex-connector[bot],P1,ui-contract,power-units-sign, +https://github.com/srcfl/ftw/pull/202#discussion_r3143516432,202,web/savings.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/207#discussion_r3145156103,207,drivers/easee_cloud.lua,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/207#discussion_r3145156129,207,drivers/easee_cloud.lua,Copilot,none,unknown-as-value,power-units-sign, +https://github.com/srcfl/ftw/pull/207#discussion_r3145156135,207,drivers/easee_cloud.lua,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/207#discussion_r3145156152,207,drivers/easee_cloud.lua,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/207#discussion_r3145156166,207,drivers/easee_cloud.lua,Copilot,none,incomplete-wiring,incomplete-wiring,S5 +https://github.com/srcfl/ftw/pull/207#discussion_r3145156181,207,drivers/easee_cloud.lua,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/206#discussion_r3145156442,206,go/internal/loadpoint/controller.go,Copilot,none,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/206#discussion_r3145156467,206,go/internal/api/api_loadpoint_manual.go,Copilot,none,incomplete-wiring,duplicated-truth,S1 +https://github.com/srcfl/ftw/pull/206#discussion_r3145156480,206,go/internal/api/api_loadpoint_manual.go,Copilot,none,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/206#discussion_r3145156501,206,go/internal/api/api_loadpoint_manual.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/206#discussion_r3145156509,206,go/internal/api/api_loadpoint_manual.go,Copilot,none,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/206#discussion_r3145156523,206,go/internal/api/api_loadpoint_manual.go,Copilot,none,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/206#discussion_r3145156539,206,go/internal/loadpoint/controller.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/208#discussion_r3145163016,208,go/internal/control/fuse_saver_test.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/208#discussion_r3145163047,208,go/internal/control/dispatch.go,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/208#discussion_r3145163059,208,go/internal/control/dispatch.go,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/208#discussion_r3145163077,208,go/internal/control/dispatch.go,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/208#discussion_r3145163096,208,go/internal/control/dispatch.go,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/208#discussion_r3145163109,208,go/internal/control/dispatch.go,Copilot,none,power-units-sign,power-units-sign,S6 +https://github.com/srcfl/ftw/pull/210#discussion_r3148416290,210,drivers/easee_cloud.lua,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/218#discussion_r3159870441,218,go/internal/api/api_tesla_verify.go,Copilot,none,other,unknown-as-value, +https://github.com/srcfl/ftw/pull/218#discussion_r3159870493,218,go/internal/drivers/lua.go,Copilot,none,other,security, +https://github.com/srcfl/ftw/pull/218#discussion_r3159870533,218,web/components/ftw-energy-flow.js,Copilot,none,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/219#discussion_r3164043820,219,go/cmd/forty-two-watts/main.go,Copilot,none,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/219#discussion_r3164043855,219,go/cmd/forty-two-watts/main.go,Copilot,none,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/219#discussion_r3164043892,219,go/internal/config/config.go,Copilot,none,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/219#discussion_r3164043919,219,go/internal/control/dispatch.go,Copilot,none,power-units-sign,power-units-sign,S6 +https://github.com/srcfl/ftw/pull/219#discussion_r3164043946,219,go/internal/control/dispatch.go,Copilot,none,power-units-sign,power-units-sign,S6 +https://github.com/srcfl/ftw/pull/223#discussion_r3165902735,223,web/components/ftw-energy-flow.js,Copilot,none,duplicated-truth,power-units-sign,S5 +https://github.com/srcfl/ftw/pull/223#discussion_r3165902753,223,web/components/ftw-energy-flow.js,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/223#discussion_r3165902761,223,web/components/ftw-energy-flow.js,Copilot,none,ui-contract,power-units-sign, +https://github.com/srcfl/ftw/pull/223#discussion_r3165902771,223,web/components/ftw-energy-flow.js,Copilot,none,incomplete-wiring,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/232#discussion_r3173277850,232,go/internal/ha/bridge.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/236#discussion_r3176580329,236,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/237#discussion_r3176586193,237,go/internal/notifications/service.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/238#discussion_r3178227599,238,go/internal/loadpoint/controller.go,Copilot,none,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/238#discussion_r3178227617,238,go/internal/loadpoint/controller.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/238#discussion_r3178227631,238,go/cmd/forty-two-watts/main.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/238#discussion_r3178227636,238,go/internal/mpc/loadpoint_spec.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/238#discussion_r3178227641,238,web/next-app.js,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/238#discussion_r3178227645,238,go/internal/loadpoint/controller.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/238#discussion_r3178227648,238,web/next-app.js,Copilot,none,unknown-as-value,unknown-as-value,S1 +https://github.com/srcfl/ftw/pull/238#discussion_r3178227656,238,web/app.js,Copilot,none,unknown-as-value,unknown-as-value,S1 +https://github.com/srcfl/ftw/pull/238#discussion_r3178227661,238,go/internal/loadpoint/controller.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/238#discussion_r3178227667,238,go/internal/loadpoint/controller.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/243#discussion_r3178666546,243,docs/driver-catalog.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/243#discussion_r3178666556,243,drivers/ctek.lua,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/243#discussion_r3178666561,243,drivers/ctek_v2.lua,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/243#discussion_r3178666566,243,docs/driver-catalog.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/242#discussion_r3178666658,242,web/settings/tabs/devices.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/242#discussion_r3178666666,242,web/settings/tabs/devices.js,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/242#discussion_r3178666669,242,go/internal/drivers/catalog.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/242#discussion_r3178666672,242,web/setup.js,Copilot,none,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/244#discussion_r3179943807,244,drivers/solaredge_legacy.lua,Copilot,none,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/247#discussion_r3184098505,247,go/internal/mqtt/client.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/247#discussion_r3184098551,247,go/internal/mqtt/client.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/247#discussion_r3184098574,247,go/internal/mqtt/client.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/247#discussion_r3184098607,247,go/internal/mqtt/client_test.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/247#discussion_r3184098625,247,go/internal/mqtt/CLAUDE.md,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/247#discussion_r3184098637,247,go/internal/mqtt/client.go,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/254#discussion_r3188099903,254,go/cmd/forty-two-watts/control_state.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/263#discussion_r3202086762,263,go/cmd/ftw-updater/main.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/264#discussion_r3211133861,264,go/internal/telemetry/store.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/264#discussion_r3211133904,264,go/internal/api/api_drivers_debug.go,Copilot,none,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/264#discussion_r3211133928,264,go/internal/api/api_drivers_debug.go,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/264#discussion_r3211133945,264,go/internal/api/api_drivers_debug.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/264#discussion_r3211133961,264,go/internal/api/api_drivers_debug.go,Copilot,none,security,security, +https://github.com/srcfl/ftw/pull/264#discussion_r3211133980,264,web/diagnostics-modal.js,Copilot,none,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/264#discussion_r3211133994,264,web/diagnostics-modal.js,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/268#discussion_r3212854759,268,web/settings/tabs/devices.js,Copilot,none,silent-failure,incomplete-wiring, +https://github.com/srcfl/ftw/pull/268#discussion_r3212854782,268,go/internal/api/api_drivers_debug.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/269#discussion_r3226014322,269,web/next-app.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/270#discussion_r3226021485,270,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/273#discussion_r3227449186,273,scripts/release-codename.cjs,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/274#discussion_r3254389073,274,go/internal/loadpoint/controller.go,Copilot,none,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/274#discussion_r3254389090,274,web/next-app.js,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/276#discussion_r3255426647,276,go/internal/control/dispatch.go,Copilot,none,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/276#discussion_r3255426662,276,go/internal/control/control_test.go,Copilot,none,other,duplicated-truth, +https://github.com/srcfl/ftw/pull/276#discussion_r3255426681,276,go/internal/control/control_test.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/277#discussion_r3255485944,277,go/internal/control/dispatch.go,Copilot,none,concurrency-lifecycle,power-units-sign, +https://github.com/srcfl/ftw/pull/279#discussion_r3259249859,279,go/internal/state/cost.go,chatgpt-codex-connector[bot],P1,other,power-units-sign, +https://github.com/srcfl/ftw/pull/285#discussion_r3276814693,285,go/internal/control/dispatch.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/285#discussion_r3276814751,285,go/internal/mpc/service.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/285#discussion_r3276814776,285,go/internal/mpc/service.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/285#discussion_r3276814806,285,go/cmd/forty-two-watts/main.go,Copilot,none,other,other,S6 +https://github.com/srcfl/ftw/pull/285#discussion_r3276814834,285,go/internal/control/control_test.go,Copilot,none,duplicated-truth,other, +https://github.com/srcfl/ftw/pull/287#discussion_r3293063011,287,go/internal/loadpoint/controller.go,Copilot,none,incomplete-wiring,legacy-state, +https://github.com/srcfl/ftw/pull/287#discussion_r3293063016,287,go/internal/api/api_loadpoint_vehicle.go,Copilot,none,other,other,S1 +https://github.com/srcfl/ftw/pull/287#discussion_r3293063020,287,go/internal/api/api_loadpoint_vehicle.go,Copilot,none,other,other,S1 +https://github.com/srcfl/ftw/pull/287#discussion_r3293063022,287,go/internal/mpc/self_consumption_horizon_test.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/287#discussion_r3293063028,287,go/internal/control/dispatch.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/288#discussion_r3293309019,288,go/internal/loadmodel/service.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,silent-failure, +https://github.com/srcfl/ftw/pull/292#discussion_r3295070827,292,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/294#discussion_r3295126505,294,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/298#discussion_r3296239593,298,go/internal/configreload/watcher.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/301#discussion_r3296700773,301,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/301#discussion_r3296700776,301,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/300#discussion_r3296852759,300,go/internal/loadpoint/controller.go,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/300#discussion_r3296852793,300,go/internal/loadpoint/controller_phase_handoff_test.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/300#discussion_r3296852821,300,go/internal/loadpoint/controller.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/303#discussion_r3296995977,303,go/internal/mpc/diagnose.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/305#discussion_r3297295593,305,web/plan.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/306#discussion_r3297780426,306,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/306#discussion_r3297780432,306,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/307#discussion_r3298002568,307,web/index.html,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/307#discussion_r3298002573,307,web/next-app.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/309#discussion_r3298399311,309,go/internal/state/store.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/310#discussion_r3298523407,310,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/310#discussion_r3298523413,310,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/311#discussion_r3299262818,311,go/cmd/ftw-pair/scope.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,security,S1 +https://github.com/srcfl/ftw/pull/311#discussion_r3299262822,311,go/cmd/ftw-pair/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/311#discussion_r3299262824,311,go/cmd/ftw-pair/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/312#discussion_r3299453724,312,go/internal/api/api_pair.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/312#discussion_r3299453729,312,web/components/ftw-pair-card.js,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/313#discussion_r3299510317,313,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/316#discussion_r3301197152,316,go/internal/control/forecast_scenarios_test.go,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/316#discussion_r3301197158,316,go/internal/control/forecast_scenarios_test.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/317#discussion_r3301218984,317,Makefile,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/318#discussion_r3301266642,318,web/components/ftw-pair-launcher.js,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/320#discussion_r3301592578,320,scripts/install-ftw-connect.sh,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/321#discussion_r3301857338,321,go/internal/api/api_pair.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/324#discussion_r3302250334,324,go/internal/wormhole/relay_client.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/324#discussion_r3302250342,324,go/internal/wormhole/relay_client.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/324#discussion_r3302250351,324,go/internal/wormhole/relay_client.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/323#discussion_r3302548367,323,drivers/ferroamp.lua,Copilot,none,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/323#discussion_r3302548414,323,drivers/ferroamp.lua,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/327#discussion_r3303040691,327,go/internal/wormhole/relay_client.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/330#discussion_r3304107643,330,go/cmd/ftw-pair/main.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/336#discussion_r3305499110,336,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,legacy-state,silent-failure,S1 +https://github.com/srcfl/ftw/pull/339#discussion_r3305784164,339,go/test/e2e/pair_test.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/340#discussion_r3305822471,340,go/internal/api/api_pair.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/341#discussion_r3305936745,341,docs/subetha-deploy.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/349#discussion_r3308397890,349,go/internal/battery/model.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/346#discussion_r3308401656,346,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/348#discussion_r3308402010,348,go/internal/drivers/lua.go,chatgpt-codex-connector[bot],P2,silent-failure,other, +https://github.com/srcfl/ftw/pull/342#discussion_r3308406706,342,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/355#discussion_r3308552445,355,.github/workflows/release.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/353#discussion_r3308574706,353,go/internal/telemetry/store.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/358#discussion_r3309595390,358,docs/relay-deploy.md,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/360#discussion_r3309853576,360,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/360#discussion_r3309853584,360,go/internal/tunnel/queue.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/360#discussion_r3309853594,360,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/363#discussion_r3310704225,363,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/363#discussion_r3310704229,363,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/363#discussion_r3310704235,363,go/cmd/forty-two-watts/owner_relay_register.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/365#discussion_r3310855348,365,web/components/ftw-pair-card.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/367#discussion_r3311631069,367,drivers/ferroamp.lua,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,incomplete-wiring,S2 +https://github.com/srcfl/ftw/pull/368#discussion_r3311747464,368,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/372#discussion_r3312441927,372,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,power-units-sign, +https://github.com/srcfl/ftw/pull/373#discussion_r3312485424,373,drivers/ferroamp.lua,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/375#discussion_r3315520519,375,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/377#discussion_r3315681615,377,go/internal/loadmodel/model.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/378#discussion_r3315709811,378,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/379#discussion_r3315900853,379,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/381#discussion_r3315934954,381,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/384#discussion_r3316087609,384,go/cmd/forty-two-watts/main.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/386#discussion_r3316127799,386,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,power-units-sign, +https://github.com/srcfl/ftw/pull/388#discussion_r3317361675,388,go/internal/state/cost.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/389#discussion_r3317814449,389,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/390#discussion_r3319682069,390,docs/goals/relay-subdomain-sessions.md,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/391#discussion_r3319803039,391,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/392#discussion_r3322254526,392,go/cmd/ftw-relay/tokens.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/395#discussion_r3323986322,395,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/396#discussion_r3324311513,396,go/internal/config/config.go,chatgpt-codex-connector[bot],P2,power-units-sign,silent-failure, +https://github.com/srcfl/ftw/pull/397#discussion_r3328610805,397,go/internal/control/dispatch.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/399#discussion_r3328628033,399,go/internal/loadpoint/controller.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/399#discussion_r3328628057,399,go/internal/loadpoint/controller.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/399#discussion_r3328628066,399,go/internal/loadpoint/controller.go,Copilot,none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/404#discussion_r3329131150,404,web/plan.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/405#discussion_r3329774592,405,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/407#discussion_r3340010009,407,go/internal/tunnel/queue_strand_test.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/412#discussion_r3343603216,412,go/internal/telemetry/store.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/397#discussion_r3343616185,397,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/370#discussion_r3343624253,370,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/370#discussion_r3343624255,370,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/413#discussion_r3346376613,413,web/loadpoints.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/414#discussion_r3349990683,414,go/internal/api/api_owner_access.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/414#discussion_r3349990692,414,go/internal/api/api_owner_access.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/415#discussion_r3350015427,415,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/417#discussion_r3350963432,417,go/internal/state/heal.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/417#discussion_r3350963436,417,go/internal/state/snapshot_state.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/421#discussion_r3354155718,421,go/internal/api/api_owner_access.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/422#discussion_r3354384376,422,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/422#discussion_r3354384379,422,drivers/ferroamp.lua,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/424#discussion_r3355282717,424,go/internal/api/api_owner_access.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,security, +https://github.com/srcfl/ftw/pull/426#discussion_r3355664961,426,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/427#discussion_r3356340647,427,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/427#discussion_r3356340661,427,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/429#discussion_r3356408669,429,go/cmd/ftw-relay/handlers.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/433#discussion_r3357283656,433,docker-compose.e2e.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/466#discussion_r3371121799,466,go/internal/ha/bridge.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/466#discussion_r3371121835,466,go/internal/control/dispatch.go,Copilot,none,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/466#discussion_r3371121852,466,go/internal/control/dispatch.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/467#discussion_r3372421567,467,go/internal/control/dispatch.go,Copilot,none,other,other, +https://github.com/srcfl/ftw/pull/471#discussion_r3375713229,471,go/internal/config/soc_bounds.go,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/471#discussion_r3375713300,471,go/internal/config/soc_bounds_test.go,Copilot,none,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/551#discussion_r3588233299,551,Dockerfile,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/644#discussion_r3636372337,644,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/646#discussion_r3638010348,646,go/cmd/ftw/nova_claim.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/647#discussion_r3643416224,647,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/652#discussion_r3644584714,652,web/diagnose.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/654#discussion_r3644927426,654,go/internal/state/energy_ledger.go,chatgpt-codex-connector[bot],P2,legacy-state,power-units-sign, +https://github.com/srcfl/ftw/pull/654#discussion_r3644927433,654,web/energy-history.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/654#discussion_r3644927438,654,web/diagnose.js,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/656#discussion_r3645788015,656,go/internal/homelink/webauthn.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/659#discussion_r3645920401,659,go/internal/homelinkrelay/server.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/661#discussion_r3645962264,661,go/internal/homelink/core_read.go,chatgpt-codex-connector[bot],P2,other,incomplete-wiring, +https://github.com/srcfl/ftw/pull/662#discussion_r3646598457,662,web/home-link-session.js,chatgpt-codex-connector[bot],P1,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/664#discussion_r3647099755,664,go/cmd/ftw/home_link.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/664#discussion_r3647099761,664,go/cmd/ftw/home_link.go,chatgpt-codex-connector[bot],P2,other,silent-failure, +https://github.com/srcfl/ftw/pull/665#discussion_r3649430461,665,web/home-link.html,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,silent-failure, +https://github.com/srcfl/ftw/pull/666#discussion_r3649761106,666,scripts/deploy-home-link-web.sh,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/666#discussion_r3649761116,666,scripts/deploy-home-link-web.sh,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/667#discussion_r3650458433,667,go/internal/drivers/host.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/667#discussion_r3650458435,667,go/internal/drivers/host.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,power-units-sign,S5 +https://github.com/srcfl/ftw/pull/668#discussion_r3650555872,668,go/internal/drivers/telemetry_keys.go,chatgpt-codex-connector[bot],P2,other,power-units-sign, +https://github.com/srcfl/ftw/pull/669#discussion_r3651766640,669,go/internal/drivers/host.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S5 +https://github.com/srcfl/ftw/pull/669#discussion_r3651766642,669,go/internal/drivers/host.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S5 +https://github.com/srcfl/ftw/pull/670#discussion_r3651772453,670,go/internal/drivers/telemetry_keys.go,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/671#discussion_r3652185036,671,web/setup.js,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/672#discussion_r3652241557,672,web/settings/tabs/devices.js,chatgpt-codex-connector[bot],P1,ui-contract,ui-contract,S5 +https://github.com/srcfl/ftw/pull/672#discussion_r3652241559,672,web/settings/tabs/devices.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,ui-contract,S1 S5 +https://github.com/srcfl/ftw/pull/673#discussion_r3652249121,673,drivers/sungrow.lua,chatgpt-codex-connector[bot],P1,incomplete-wiring,unknown-as-value, +https://github.com/srcfl/ftw/pull/675#discussion_r3652581996,675,go/internal/driverrepo/manager.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/675#discussion_r3652581999,675,web/settings/tabs/devices.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/676#discussion_r3652787182,676,web/update-badge.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/677#discussion_r3652807991,677,web/update-badge.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/677#discussion_r3652807995,677,web/update-badge.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/677#discussion_r3652807997,677,web/update-badge.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/679#discussion_r3653007805,679,go/internal/api/api.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/679#discussion_r3653007807,679,go/internal/api/api_driver_draft.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/679#discussion_r3653007808,679,go/internal/api/api_driver_draft.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/681#discussion_r3657207456,681,web/components/price-math.js,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/681#discussion_r3657207464,681,web/components/ftw-price-outlook.js,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/683#discussion_r3658983048,683,.github/check-no-planning-docs.sh,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/685#discussion_r3660017154,685,go/cmd/ftw-updater/self_replace.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/685#discussion_r3660017161,685,go/cmd/ftw-updater/self_replace.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/686#discussion_r3662752602,686,go/internal/mpc/optimizer_transport.go,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/689#discussion_r3663438522,689,go/internal/mpc/optimizer_transport.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/689#discussion_r3663438525,689,go/internal/mpc/optimizer_transport.go,chatgpt-codex-connector[bot],P2,unknown-as-value,duplicated-truth, +https://github.com/srcfl/ftw/pull/690#discussion_r3663484745,690,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/695#discussion_r3664459306,695,go/cmd/ftw-updater/env_pin.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/695#discussion_r3664459317,695,go/cmd/ftw-updater/self_replace.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/697#discussion_r3665997797,697,go/internal/homelinkuplink/service.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/704#discussion_r3667434173,704,drivers/pixii.lua,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/704#discussion_r3667434178,704,drivers/solaredge_legacy.lua,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/708#discussion_r3668084741,708,Makefile,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/708#discussion_r3668084748,708,Makefile,chatgpt-codex-connector[bot],P2,legacy-state,release-ci, +https://github.com/srcfl/ftw/pull/709#discussion_r3668215916,709,scripts/check-driver-versions.sh,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/709#discussion_r3668215922,709,scripts/check-driver-versions.sh,chatgpt-codex-connector[bot],P2,legacy-state,incomplete-wiring, +https://github.com/srcfl/ftw/pull/709#discussion_r3668215924,709,.github/workflows/test.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/711#discussion_r3671476766,711,go/internal/drivers/sungrow_driver_test.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,other, +https://github.com/srcfl/ftw/pull/711#discussion_r3671476779,711,.changeset/sungrow-zero-test-confirms-the-battery.md,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/712#discussion_r3671515526,712,README.md,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/712#discussion_r3671515533,712,scripts/sync-bundled-drivers.sh,chatgpt-codex-connector[bot],P2,legacy-state,release-ci, +https://github.com/srcfl/ftw/pull/721#discussion_r3681378270,721,.github/workflows/changeset-check.yml,chatgpt-codex-connector[bot],P1,release-ci,duplicated-truth, +https://github.com/srcfl/ftw/pull/722#discussion_r3681396693,722,drivers/BUNDLED_SOURCE.json,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/727#discussion_r3683410614,727,docs/writing-a-driver.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/727#discussion_r3683410617,727,docs/writing-a-driver.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/738#discussion_r3689761810,738,go/internal/drivers/catalog_controls.go,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/738#discussion_r3689761816,738,go/internal/drivers/catalog_controls.go,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/738#discussion_r3689761821,738,go/internal/drivers/catalog_controls.go,chatgpt-codex-connector[bot],P2,other,silent-failure, +https://github.com/srcfl/ftw/pull/740#discussion_r3690200669,740,go/internal/api/api_support_report.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/740#discussion_r3690200672,740,go/internal/api/api_support_report.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/742#discussion_r3690241302,742,go/internal/loadmodel/model.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/741#discussion_r3690242165,741,go/internal/api/api_driver_control.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/741#discussion_r3690242176,741,go/internal/api/api_driver_control.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/741#discussion_r3690242182,741,go/internal/api/api_driver_control.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/741#discussion_r3690242189,741,go/internal/api/api_drivers_debug.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/748#discussion_r3691113926,748,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/748#discussion_r3691113932,748,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/748#discussion_r3691113937,748,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign,S4 +https://github.com/srcfl/ftw/pull/748#discussion_r3691113941,748,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/749#discussion_r3692332647,749,web/heating.js,chatgpt-codex-connector[bot],P1,ui-contract,unknown-as-value,S1 +https://github.com/srcfl/ftw/pull/749#discussion_r3692332650,749,web/heating.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/749#discussion_r3692332654,749,go/driver-repository/cache/ftw-official-beta.json,chatgpt-codex-connector[bot],P2,other,release-ci, +https://github.com/srcfl/ftw/pull/751#discussion_r3702505944,751,go/internal/api/api_support_report.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/754#discussion_r3703159390,754,go/internal/drivers/catalog.go,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/755#discussion_r3703483036,755,go/internal/modbus/client.go,chatgpt-codex-connector[bot],P1,silent-failure,silent-failure,S3 +https://github.com/srcfl/ftw/pull/755#discussion_r3703483042,755,go/internal/drivers/host.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/771#discussion_r3710214170,771,.github/CODEOWNERS,chatgpt-codex-connector[bot],P1,release-ci,security, +https://github.com/srcfl/ftw/pull/786#discussion_r3710798298,786,go/internal/nova/publisher.go,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/731#discussion_r3711211542,731,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,silent-failure,incomplete-wiring, +https://github.com/srcfl/ftw/pull/731#discussion_r3711211551,731,Dockerfile,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/731#discussion_r3711211557,731,docs/operations.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/773#discussion_r3711286194,773,optimizer/ftw_optimizer/model.py,chatgpt-codex-connector[bot],P2,incomplete-wiring,power-units-sign, +https://github.com/srcfl/ftw/pull/773#discussion_r3711286201,773,optimizer/ftw_optimizer/multistage.py,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/718#discussion_r3712011250,718,go/internal/forecast/forecast.go,chatgpt-codex-connector[bot],P2,other,power-units-sign, +https://github.com/srcfl/ftw/pull/718#discussion_r3712011260,718,go/internal/sunpos/sunpos.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/790#discussion_r3712014051,790,go/internal/control/golden_dump_test.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/792#discussion_r3712164411,792,go/internal/config/config.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/791#discussion_r3712165049,791,go/cmd/ftw/driver_command_deadline.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/794#discussion_r3712256767,794,go/test/e2e/stack_test.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/728#discussion_r3712748868,728,go/internal/mdnsresolve/multicast.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/799#discussion_r3713146320,799,go/internal/control/golden_test.go,chatgpt-codex-connector[bot],P2,other,duplicated-truth, +https://github.com/srcfl/ftw/pull/799#discussion_r3713146324,799,go/internal/control/golden_test.go,chatgpt-codex-connector[bot],P2,other,duplicated-truth, +https://github.com/srcfl/ftw/pull/800#discussion_r3713176783,800,go/cmd/ftw/driver_failure_default.go,chatgpt-codex-connector[bot],P1,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/800#discussion_r3713176795,800,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/608#discussion_r3714138539,608,web/app.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/608#discussion_r3714138544,608,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,legacy-state,incomplete-wiring, +https://github.com/srcfl/ftw/pull/803#discussion_r3715134818,803,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/804#discussion_r3715138256,804,scripts/optimizer-venv.sh,chatgpt-codex-connector[bot],P2,legacy-state,incomplete-wiring, +https://github.com/srcfl/ftw/pull/804#discussion_r3715138259,804,scripts/optimizer-venv.sh,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/805#discussion_r3715184277,805,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/805#discussion_r3715184283,805,go/cmd/ftw/pv_curtail_dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/809#discussion_r3715382517,809,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/810#discussion_r3717917734,810,go/internal/appwire/frame.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/811#discussion_r3717920194,811,go/internal/appproto/handler.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/811#discussion_r3717920201,811,go/internal/appproto/handler.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,unknown-as-value, +https://github.com/srcfl/ftw/pull/811#discussion_r3717920204,811,go/internal/appproto/handler.go,chatgpt-codex-connector[bot],P2,ui-contract,silent-failure, +https://github.com/srcfl/ftw/pull/818#discussion_r3718604648,818,.github/workflows/brand-cleanup.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/821#discussion_r3719166823,821,go/internal/appenroll/enroll.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/821#discussion_r3719166827,821,go/internal/appproto/handler.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/821#discussion_r3719166831,821,go/cmd/ftw/app_link.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/827#discussion_r3720287736,827,web/settings/tabs/app.js,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/828#discussion_r3720352393,828,web/settings/tabs/app.js,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/829#discussion_r3720625521,829,go/internal/appproto/history.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/829#discussion_r3720625523,829,go/internal/appproto/history.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/831#discussion_r3721677746,831,go/internal/appenroll/enroll.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/832#discussion_r3722108534,832,go/cmd/ftw/app_link.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/837#discussion_r3725101887,837,go/cmd/ftw/fleet_ping.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/837#discussion_r3725101891,837,go/internal/fleetping/fleetping.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/837#discussion_r3725101894,837,go/internal/api/api_fleet_ping.go,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/836#discussion_r3725105930,836,web/components/ftw-price-chart.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/838#discussion_r3727642640,838,web/components/ftw-price-chart.js,chatgpt-codex-connector[bot],P2,ui-contract,other, +https://github.com/srcfl/ftw/pull/839#discussion_r3728820541,839,web/components/ftw-price-chart.js,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/839#discussion_r3728820553,839,web/components/ftw-price-chart.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/861#discussion_r3733855282,861,go/internal/gatewayidentity/binding_linux.go,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/865#discussion_r3734281550,865,.github/workflows/test.yml,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/865#discussion_r3734281557,865,go/internal/appproto/passthrough.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/865#discussion_r3734281560,865,go/internal/appenroll/enroll.go,chatgpt-codex-connector[bot],P2,silent-failure,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/865#discussion_r3734281567,865,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/869#discussion_r3744332671,869,go/internal/api/api.go,chatgpt-codex-connector[bot],P1,other,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/869#discussion_r3744332674,869,go/internal/loadpoint/schedule.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,legacy-state, +https://github.com/srcfl/ftw/pull/870#discussion_r3744369454,870,go/internal/gatewayidentity/stableid.go,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/871#discussion_r3747667558,871,go/internal/appproto/ev.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/871#discussion_r3747667565,871,go/internal/appproto/command.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/871#discussion_r3747667567,871,go/cmd/ftw/app_link.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/871#discussion_r3747667573,871,go/cmd/ftw/app_link.go,chatgpt-codex-connector[bot],P2,ui-contract,incomplete-wiring, +https://github.com/srcfl/ftw/pull/871#discussion_r3747667578,871,go/internal/appproto/ev.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/872#discussion_r3748116159,872,go/internal/appuplink/deadman.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/872#discussion_r3748116173,872,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/872#discussion_r3748116183,872,go/internal/appuplink/deadman.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,legacy-state, +https://github.com/srcfl/ftw/pull/872#discussion_r3748116197,872,go/internal/notifications/service.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/879#discussion_r3749281154,879,web/components/ftw-energy-flow.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/880#discussion_r3750254352,880,go/internal/appenroll/enroll.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/883#discussion_r3751307952,883,optimizer/ftw_optimizer/shared_highs.py,chatgpt-codex-connector[bot],P2,power-units-sign,duplicated-truth, +https://github.com/srcfl/ftw/pull/886#discussion_r3755372582,886,web/components/savings-periods.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/891#discussion_r3755871371,891,optimizer/ftw_optimizer/backtest.py,chatgpt-codex-connector[bot],P1,other,other, +https://github.com/srcfl/ftw/pull/892#discussion_r3755912221,892,go/internal/api/api_savings.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/898#discussion_r3757295456,898,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,other, +https://github.com/srcfl/ftw/pull/902#discussion_r3758589472,902,go/internal/mpc/params_validation.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/907#discussion_r3773256755,907,web/settings/tabs/fleet.js,chatgpt-codex-connector[bot],P2,duplicated-truth,ui-contract, +https://github.com/srcfl/ftw/pull/908#discussion_r3773356160,908,drivers/BUNDLED_SOURCE.json,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/912#discussion_r3781382042,912,go/internal/api/security.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/913#discussion_r3781512378,913,web/lan-auth.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/913#discussion_r3781512381,913,go/internal/api/security.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/914#discussion_r3791017874,914,go/internal/config/config.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/914#discussion_r3791017875,914,go/internal/api/security.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/914#discussion_r3791017877,914,go/internal/api/lan_auth.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,silent-failure, +https://github.com/srcfl/ftw/pull/915#discussion_r3791021029,915,web/settings/tabs/system.js,chatgpt-codex-connector[bot],P1,ui-contract,ui-contract,S1 +https://github.com/srcfl/ftw/pull/917#discussion_r3791512312,917,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/925#discussion_r3791843007,925,.github/workflows/beta.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/925#discussion_r3791843011,925,.github/workflows/release-assets.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/926#discussion_r3791886797,926,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/926#discussion_r3791903262,926,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/925#discussion_r3791916349,925,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/925#discussion_r3791916356,925,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/925#discussion_r3792377628,925,go/cmd/ftw-updater/main.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/921#discussion_r3792388165,921,go/internal/config/config.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/922#discussion_r3792505125,922,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/926#discussion_r3792536230,926,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/921#discussion_r3792539086,921,go/internal/config/config.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/926#discussion_r3792558986,926,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/929#discussion_r3792565142,929,go/cmd/ftw-updater/main.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/926#discussion_r3792597017,926,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/926#discussion_r3792633945,926,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/927#discussion_r3792722465,927,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,legacy-state,incomplete-wiring, +https://github.com/srcfl/ftw/pull/927#discussion_r3792725840,927,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/798#discussion_r3792726171,798,go/internal/drivers/lua.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/929#discussion_r3792732343,929,.github/workflows/beta.yml,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/927#discussion_r3792737722,927,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/927#discussion_r3792757878,927,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,legacy-state,power-units-sign, +https://github.com/srcfl/ftw/pull/798#discussion_r3792767732,798,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/927#discussion_r3792773176,927,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,unknown-as-value, +https://github.com/srcfl/ftw/pull/929#discussion_r3792788388,929,.github/workflows/release-assets.yml,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/929#discussion_r3792788392,929,go/cmd/ftw-updater/env_pin.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/931#discussion_r3792799519,931,.github/scripts/classify-test-changes.sh,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/887#discussion_r3792863666,887,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/921#discussion_r3792945106,921,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state,S1 +https://github.com/srcfl/ftw/pull/921#discussion_r3792960290,921,go/internal/config/config.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/934#discussion_r3793854371,934,web/settings/tabs/fleet.js,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/797#discussion_r3794379312,797,go/internal/config/config_file_windows.go,chatgpt-codex-connector[bot],P1,other,security, +https://github.com/srcfl/ftw/pull/935#discussion_r3795142979,935,scripts/promote-paired-latest.sh,chatgpt-codex-connector[bot],P1,release-ci,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/728#discussion_r3795249733,728,go/internal/mdnsresolve/multicast.go,chatgpt-codex-connector[bot],P1,other,other, +https://github.com/srcfl/ftw/pull/728#discussion_r3795249740,728,go/internal/scanner/scanner.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/728#discussion_r3795249750,728,go/internal/scanner/scanner.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,other, +https://github.com/srcfl/ftw/pull/728#discussion_r3795464072,728,go/internal/mdnsresolve/mdnsresolve.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/935#discussion_r3795972887,935,go/cmd/ftw-updater/env_pin.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,other, +https://github.com/srcfl/ftw/pull/938#discussion_r3796670238,938,.github/workflows/beta.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/939#discussion_r3796753574,939,.github/workflows/release-assets.yml,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/939#discussion_r3796753588,939,scripts/check-ghcr-write-access.sh,chatgpt-codex-connector[bot],P2,release-ci,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/943#discussion_r3797139613,943,.github/workflows/release-assets.yml,chatgpt-codex-connector[bot],P1,release-ci,incomplete-wiring, +https://github.com/srcfl/ftw/pull/943#discussion_r3797139614,943,.github/workflows/release-assets.yml,chatgpt-codex-connector[bot],P2,release-ci,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/943#discussion_r3797139615,943,scripts/github-release-by-id.sh,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/943#discussion_r3797139617,943,Makefile,chatgpt-codex-connector[bot],P2,release-ci,incomplete-wiring, +https://github.com/srcfl/ftw/pull/943#discussion_r3797155036,943,scripts/github-release-by-id.sh,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/945#discussion_r3797742013,945,AGENTS.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/944#discussion_r3797745506,944,go/internal/api/api_selfupdate.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/944#discussion_r3797745509,944,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/944#discussion_r3797745515,944,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/950#discussion_r3802266869,950,go/internal/api/lan_auth.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,security, +https://github.com/srcfl/ftw/pull/950#discussion_r3802266876,950,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S1 +https://github.com/srcfl/ftw/pull/951#discussion_r3802289914,951,go/internal/api/api_app_link.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/952#discussion_r3802304123,952,go/internal/api/api.go,chatgpt-codex-connector[bot],P1,security,silent-failure, +https://github.com/srcfl/ftw/pull/952#discussion_r3802304134,952,go/internal/api/api_drivers_debug.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/952#discussion_r3802304145,952,go/internal/api/api_drivers_debug.go,chatgpt-codex-connector[bot],P2,security,incomplete-wiring, +https://github.com/srcfl/ftw/pull/953#discussion_r3802473620,953,go/internal/loadmodel/model.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/955#discussion_r3803830919,955,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/954#discussion_r3803831884,954,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,silent-failure, +https://github.com/srcfl/ftw/pull/954#discussion_r3803831897,954,web/plan.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/958#discussion_r3806718290,958,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,legacy-state,unknown-as-value, +https://github.com/srcfl/ftw/pull/961#discussion_r3811201125,961,docs/roadmap.md,chatgpt-codex-connector[bot],P1,other,other, +https://github.com/srcfl/ftw/pull/962#discussion_r3812716812,962,web/heating.js,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign,S5 +https://github.com/srcfl/ftw/pull/962#discussion_r3812716815,962,web/heating.js,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/962#discussion_r3812716819,962,web/diagnose.js,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/965#discussion_r3820956455,965,go/internal/telemetry/store.go,chatgpt-codex-connector[bot],P1,unknown-as-value,power-units-sign, +https://github.com/srcfl/ftw/pull/968#discussion_r3830947358,968,go/internal/api/api_planner_prefs.go,cursor[bot],High,incomplete-wiring,other, +https://github.com/srcfl/ftw/pull/968#discussion_r3830947371,968,go/internal/config/planner_prefs.go,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle,S1 +https://github.com/srcfl/ftw/pull/968#discussion_r3830947479,968,go/internal/api/api_planner_prefs.go,chatgpt-codex-connector[bot],P1,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/968#discussion_r3830947491,968,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/968#discussion_r3831097235,968,web/app.js,cursor[bot],High,ui-contract,ui-contract,S1 +https://github.com/srcfl/ftw/pull/968#discussion_r3831097241,968,web/plan.js,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/970#discussion_r3836664420,970,go/internal/ha/bridge.go,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/970#discussion_r3836664424,970,go/internal/ha/bridge.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/971#discussion_r3836684241,971,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,power-units-sign, +https://github.com/srcfl/ftw/pull/971#discussion_r3836690873,971,go/internal/mpc/mpc.go,cursor[bot],High,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/973#discussion_r3838508309,973,web/leaflet-vendor.test.mjs,chatgpt-codex-connector[bot],P1,other,other, +https://github.com/srcfl/ftw/pull/974#discussion_r3839066818,974,web/settings/tabs/devices.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/974#discussion_r3841977664,974,drivers/BUNDLED_SOURCE.json,cursor[bot],High,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/977#discussion_r3844364617,977,web/setup.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/977#discussion_r3844364626,977,go/internal/drivers/testdata/zaptec_cloud.lua,chatgpt-codex-connector[bot],P1,silent-failure,unknown-as-value, +https://github.com/srcfl/ftw/pull/977#discussion_r3844380769,977,go/internal/drivers/testdata/zaptec_cloud.lua,cursor[bot],High,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/977#discussion_r3844380787,977,go/internal/drivers/testdata/zaptec_cloud.lua,cursor[bot],Medium,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/977#discussion_r3844380795,977,web/settings/tabs/ev.js,cursor[bot],Medium,incomplete-wiring,ui-contract,S5 +https://github.com/srcfl/ftw/pull/977#discussion_r3844380806,977,go/internal/drivers/testdata/zaptec_cloud.lua,cursor[bot],Low,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/978#discussion_r3853427388,978,go/internal/evcloud/tesla_wc.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/978#discussion_r3853427405,978,web/settings/tabs/ev.js,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S1 +https://github.com/srcfl/ftw/pull/978#discussion_r3853427417,978,go/internal/config/config.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/979#discussion_r3853429225,979,go/cmd/ftw/main.go,cursor[bot],High,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/979#discussion_r3853429242,979,go/internal/config/config.go,cursor[bot],High,incomplete-wiring,unknown-as-value, +https://github.com/srcfl/ftw/pull/979#discussion_r3853429255,979,go/cmd/ftw/main.go,cursor[bot],Medium,incomplete-wiring,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/979#discussion_r3853435245,979,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/979#discussion_r3853435261,979,go/internal/ocpp/handlers_v201.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/979#discussion_r3853435271,979,go/internal/ocpp/handlers.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,other, +https://github.com/srcfl/ftw/pull/979#discussion_r3853435282,979,go/internal/ocpp/handlers.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/979#discussion_r3853435289,979,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,incomplete-wiring, +https://github.com/srcfl/ftw/pull/979#discussion_r3853435300,979,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/978#discussion_r3853438727,978,go/internal/config/config.go,cursor[bot],High,legacy-state,legacy-state,S1 +https://github.com/srcfl/ftw/pull/978#discussion_r3853438743,978,go/internal/evcloud/tesla_wc.go,cursor[bot],Medium,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/979#discussion_r3853470407,979,go/internal/api/api.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/979#discussion_r3853470420,979,web/settings/tabs/loadpoints.js,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/978#discussion_r3855397309,978,go/internal/evcloud/tesla_wc.go,cursor[bot],Low,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/980#discussion_r3862867977,980,web/app.js,cursor[bot],Medium,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/980#discussion_r3862867994,980,web/components/energy-flow-readings.js,cursor[bot],Medium,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/980#discussion_r3862877466,980,web/components/energy-flow-readings.js,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign,S6 +https://github.com/srcfl/ftw/pull/980#discussion_r3862877471,980,web/components/energy-flow-readings.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/980#discussion_r3862877476,980,web/app.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/983#discussion_r3865689417,983,go/internal/notifications/service.go,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/983#discussion_r3865689425,983,go/internal/notifications/service.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/982#discussion_r3865697393,982,go/internal/drivers/lua.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/982#discussion_r3865697401,982,go/internal/drivers/lua.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/982#discussion_r3865716845,982,go/internal/drivers/lua.go,cursor[bot],High,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/982#discussion_r3865716859,982,go/internal/drivers/lua.go,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/982#discussion_r3865716861,982,go/internal/drivers/lua.go,cursor[bot],Medium,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/985#discussion_r3878626558,985,web/plan-soc.js,chatgpt-codex-connector[bot],P2,unknown-as-value,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/985#discussion_r3878642538,985,web/plan-soc.js,cursor[bot],Low,unknown-as-value,duplicated-truth,S5 +https://github.com/srcfl/ftw/pull/987#discussion_r3885808208,987,go/internal/modbus/client.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/987#discussion_r3885808214,987,go/internal/modbus/client.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,other, +https://github.com/srcfl/ftw/pull/991#discussion_r3886340484,991,go/internal/config/config.go,chatgpt-codex-connector[bot],P2,silent-failure,incomplete-wiring, +https://github.com/srcfl/ftw/pull/991#discussion_r3886350368,991,go/cmd/ftw/main.go,cursor[bot],Medium,silent-failure,incomplete-wiring, +https://github.com/srcfl/ftw/pull/968#discussion_r3886686692,968,go/internal/api/api_planner_prefs.go,cursor[bot],High,other,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/978#discussion_r3886687968,978,web/settings/tabs/ev.js,cursor[bot],Medium,legacy-state,unknown-as-value, +https://github.com/srcfl/ftw/pull/978#discussion_r3886689148,978,go/internal/evcloud/tesla_wc.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/979#discussion_r3886693987,979,go/internal/ocpp/server.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/979#discussion_r3886716492,979,go/internal/ocpp/handlers.go,cursor[bot],High,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/979#discussion_r3886716493,979,go/internal/ocpp/handlers.go,cursor[bot],High,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/979#discussion_r3886716496,979,go/internal/ocpp/handlers_v201.go,cursor[bot],High,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/979#discussion_r3886716504,979,go/internal/ocpp/handlers_v201.go,cursor[bot],Medium,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/979#discussion_r3886729168,979,go/cmd/ftw/main.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/979#discussion_r3886729174,979,go/cmd/ftw/main.go,cursor[bot],none,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1004#discussion_r3888792796,1004,go/internal/api/api_loadpoint_plan.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,unknown-as-value, +https://github.com/srcfl/ftw/pull/1004#discussion_r3888792797,1004,web/app.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1004#discussion_r3888792798,1004,web/app.js,chatgpt-codex-connector[bot],P2,silent-failure,unknown-as-value, +https://github.com/srcfl/ftw/pull/1004#discussion_r3888794828,1004,web/app.js,cursor[bot],Low,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1003#discussion_r3888795786,1003,go/internal/modbus/proxy.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1003#discussion_r3888795787,1003,web/settings/tabs/ha.js,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1003#discussion_r3888801899,1003,go/internal/modbus/proxy.go,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1003#discussion_r3888801905,1003,web/settings/tabs/ha.js,cursor[bot],Medium,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1005#discussion_r3888808840,1005,go/internal/loadpoint/controller.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1005#discussion_r3888815567,1005,go/internal/loadpoint/controller.go,cursor[bot],Medium,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1010#discussion_r3888860024,1010,web/app.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1010#discussion_r3888860031,1010,go/internal/loadpoint/controller.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1010#discussion_r3888864299,1010,web/app.js,cursor[bot],Medium,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1012#discussion_r3888893051,1012,AGENTS.md,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1012#discussion_r3888893053,1012,AGENTS.md,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1015#discussion_r3889003593,1015,go/internal/config/restart_required.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1019#discussion_r3889087655,1019,package.json,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1018#discussion_r3889088793,1018,go/internal/config/planner_prefs.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/1018#discussion_r3889088798,1018,go/internal/config/planner_prefs.go,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1021#discussion_r3889126389,1021,go/internal/mpc/replay_bench_test.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S5 +https://github.com/srcfl/ftw/pull/1021#discussion_r3889126390,1021,go/internal/mpc/replay_bench_test.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/1022#discussion_r3889314919,1022,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P1,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/1022#discussion_r3889314921,1022,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/1022#discussion_r3889314922,1022,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/1022#discussion_r3889314924,1022,go/internal/mpc/diagnose.go,chatgpt-codex-connector[bot],P2,legacy-state,unknown-as-value,S4 +https://github.com/srcfl/ftw/pull/1022#discussion_r3889318103,1022,go/internal/mpc/diagnose.go,cursor[bot],Medium,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/1022#discussion_r3889318108,1022,go/internal/mpc/replay_bench_test.go,cursor[bot],Low,legacy-state,unknown-as-value,S4 +https://github.com/srcfl/ftw/pull/1023#discussion_r3889329404,1023,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/1026#discussion_r3889527117,1026,go/internal/pvmodel/model.go,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/1028#discussion_r3889573942,1028,go/internal/api/api_planner_prefs.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1028#discussion_r3889573944,1028,web/plan-prefs.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1028#discussion_r3889581617,1028,web/plan.js,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1030#discussion_r3889693085,1030,go/internal/config/config.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1030#discussion_r3889693088,1030,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1030#discussion_r3889693090,1030,go/internal/mpc/params_validation.go,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/1032#discussion_r3891837995,1032,web/index.html,chatgpt-codex-connector[bot],P1,release-ci,other, +https://github.com/srcfl/ftw/pull/1032#discussion_r3891838005,1032,web/app.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1032#discussion_r3891846941,1032,web/app.js,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1032#discussion_r3891846950,1032,web/app.js,cursor[bot],Low,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1032#discussion_r3891978390,1032,web/app.js,cursor[bot],Low,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1032#discussion_r3892222392,1032,web/plan-brief.js,cursor[bot],Medium,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1032#discussion_r3892222396,1032,web/app.js,cursor[bot],Medium,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1032#discussion_r3892816377,1032,web/app.css,cursor[bot],Low,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1036#discussion_r3894157934,1036,go/internal/mpc/replay_bench_test.go,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/1036#discussion_r3894180698,1036,go/internal/mpc/plan_evaluation.go,cursor[bot],Medium,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/1036#discussion_r3894180704,1036,go/internal/mpc/plan_evaluation_test.go,cursor[bot],Low,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/1037#discussion_r3895457883,1037,go/internal/assistant/assistant.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/1037#discussion_r3895457894,1037,go/internal/api/api_assistant_tools.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1037#discussion_r3895480666,1037,web/assistant.js,cursor[bot],Medium,security,security, +https://github.com/srcfl/ftw/pull/1037#discussion_r3895480679,1037,go/internal/assistant/assistant.go,cursor[bot],Medium,security,security, +https://github.com/srcfl/ftw/pull/1039#discussion_r3895977107,1039,web/assistant.js,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1039#discussion_r3895977118,1039,web/assistant.js,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/1039#discussion_r3895977128,1039,web/assistant.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1039#discussion_r3895985037,1039,go/internal/api/api.go,cursor[bot],Medium,ui-contract,ui-contract,S1 +https://github.com/srcfl/ftw/pull/1039#discussion_r3895985041,1039,web/assistant.js,cursor[bot],Low,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1036#discussion_r3896006424,1036,go/internal/mpc/forecast_value_bench_test.go,cursor[bot],Medium,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1036#discussion_r3896006440,1036,go/internal/mpc/forecast_value_bench_test.go,cursor[bot],Low,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1041#discussion_r3896346070,1041,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/1042#discussion_r3896606631,1042,web/assistant.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/1042#discussion_r3896606648,1042,web/assistant.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/1042#discussion_r3896626546,1042,web/assistant.js,cursor[bot],Medium,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/1042#discussion_r3896626559,1042,web/assistant.js,cursor[bot],Medium,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/1042#discussion_r3896626563,1042,go/internal/api/api_assistant.go,cursor[bot],Low,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/1044#discussion_r3896981154,1044,go/internal/prices/nordpool.go,cursor[bot],Medium,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/1044#discussion_r3896981487,1044,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1044#discussion_r3896981496,1044,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1042#discussion_r3906454929,1042,web/assistant.js,cursor[bot],Medium,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1042#discussion_r3906454955,1042,web/assistant.js,cursor[bot],Medium,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1046#discussion_r3906555512,1046,go/internal/api/api_assistant_threads.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1046#discussion_r3906555518,1046,web/assistant.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1046#discussion_r3906587586,1046,web/assistant.js,cursor[bot],Medium,ui-contract,other, +https://github.com/srcfl/ftw/pull/1046#discussion_r3906587595,1046,web/assistant.js,cursor[bot],Medium,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1046#discussion_r3906587601,1046,web/assistant.js,cursor[bot],Medium,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1046#discussion_r3906815685,1046,go/internal/api/api.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/1051#discussion_r3914971877,1051,go/internal/api/api.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/1051#discussion_r3914972918,1051,go/internal/api/api.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/1051#discussion_r3914972928,1051,go/internal/coverage/coverage.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1051#discussion_r3914972938,1051,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,silent-failure,unknown-as-value, +https://github.com/srcfl/ftw/pull/1051#discussion_r3914973606,1051,web/settings/tabs/weather.js,cursor[bot],Medium,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1051#discussion_r3921387312,1051,go/internal/prices/prices.go,cursor[bot],High,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1051#discussion_r3921387321,1051,go/internal/prices/static.go,cursor[bot],Medium,other,other, +https://github.com/srcfl/ftw/pull/1051#discussion_r3921387324,1051,web/setup.js,cursor[bot],Medium,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/1056#discussion_r3930984867,1056,web/app.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/1058#discussion_r3931021002,1058,go/internal/api/api.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/1061#discussion_r3931195819,1061,go/internal/loadpoint/controller.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1062#discussion_r3931196153,1062,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1062#discussion_r3931196163,1062,web/app.js,chatgpt-codex-connector[bot],P2,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/1062#discussion_r3931204067,1062,go/internal/loadpoint/loadpoint.go,cursor[bot],High,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1062#discussion_r3931204079,1062,web/app.js,cursor[bot],Medium,power-units-sign,power-units-sign, +https://github.com/srcfl/ftw/pull/1062#discussion_r3931204087,1062,web/app.js,cursor[bot],Medium,concurrency-lifecycle,ui-contract, +https://github.com/srcfl/ftw/pull/1062#discussion_r3931204091,1062,web/app.js,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1061#discussion_r3931208329,1061,go/internal/loadpoint/controller.go,cursor[bot],High,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1068#discussion_r3931386676,1068,web/app.js,cursor[bot],Medium,silent-failure,silent-failure,S1 +https://github.com/srcfl/ftw/pull/1068#discussion_r3931386889,1068,web/app.js,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1068#discussion_r3931386896,1068,web/app.js,chatgpt-codex-connector[bot],P2,silent-failure,silent-failure,S1 +https://github.com/srcfl/ftw/pull/1067#discussion_r3931387885,1067,web/app.js,cursor[bot],Medium,ui-contract,other, +https://github.com/srcfl/ftw/pull/1069#discussion_r3931411994,1069,go/internal/appproto/ev.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1069#discussion_r3931412002,1069,go/cmd/ftw/app_link.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1069#discussion_r3931412006,1069,go/cmd/ftw/app_link.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S1 +https://github.com/srcfl/ftw/pull/1067#discussion_r3931412882,1067,web/app.js,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1070#discussion_r3931416731,1070,web/loadpoints.js,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S3 +https://github.com/srcfl/ftw/pull/1069#discussion_r3931463408,1069,go/internal/appproto/ev.go,cursor[bot],Medium,other,power-units-sign, +https://github.com/srcfl/ftw/pull/1073#discussion_r3943122862,1073,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1073#discussion_r3943129635,1073,go/internal/selfupdate/selfupdate.go,cursor[bot],Medium,duplicated-truth,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1074#discussion_r3944030658,1074,go/internal/api/loadpoint_vehicle.go,cursor[bot],Medium,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1074#discussion_r3944035379,1074,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/1074#discussion_r3944035380,1074,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1074#discussion_r3944081493,1074,go/internal/ocpp/handlers.go,cursor[bot],High,concurrency-lifecycle,unknown-as-value, +https://github.com/srcfl/ftw/pull/1074#discussion_r3944182432,1074,go/internal/ocpp/handlers.go,cursor[bot],High,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1077#discussion_r3947170401,1077,go/internal/mpc/core_dp_shadow.go,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1077#discussion_r3947174005,1077,go/internal/mpc/mpc.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,power-units-sign, +https://github.com/srcfl/ftw/pull/1077#discussion_r3947174014,1077,optimizer/ftw_optimizer/model.py,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/1077#discussion_r3947174021,1077,Makefile,chatgpt-codex-connector[bot],P2,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1083#discussion_r3947882411,1083,go/cmd/ftw-updater/retire_python.go,cursor[bot],High,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1083#discussion_r3947882423,1083,go/cmd/ftw-updater/retire_python.go,cursor[bot],Medium,legacy-state,silent-failure, +https://github.com/srcfl/ftw/pull/1083#discussion_r3947884353,1083,go/cmd/ftw-updater/retire_python.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1083#discussion_r3947987908,1083,go/cmd/ftw-updater/retire_python.go,cursor[bot],High,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/1083#discussion_r3947987933,1083,go/cmd/ftw-updater/retire_python.go,cursor[bot],Medium,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/1084#discussion_r3947988434,1084,package.json,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1086#discussion_r3948067572,1086,go/cmd/ftw-updater/retire_python.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1089#discussion_r3949425925,1089,go/cmd/ftw/forecast_tracking.go,cursor[bot],High,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1089#discussion_r3949425933,1089,go/cmd/ftw/forecast_tracking.go,cursor[bot],Medium,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1089#discussion_r3949426994,1089,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1091#discussion_r3949479868,1091,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1095#discussion_r3950023922,1095,go/cmd/ftw/forecast_learning.go,cursor[bot],Medium,concurrency-lifecycle,silent-failure, +https://github.com/srcfl/ftw/pull/1098#discussion_r3950734157,1098,CHANGELOG.md,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1096#discussion_r3950769432,1096,docker-compose.ftwdb-shadow.yml,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1094#discussion_r3950790948,1094,go/internal/api/api_selfupdate.go,chatgpt-codex-connector[bot],P2,unknown-as-value,unknown-as-value,S4 +https://github.com/srcfl/ftw/pull/1094#discussion_r3950790955,1094,go/internal/api/api_myuplink_oauth.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S1 +https://github.com/srcfl/ftw/pull/1094#discussion_r3950790964,1094,go/internal/config/storage.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1108#discussion_r3951830655,1108,go/cmd/ftw/driver_registry.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1108#discussion_r3951830661,1108,go/internal/driverrepo/sourceful.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1110#discussion_r3951925616,1110,go/internal/driverrepo/sourceful.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1112#discussion_r3951984327,1112,go/internal/driverrepo/sourceful.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1115#discussion_r3952172725,1115,go/internal/driverrepo/manager.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/1118#discussion_r3952641273,1118,go/internal/mpc/unavailable.go,chatgpt-codex-connector[bot],P2,duplicated-truth,unknown-as-value, +https://github.com/srcfl/ftw/pull/1118#discussion_r3952641278,1118,go/internal/mpc/energyplan.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1121#discussion_r3952784944,1121,go/internal/api/api_device_repository.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/1123#discussion_r3953607802,1123,optimizer/native/bundle/manifest.json,chatgpt-codex-connector[bot],P1,release-ci,other, +https://github.com/srcfl/ftw/pull/1125#discussion_r3953856421,1125,go/cmd/ftw/forecast_tracking.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1129#discussion_r3955930313,1129,go/internal/state/history_duckdb.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1166#discussion_r3956400638,1166,go/internal/priceforecast/forecast.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1167#discussion_r3956409792,1167,docs/ocpp.md,chatgpt-codex-connector[bot],P2,duplicated-truth,duplicated-truth, +https://github.com/srcfl/ftw/pull/1169#discussion_r3956409866,1169,go/internal/api/security.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/1168#discussion_r3956429148,1168,go/internal/api/api_support_dump_zip_test.go,chatgpt-codex-connector[bot],P1,security,security, +https://github.com/srcfl/ftw/pull/1168#discussion_r3956429156,1168,go/internal/api/api_support_report.go,chatgpt-codex-connector[bot],P2,security,security, +https://github.com/srcfl/ftw/pull/1171#discussion_r3956438319,1171,go/cmd/ftw-updater/main.go,chatgpt-codex-connector[bot],P1,silent-failure,silent-failure, +https://github.com/srcfl/ftw/pull/1172#discussion_r3956450469,1172,go/internal/mpc/execution_time.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1170#discussion_r3956452055,1170,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P1,unknown-as-value,unknown-as-value, +https://github.com/srcfl/ftw/pull/1169#discussion_r3956461895,1169,go/internal/api/security.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/1174#discussion_r3956469872,1174,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1175#discussion_r3956480330,1175,go/internal/config/storage.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/1175#discussion_r3956480340,1175,go/internal/config/storage.go,chatgpt-codex-connector[bot],P1,legacy-state,legacy-state,S4 +https://github.com/srcfl/ftw/pull/1173#discussion_r3956483431,1173,go/internal/ocpp/handlers.go,chatgpt-codex-connector[bot],P1,unknown-as-value,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1173#discussion_r3956483450,1173,go/internal/ocpp/handlers.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,unknown-as-value, +https://github.com/srcfl/ftw/pull/1176#discussion_r3956488102,1176,go/cmd/ftw/ev_send.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,incomplete-wiring,S1 +https://github.com/srcfl/ftw/pull/1176#discussion_r3956488138,1176,go/cmd/ftw/http_server.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1177#discussion_r3956529822,1177,web/settings/tabs/ev.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,ui-contract, +https://github.com/srcfl/ftw/pull/1177#discussion_r3956529829,1177,web/plan.js,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1181#discussion_r3957171965,1181,go/internal/state/history_writer.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1182#discussion_r3957551150,1182,web/history-migration.js,chatgpt-codex-connector[bot],P2,ui-contract,ui-contract, +https://github.com/srcfl/ftw/pull/1186#discussion_r3957937613,1186,go/cmd/ftw/energy_history.go,chatgpt-codex-connector[bot],P2,legacy-state,legacy-state, +https://github.com/srcfl/ftw/pull/1187#discussion_r3958258701,1187,go/internal/loadpoint/controller.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1187#discussion_r3958258709,1187,go/internal/loadpoint/controller.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1191#discussion_r3966664208,1191,go/internal/state/history_migration.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring,S4 +https://github.com/srcfl/ftw/pull/1199#discussion_r3976624969,1199,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,silent-failure, +https://github.com/srcfl/ftw/pull/1199#discussion_r3976624982,1199,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,duplicated-truth, +https://github.com/srcfl/ftw/pull/1200#discussion_r3979324292,1200,go/internal/state/history_series_hour.go,chatgpt-codex-connector[bot],P1,other,other, +https://github.com/srcfl/ftw/pull/1200#discussion_r3979324302,1200,go/internal/state/history_duckdb.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1200#discussion_r3979324306,1200,go/internal/state/store.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1200#discussion_r3979324311,1200,go/internal/state/history_writer.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1200#discussion_r3979324316,1200,go/internal/state/history_writer.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1201#discussion_r3981445858,1201,go/internal/state/store_ts.go,chatgpt-codex-connector[bot],P2,other,other, +https://github.com/srcfl/ftw/pull/1202#discussion_r3981966304,1202,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,unknown-as-value, +https://github.com/srcfl/ftw/pull/1202#discussion_r3981966313,1202,go/internal/config/restart_required.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1202#discussion_r3981966323,1202,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1202#discussion_r3981966333,1202,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle,S2 +https://github.com/srcfl/ftw/pull/1003#discussion_r3986084673,1003,go/internal/modbus/proxy.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/1003#discussion_r3986084687,1003,go/internal/modbus/client.go,cursor[bot],none,security,security, +https://github.com/srcfl/ftw/pull/1203#discussion_r3986203386,1203,go/test/e2e/ocpp_evify_test.go,chatgpt-codex-connector[bot],P1,release-ci,release-ci, +https://github.com/srcfl/ftw/pull/1203#discussion_r3986203391,1203,go/cmd/sim-ocpp/ocppcp/sim.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,concurrency-lifecycle, +https://github.com/srcfl/ftw/pull/1203#discussion_r3986203394,1203,go/cmd/sim-ocpp/ocppcp/sim.go,chatgpt-codex-connector[bot],P2,other,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1204#discussion_r3988739161,1204,go/cmd/ftw/forecast_tracking.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,incomplete-wiring, +https://github.com/srcfl/ftw/pull/1206#discussion_r3989213729,1206,go/internal/state/history_writer.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,,S2 +https://github.com/srcfl/ftw/pull/1208#discussion_r3990378712,1208,go/internal/state/history_hot.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1208#discussion_r3990378724,1208,go/internal/state/history_hot.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1208#discussion_r3990378732,1208,go/internal/state/history_hot.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1211#discussion_r3991954540,1211,go/internal/state/history_sealed.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1211#discussion_r3991954547,1211,go/internal/state/history_sealed.go,chatgpt-codex-connector[bot],P1,silent-failure,, +https://github.com/srcfl/ftw/pull/1211#discussion_r3991954553,1211,go/internal/state/store.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1211#discussion_r3991954561,1211,go/internal/state/history_sealed.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1211#discussion_r3991954565,1211,go/internal/state/energy_ledger.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1211#discussion_r3991954577,1211,go/internal/state/history_sealed.go,chatgpt-codex-connector[bot],P2,security,, +https://github.com/srcfl/ftw/pull/1213#discussion_r3995428704,1213,.github/CODEOWNERS,chatgpt-codex-connector[bot],P2,security,, +https://github.com/srcfl/ftw/pull/1217#discussion_r3996359719,1217,web/source.html,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1220#discussion_r3996399196,1220,web/source.html,chatgpt-codex-connector[bot],P2,duplicated-truth,, +https://github.com/srcfl/ftw/pull/1224#discussion_r3996915312,1224,scripts/upgrade-paired-release.sh,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1224#discussion_r3996915314,1224,scripts/upgrade-paired-release.sh,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1225#discussion_r3999081937,1225,go/internal/control/ev_plan_priority.go,chatgpt-codex-connector[bot],P1,power-units-sign,, +https://github.com/srcfl/ftw/pull/1225#discussion_r3999081943,1225,go/internal/modbus/proxy.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,,S2 +https://github.com/srcfl/ftw/pull/1225#discussion_r3999081945,1225,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,silent-failure,, +https://github.com/srcfl/ftw/pull/1240#discussion_r3999948606,1240,go/internal/loadpoint/controller_energy.go,chatgpt-codex-connector[bot],P1,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1240#discussion_r3999948610,1240,go/internal/mpc/service_ev_divergence.go,chatgpt-codex-connector[bot],P2,power-units-sign,, +https://github.com/srcfl/ftw/pull/1240#discussion_r3999948613,1240,go/internal/loadpoint/session_state.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1248#discussion_r4002107094,1248,go/internal/state/history_sqlite.go,chatgpt-codex-connector[bot],P1,silent-failure,, +https://github.com/srcfl/ftw/pull/1248#discussion_r4002107097,1248,go/internal/state/history_sqlite.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1258#discussion_r4003279600,1258,go/internal/state/history_convert.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1261#discussion_r4003763901,1261,go/internal/backup/archive.go,chatgpt-codex-connector[bot],P1,other,, +https://github.com/srcfl/ftw/pull/1261#discussion_r4003763913,1261,go/internal/backup/archive.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1264#discussion_r4003919404,1264,go/internal/state/history_series_hour.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1269#discussion_r4004815749,1269,go/internal/state/history_series_hour.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1271#discussion_r4007759584,1271,go/internal/state/archive_write.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1283#discussion_r4034318297,1283,go/cmd/ftw/forecast_observation_queue.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1283#discussion_r4034318309,1283,go/cmd/ftw/forecast_observation_queue.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1290#discussion_r4034831810,1290,go/internal/state/store_ts.go,chatgpt-codex-connector[bot],P1,ui-contract,,S5 +https://github.com/srcfl/ftw/pull/1290#discussion_r4034831819,1290,go/internal/state/store_ts.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1294#discussion_r4036644086,1294,go/internal/state/store.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1294#discussion_r4036644102,1294,go/internal/state/history_dashboard.go,chatgpt-codex-connector[bot],P2,other,, +https://github.com/srcfl/ftw/pull/1297#discussion_r4037513546,1297,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1297#discussion_r4037513557,1297,go/internal/loadpoint/vehicle_goal_state.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1300#discussion_r4037895342,1300,go/internal/loadpoint/session_state.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1304#discussion_r4040195015,1304,go/internal/api/snapshots.go,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1306#discussion_r4043678320,1306,state-schema.json,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1326#discussion_r4057248479,1326,go/internal/state/devices.go,chatgpt-codex-connector[bot],P1,security,, +https://github.com/srcfl/ftw/pull/1328#discussion_r4057263750,1328,go/internal/mpc/energyplan_test.go,chatgpt-codex-connector[bot],P1,other,, +https://github.com/srcfl/ftw/pull/1336#discussion_r4064530097,1336,.github/workflows/beta.yml,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1336#discussion_r4064530106,1336,Makefile,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1341#discussion_r4070120167,1341,go/internal/state/history_plain.go,chatgpt-codex-connector[bot],P1,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1341#discussion_r4070120177,1341,go/internal/state/history_plain.go,chatgpt-codex-connector[bot],P1,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1341#discussion_r4070120189,1341,go/internal/state/history_aggregate_read.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1341#discussion_r4070120201,1341,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1342#discussion_r4071087547,1342,go/internal/api/api_savings.go,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1342#discussion_r4071087555,1342,web/components/ftw-savings-card.js,chatgpt-codex-connector[bot],P1,ui-contract,, +https://github.com/srcfl/ftw/pull/1342#discussion_r4071087560,1342,go/internal/api/api_savings.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1342#discussion_r4071087566,1342,go/internal/api/api_savings.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1343#discussion_r4071881606,1343,go/internal/state/history_plain.go,chatgpt-codex-connector[bot],P1,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1344#discussion_r4073243098,1344,go/internal/loadpoint/session_state.go,chatgpt-codex-connector[bot],P2,unknown-as-value,,S3 +https://github.com/srcfl/ftw/pull/1346#discussion_r4079681161,1346,package.json,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1351#discussion_r4080632034,1351,.github/workflows/changeset-check.yml,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1351#discussion_r4080632039,1351,.github/scripts/check-changeset-bumps.py,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1350#discussion_r4080731031,1350,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1350#discussion_r4080731035,1350,package.json,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1353#discussion_r4080835065,1353,scripts/promote-paired-latest.sh,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1353#discussion_r4080835077,1353,scripts/check-legacy-release-line.sh,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1348#discussion_r4080952698,1348,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1355#discussion_r4081178643,1355,.github/workflows/native-release.yml,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1359#discussion_r4081533171,1359,scripts/install.sh,chatgpt-codex-connector[bot],P1,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1359#discussion_r4081533181,1359,scripts/install.sh,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1359#discussion_r4081533192,1359,scripts/install.sh,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1361#discussion_r4081723665,1361,docs/upgrade-paired-release.md,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1362#discussion_r4082601060,1362,scripts/ftwctl.py,chatgpt-codex-connector[bot],P1,security,, +https://github.com/srcfl/ftw/pull/1362#discussion_r4082601076,1362,scripts/ftwctl.py,chatgpt-codex-connector[bot],P2,other,, +https://github.com/srcfl/ftw/pull/1364#discussion_r4083913065,1364,CLAUDE.md,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1369#discussion_r4089973583,1369,go/internal/state/backup_state.go,chatgpt-codex-connector[bot],P1,security,, +https://github.com/srcfl/ftw/pull/1369#discussion_r4089973586,1369,go/internal/state/backup_state.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1369#discussion_r4089973592,1369,go/internal/state/backup_pace_test.go,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1370#discussion_r4090058654,1370,web/plan.js,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1370#discussion_r4090058661,1370,web/plan.js,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1370#discussion_r4090058665,1370,web/app.js,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1372#discussion_r4090162320,1372,go/cmd/ftwupdate/main.go,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1372#discussion_r4090162325,1372,web/update-badge.js,chatgpt-codex-connector[bot],P1,ui-contract,, +https://github.com/srcfl/ftw/pull/1372#discussion_r4090162329,1372,web/update-badge.js,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1372#discussion_r4090162333,1372,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1373#discussion_r4090486182,1373,docs/adr/0007-self-updating-binary.md,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1375#discussion_r4091064610,1375,go/internal/nativeupdate/space.go,chatgpt-codex-connector[bot],P2,other,, +https://github.com/srcfl/ftw/pull/1375#discussion_r4091064613,1375,go/internal/selfupdate/selfupdate.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1383#discussion_r4092495603,1383,.github/workflows/native-release.yml,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1382#discussion_r4092497946,1382,docs/native-beta.md,chatgpt-codex-connector[bot],P1,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1382#discussion_r4092497956,1382,docs/native-beta.md,chatgpt-codex-connector[bot],P1,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1382#discussion_r4092497973,1382,docs/native-beta.md,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1381#discussion_r4092500477,1381,go/internal/ftwcli/update.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,,S1 +https://github.com/srcfl/ftw/pull/1381#discussion_r4092500487,1381,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,,S2 +https://github.com/srcfl/ftw/pull/1385#discussion_r4092756307,1385,go/internal/ftwcli/cli.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1392#discussion_r4093517095,1392,deploy/docker/compose.yaml,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1393#discussion_r4093850631,1393,.github/workflows/release-assets.yml,chatgpt-codex-connector[bot],P2,legacy-state,, +https://github.com/srcfl/ftw/pull/1393#discussion_r4093850645,1393,docs/roadmap.md,chatgpt-codex-connector[bot],P2,duplicated-truth,, +https://github.com/srcfl/ftw/pull/1394#discussion_r4093909997,1394,package.json,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1396#discussion_r4094257670,1396,go/internal/config/storage.go,chatgpt-codex-connector[bot],P2,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1401#discussion_r4095694072,1401,.github/ISSUE_TEMPLATE/bug_report.yml,chatgpt-codex-connector[bot],P2,duplicated-truth,, +https://github.com/srcfl/ftw/pull/1402#discussion_r4096081670,1402,docs/native-beta.md,chatgpt-codex-connector[bot],P1,duplicated-truth,, +https://github.com/srcfl/ftw/pull/1408#discussion_r4096559443,1408,go/internal/backup/archive.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1410#discussion_r4096782941,1410,go/internal/mpc/optimizer_transport.go,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1411#discussion_r4097123980,1411,docs/native-beta.md,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1417#discussion_r4101142358,1417,go/internal/loadpoint/controller.go,chatgpt-codex-connector[bot],P1,unknown-as-value,,S3 +https://github.com/srcfl/ftw/pull/1419#discussion_r4101199398,1419,.changeset/bundle-easee-1-3-3.md,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1422#discussion_r4101513913,1422,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1422#discussion_r4101513919,1422,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,other,, +https://github.com/srcfl/ftw/pull/1422#discussion_r4101513921,1422,go/internal/driverrepo/manager.go,chatgpt-codex-connector[bot],P2,silent-failure,, +https://github.com/srcfl/ftw/pull/1422#discussion_r4101513925,1422,docs/device-repository.md,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1425#discussion_r4101617068,1425,go/internal/telemetry/store.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1426#discussion_r4101676876,1426,go/internal/driverrepo/manager.go,chatgpt-codex-connector[bot],P2,silent-failure,, +https://github.com/srcfl/ftw/pull/1427#discussion_r4101864986,1427,go/internal/driverrepo/manager.go,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1427#discussion_r4101864996,1427,web/settings/tabs/devices.js,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1428#discussion_r4102216406,1428,go/internal/api/api.go,chatgpt-codex-connector[bot],P2,other,, +https://github.com/srcfl/ftw/pull/1429#discussion_r4102259895,1429,AGENTS.md,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1432#discussion_r4102797417,1432,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1433#discussion_r4102877896,1433,go/internal/driverrepo/replaces.go,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1433#discussion_r4102877902,1433,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,silent-failure,, +https://github.com/srcfl/ftw/pull/1434#discussion_r4102960531,1434,go/internal/api/api_device_repository.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1434#discussion_r4102960540,1434,go/internal/api/api_device_repository.go,chatgpt-codex-connector[bot],P1,silent-failure,, +https://github.com/srcfl/ftw/pull/1440#discussion_r4104385559,1440,go/internal/ha/plan_payload.go,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1443#discussion_r4110524226,1443,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P2,other,, +https://github.com/srcfl/ftw/pull/1443#discussion_r4110524229,1443,go/internal/control/dispatch.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1445#discussion_r4110659814,1445,go/internal/control/selftune_dispatch.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1446#discussion_r4110663238,1446,go/internal/ha/bridge.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,,S2 +https://github.com/srcfl/ftw/pull/1447#discussion_r4110669984,1447,go/internal/backup/archive.go,chatgpt-codex-connector[bot],P1,silent-failure,, +https://github.com/srcfl/ftw/pull/1447#discussion_r4110669986,1447,go/internal/state/series_archive.go,chatgpt-codex-connector[bot],P2,silent-failure,, +https://github.com/srcfl/ftw/pull/1452#discussion_r4114351517,1452,go/internal/api/api_driver_control.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,,S1 +https://github.com/srcfl/ftw/pull/1455#discussion_r4114351920,1455,scripts/package-linux.py,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1453#discussion_r4114352144,1453,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,,S1 +https://github.com/srcfl/ftw/pull/1451#discussion_r4114352735,1451,go/internal/prices/prices.go,chatgpt-codex-connector[bot],P2,other,, +https://github.com/srcfl/ftw/pull/1458#discussion_r4115844157,1458,go/internal/drivers/registry.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1463#discussion_r4123917776,1463,web/settings/tabs/loadpoints.js,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1465#discussion_r4125419294,1465,docs/energyplan-contract.md,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1466#discussion_r4125447805,1466,docs/energyplan-contract.md,chatgpt-codex-connector[bot],P2,incomplete-wiring,,S5 +https://github.com/srcfl/ftw/pull/1473#discussion_r4130971697,1473,AGENTS.md,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1473#discussion_r4130971707,1473,docs/native-beta.md,chatgpt-codex-connector[bot],P2,duplicated-truth,, +https://github.com/srcfl/ftw/pull/1476#discussion_r4134731375,1476,docs/native-beta.md,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1477#discussion_r4134809405,1477,go/cmd/ftw/forecast_scoring.go,chatgpt-codex-connector[bot],P1,silent-failure,, +https://github.com/srcfl/ftw/pull/1480#discussion_r4153804812,1480,go/cmd/ftw/forecast_measurements.go,chatgpt-codex-connector[bot],P1,unknown-as-value,,S3 +https://github.com/srcfl/ftw/pull/1474#discussion_r4156662987,1474,go/internal/telemetry/command_evidence.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1474#discussion_r4156663007,1474,go/internal/telemetry/command_evidence.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1486#discussion_r4156894504,1486,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P2,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1486#discussion_r4156894520,1486,web/plan-prefs.js,chatgpt-codex-connector[bot],P2,ui-contract,,S5 +https://github.com/srcfl/ftw/pull/1494#discussion_r4158417351,1494,go/cmd/ftw/forecast_tracking.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1500#discussion_r4166190236,1500,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1506#discussion_r4171882433,1506,package.json,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1529#discussion_r4206376082,1529,go/internal/config/planner_engine.go,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1533#discussion_r4207342440,1533,go/internal/mpc/external_optimizer.go,chatgpt-codex-connector[bot],P2,power-units-sign,, +https://github.com/srcfl/ftw/pull/1536#discussion_r4214814814,1536,go/internal/control/fuse_phase.go,chatgpt-codex-connector[bot],P2,power-units-sign,,S6 +https://github.com/srcfl/ftw/pull/1536#discussion_r4214814826,1536,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,power-units-sign,, +https://github.com/srcfl/ftw/pull/1539#discussion_r4220388408,1539,go/cmd/ftw/control_state.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1542#discussion_r4236588051,1542,web/plan-brief.js,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1543#discussion_r4238391850,1543,go/internal/state/forecast_issues.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1550#discussion_r4240355526,1550,go/internal/telemetry/vehicle.go,chatgpt-codex-connector[bot],P2,unknown-as-value,,S3 +https://github.com/srcfl/ftw/pull/1550#discussion_r4240355528,1550,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P2,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1559#discussion_r4242910645,1559,go/internal/state/history_chart_recovery.go,chatgpt-codex-connector[bot],P1,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1563#discussion_r4243174951,1563,go/internal/config/backup_paths.go,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1563#discussion_r4243174953,1563,go/internal/backup/archive.go,chatgpt-codex-connector[bot],P1,legacy-state,, +https://github.com/srcfl/ftw/pull/1566#discussion_r4243201275,1566,go/internal/state/series_archive.go,chatgpt-codex-connector[bot],P1,other,, +https://github.com/srcfl/ftw/pull/1570#discussion_r4243493900,1570,go/internal/state/history_convert.go,chatgpt-codex-connector[bot],P1,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1571#discussion_r4243531055,1571,.github/workflows/history-converter-release.yml,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1573#discussion_r4243679270,1573,go/internal/state/history_convert_cold.go,chatgpt-codex-connector[bot],P1,duplicated-truth,, +https://github.com/srcfl/ftw/pull/1573#discussion_r4243679272,1573,go/internal/state/history_convert_cold.go,chatgpt-codex-connector[bot],P1,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1575#discussion_r4243961191,1575,go/internal/config/backup_paths.go,chatgpt-codex-connector[bot],P1,legacy-state,,S4 +https://github.com/srcfl/ftw/pull/1577#discussion_r4244353197,1577,tools/ha-backup-export/ftw_ha_export.py,chatgpt-codex-connector[bot],P2,legacy-state,, +https://github.com/srcfl/ftw/pull/1577#discussion_r4244353199,1577,.github/workflows/ha-export-release.yml,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1578#discussion_r4244375955,1578,package.json,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1579#discussion_r4244920055,1579,go/internal/backup/restore_point.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1579#discussion_r4244920059,1579,go/internal/backup/restore_point.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1580#discussion_r4245121231,1580,go/internal/backup/restore_point.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1582#discussion_r4248922185,1582,go/internal/loadpoint/schedule.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1582#discussion_r4248922199,1582,go/internal/loadpoint/schedule.go,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1585#discussion_r4249592379,1585,go/internal/localzone/localzone.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1592#discussion_r4250974219,1592,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,unknown-as-value,,S3 +https://github.com/srcfl/ftw/pull/1592#discussion_r4250974225,1592,go/internal/api/api_history_quality.go,chatgpt-codex-connector[bot],P2,power-units-sign,, +https://github.com/srcfl/ftw/pull/1592#discussion_r4250974235,1592,go/internal/api/api_history_quality.go,chatgpt-codex-connector[bot],P2,unknown-as-value,,S5 +https://github.com/srcfl/ftw/pull/1592#discussion_r4251098046,1592,web/app.js,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1593#discussion_r4251140320,1593,web/app.js,chatgpt-codex-connector[bot],P1,other,, +https://github.com/srcfl/ftw/pull/1605#discussion_r4256173318,1605,go/internal/appuplink/deadman.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1608#discussion_r4256413722,1608,package.json,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1607#discussion_r4256453022,1607,go/internal/api/api_cloud.go,chatgpt-codex-connector[bot],P2,security,,S1 +https://github.com/srcfl/ftw/pull/1607#discussion_r4256453028,1607,go/internal/notifications/charging.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1607#discussion_r4256453040,1607,go/internal/cloudlink/link.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1609#discussion_r4256534450,1609,.changeset/ftw-cloud-release-key.md,chatgpt-codex-connector[bot],P1,release-ci,, +https://github.com/srcfl/ftw/pull/1610#discussion_r4256565505,1610,docs/protocol-cloud.md,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1616#discussion_r4266990052,1616,go/internal/drivers/host.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,,S2 +https://github.com/srcfl/ftw/pull/1621#discussion_r4267574447,1621,docs/adr/0009-watch-exchange.md,chatgpt-codex-connector[bot],P1,security,, +https://github.com/srcfl/ftw/pull/1621#discussion_r4267574455,1621,docs/adr/0009-watch-exchange.md,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1622#discussion_r4268363093,1622,go/internal/appproto/handler.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,,S1 +https://github.com/srcfl/ftw/pull/1622#discussion_r4268363102,1622,go/internal/appproto/command.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1623#discussion_r4268380738,1623,go/internal/apiauth/contract_gen.go,chatgpt-codex-connector[bot],P1,security,, +https://github.com/srcfl/ftw/pull/1625#discussion_r4268521393,1625,go/internal/appenroll/enroll.go,chatgpt-codex-connector[bot],P2,legacy-state,, +https://github.com/srcfl/ftw/pull/1626#discussion_r4269026971,1626,go/internal/appuplink/exchange.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1626#discussion_r4269026982,1626,go/internal/appuplink/exchange.go,chatgpt-codex-connector[bot],P2,silent-failure,,S2 +https://github.com/srcfl/ftw/pull/1628#discussion_r4273084541,1628,go/cmd/ftw/main.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,,S2 +https://github.com/srcfl/ftw/pull/1629#discussion_r4273689844,1629,go/cmd/ftw/app_link.go,chatgpt-codex-connector[bot],P1,power-units-sign,,S6 +https://github.com/srcfl/ftw/pull/1630#discussion_r4274177630,1630,go/internal/appproto/plan.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1628#discussion_r4275298466,1628,go/cmd/ftw/main.go,cursor[bot],none,concurrency-lifecycle,,S2 +https://github.com/srcfl/ftw/pull/1635#discussion_r4284542228,1635,go/cmd/ftw/cloud_link.go,chatgpt-codex-connector[bot],P1,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1635#discussion_r4284542254,1635,go/internal/appenroll/enroll.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1635#discussion_r4284542277,1635,go/internal/cloudlink/conn.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1634#discussion_r4284554050,1634,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,silent-failure,, +https://github.com/srcfl/ftw/pull/1631#discussion_r4284567385,1631,go/internal/mpc/core_recovery.go,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1631#discussion_r4284567395,1631,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P2,unknown-as-value,,S3 +https://github.com/srcfl/ftw/pull/1636#discussion_r4284635261,1636,go/internal/mpc/optimizer_transport.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1638#discussion_r4285160305,1638,go/internal/mpc/external_optimizer.go,chatgpt-codex-connector[bot],P1,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1642#discussion_r4286002826,1642,go/protocol/agents.go,chatgpt-codex-connector[bot],P2,security,, +https://github.com/srcfl/ftw/pull/1647#discussion_r4286305901,1647,go/protocol/cloudwire/push.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,,S5 +https://github.com/srcfl/ftw/pull/1647#discussion_r4286305912,1647,go/protocol/cloudwire/messages.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,,S5 +https://github.com/srcfl/ftw/pull/1647#discussion_r4286305921,1647,docs/cars.md,chatgpt-codex-connector[bot],P2,duplicated-truth,,S5 +https://github.com/srcfl/ftw/pull/1646#discussion_r4286310445,1646,go/internal/appproto/agents.go,chatgpt-codex-connector[bot],P1,silent-failure,,S1 +https://github.com/srcfl/ftw/pull/1646#discussion_r4286310457,1646,go/internal/appproto/agents.go,chatgpt-codex-connector[bot],P2,security,, +https://github.com/srcfl/ftw/pull/1646#discussion_r4286310477,1646,go/internal/appproto/agents.go,chatgpt-codex-connector[bot],P2,security,, +https://github.com/srcfl/ftw/pull/1646#discussion_r4286310488,1646,go/internal/appenroll/agents.go,chatgpt-codex-connector[bot],P2,ui-contract,, +https://github.com/srcfl/ftw/pull/1644#discussion_r4286429583,1644,go/internal/mpc/reserve_price.go,chatgpt-codex-connector[bot],P2,power-units-sign,, +https://github.com/srcfl/ftw/pull/1648#discussion_r4286432759,1648,go/internal/loadpoint/loadpoint.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1649#discussion_r4286439137,1649,go/internal/appuplink/tunnel.go,chatgpt-codex-connector[bot],P1,security,, +https://github.com/srcfl/ftw/pull/1649#discussion_r4286439147,1649,.changeset/send-on-arrival.md,chatgpt-codex-connector[bot],P2,release-ci,, +https://github.com/srcfl/ftw/pull/1643#discussion_r4286459105,1643,go/internal/mpc/service.go,chatgpt-codex-connector[bot],P1,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1643#discussion_r4286459121,1643,go/internal/appproto/handler.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1650#discussion_r4286786021,1650,go/internal/loadpoint/car.go,chatgpt-codex-connector[bot],P1,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1650#discussion_r4286786034,1650,go/internal/cars/ops.go,chatgpt-codex-connector[bot],P1,concurrency-lifecycle,, +https://github.com/srcfl/ftw/pull/1650#discussion_r4286786043,1650,go/internal/api/loadpoint_vehicle.go,chatgpt-codex-connector[bot],P2,concurrency-lifecycle,,S1 +https://github.com/srcfl/ftw/pull/1650#discussion_r4286786057,1650,go/internal/cars/ops.go,chatgpt-codex-connector[bot],P2,legacy-state,, +https://github.com/srcfl/ftw/pull/1653#discussion_r4287420667,1653,go/internal/cloudlink/quic.go,chatgpt-codex-connector[bot],P1,security,, +https://github.com/srcfl/ftw/pull/1661#discussion_r4292214811,1661,go/internal/cloudlink/events.go,chatgpt-codex-connector[bot],P2,silent-failure,, +https://github.com/srcfl/ftw/pull/1662#discussion_r4292226749,1662,go/internal/notifications/service.go,chatgpt-codex-connector[bot],P2,incomplete-wiring,, +https://github.com/srcfl/ftw/pull/1662#discussion_r4292226753,1662,go/cmd/ftw/cars_wiring.go,chatgpt-codex-connector[bot],P2,legacy-state,,S1 +https://github.com/srcfl/ftw/pull/1660#discussion_r4292367173,1660,go/internal/cars/tick.go,chatgpt-codex-connector[bot],P2,unknown-as-value,,S3 +https://github.com/srcfl/ftw/pull/1663#discussion_r4292418242,1663,go/internal/mpc/failure_diagnostic.go,chatgpt-codex-connector[bot],P2,unknown-as-value,, +https://github.com/srcfl/ftw/pull/1670#discussion_r4297151291,1670,go/internal/api/api_backups.go,chatgpt-codex-connector[bot],P2,legacy-state,, +https://github.com/srcfl/ftw/pull/1672#discussion_r4297443211,1672,go/internal/control/ev_fuse_budget.go,chatgpt-codex-connector[bot],P1,power-units-sign,, diff --git a/tools/agent-pitfalls/findings.py b/tools/agent-pitfalls/findings.py new file mode 100644 index 000000000..0d0da737e --- /dev/null +++ b/tools/agent-pitfalls/findings.py @@ -0,0 +1,118 @@ +"""Agent-pitfall lever for srcfl/ftw. + + python3 findings.py extract review_comments.json findings.json + python3 findings.py classify findings.json labels.json [model] + python3 findings.py backtest findings.json backtest.json [model] + python3 findings.py report findings.json labels.json backtest.json + +Findings are inline comments from review bots (Codex, Cursor Bugbot, Copilot) +on PRs that agents wrote. Classification and backtest are LLM judgments made +in batches of 40 through an agent CLI (grok, codex or claude); outputs are resumable JSON files. +""" +import json, re, subprocess, sys, os, concurrent.futures as cf +from collections import Counter, defaultdict + +BOTS = {"chatgpt-codex-connector[bot]", "cursor[bot]", "Copilot"} +TAX = """legacy-state: change ignores state already stored on existing installs (DB rows, saved settings, YAML seeds, migrations, upgrade/rollback paths, retired keys). +unknown-as-value: missing, stale, unknown or failed data is treated as a real value (0, default, last value, success); freshness/health ignored. +concurrency-lifecycle: races, ordering, locks, cancellation, timeouts, restart/shutdown, retries, non-idempotent steps. +power-units-sign: sign convention, units (W/kW/Wh), power vs energy, phases, thresholds, clamps, money/price math. +duplicated-truth: the same constant, list, rule or logic lives in several places and diverges; docs/comments/tests contradict code. +incomplete-wiring: new behaviour not applied on every entry point/caller/path, or a refactor drops a caller/path that still mattered. +silent-failure: errors swallowed, fallback hides a failure, fail-open, wrong status reported as success. +security: auth, secrets, tokens, injection, exposure, permissions. +release-ci: release workflows, CI scripts, changeset/version bump, build/packaging. +ui-contract: UI shows state or controls that do not match backend data/state. +other: none of the above.""" +CLASSES = [l.split(":")[0] for l in TAX.splitlines()] +S = { + "S1": "One write path: every settings change and control request goes through one typed Core service (core.Apply(cmd)); API, web UI, HA/MQTT, app protocol, CLI and watchdog are thin adapters, and one shared case table runs against every adapter.", + "S2": "Race detector and lifecycle harness in CI: go test -race on core packages in CI, goroutines owned by a Run(ctx)/Stop lifecycle helper with tests for cancel, restart, shutdown and retry.", + "S3": "Typed freshness at the telemetry boundary: readings are Observed values with state Live/Stale/Missing/Failed; code can only get a number via Live(now), so missing or stale data cannot be read as 0 or as the last value; Lua host rejects nil-to-0.", + "S4": "Migration registry plus upgrade corpus: every change to persisted shapes (config document, YAML seed, SQLite schema, saved device/session state) needs an entry in one registry; CI boots Core on fixtures from older releases and runs each migration twice.", + "S5": "One source of truth: shared constants, enums, field lists and API shapes are generated from one Go definition for web, docs and drivers; docs that restate code are generated or deleted; a check fails on drift.", + "S6": "Unit types: power, energy, SoC, current and money are distinct Go types (units.W, units.Wh, units.SoC...) in control/mpc/api signatures, with sign convention encoded in the type; raw float64 for these is rejected by lint.", +} + +def clean(b): + b = re.sub(r"!\[[^\]]*\]\([^)]*\)|<[^>]+>|Useful\? React with.*", " ", b, flags=re.S) + return re.sub(r"\s+", " ", b).strip() + +def prio(b): + m = re.search(r"\bP([0-3])\b", b) + if m: return "P" + m.group(1) + m = re.search(r"(High|Medium|Low) Severity", b) + return m.group(1) if m else "none" + +def extract(src, dst): + out = [] + for c in json.load(open(src)): + if c["user"]["login"] not in BOTS: continue + t = clean(c["body"]) + out.append({"url": c["html_url"], "pr": int(c["pull_request_url"].rsplit("/", 1)[1]), "path": c["path"], + "bot": c["user"]["login"], "at": c["created_at"], "priority": prio(c["body"]), + "title": re.sub(r"\*+", "", t)[:140].strip(), "text": t[:450]}) + json.dump(out, open(dst, "w"), indent=1); print(len(out), "findings") + +RUNNERS = { + "grok": lambda p: ["grok", "-p", p, "--max-turns", "1", "--no-subagents", "--disable-web-search", "--tools", "", "--reasoning-effort", "low"], + "codex": lambda p: ["codex", "exec", "--skip-git-repo-check", p], + "sonnet": lambda p: ["claude", "-p", "--model", "sonnet", p], +} + +def ask(prompt, model): + r = subprocess.run(RUNNERS[model](prompt), stdin=subprocess.DEVNULL, capture_output=True, text=True, timeout=900, cwd="/tmp") + res = {} + for l in r.stdout.splitlines(): + l = l.strip().strip(",") + if l.startswith("{"): + try: + j = json.loads(l); res[str(j["id"])] = j + except Exception: pass + return res + +def batched(findings, out, make_prompt, parse, model): + done = json.load(open(out)) if os.path.exists(out) else {} + todo = [(str(i), o) for i, o in enumerate(findings) if str(i) not in done] + chunks = [todo[i:i + 40] for i in range(0, len(todo), 40)] + with cf.ThreadPoolExecutor(5) as ex: + for res in ex.map(lambda ch: ask(make_prompt(ch), model), chunks): + for k, j in res.items(): done[k] = parse(j) + json.dump(done, open(out, "w")); print(len(done), flush=True) + +def lines(ch): + return "\n".join(json.dumps({"id": int(i), "file": o["path"], "finding": o["text"]}, ensure_ascii=False) for i, o in ch) + +def classify(src, out, model="grok"): + p = lambda ch: ("You classify code-review findings raised by review bots on AI-agent-written PRs in a Go/Lua/JS home energy system.\n" + "Pick exactly one class: the root mistake the reviewer caught in the agent's change.\n" + TAX + + "\n\nReturn ONLY JSON lines, one per input, like {\"id\": 3, \"c\": \"legacy-state\"}. No prose.\n\n" + lines(ch)) + batched(json.load(open(src)), out, p, lambda j: j["c"] if j.get("c") in CLASSES else "other", model) + +def backtest(src, out, model="grok"): + sl = "\n".join(f"{k}: {v}" for k, v in S.items()) + p = lambda ch: ("These are review findings that bots raised on AI-agent-written PRs in a Go/Lua/JS home energy system (FTW).\n" + "Candidate structural fixes:\n" + sl + "\n\nFor each finding, list the structures that would have CAUGHT it: had the structure existed, " + "the mistake would not compile, would fail CI, or could not be written. Be strict: 'might help' is not caught. An empty list is common.\n" + "Return ONLY JSON lines like {\"id\": 3, \"s\": [\"S3\"]}.\n\n" + lines(ch)) + batched(json.load(open(src)), out, p, lambda j: [s for s in j.get("s", []) if s in S], model) + +def report(src, lab, bt): + f = json.load(open(src)); L = json.load(open(lab)); B = json.load(open(bt)) if os.path.exists(bt) else {} + cls = Counter(); prs = defaultdict(set); hi = Counter() + for i, o in enumerate(f): + c = L.get(str(i), "unlabeled"); cls[c] += 1; prs[c].add(o["pr"]); hi[c] += o["priority"] in ("P1", "High") + print(f"findings={len(f)} prs={len({o['pr'] for o in f})} labeled={len(L)} backtested={len(B)}") + for c, n in cls.most_common(): print(f" {c:22} {n:4} PRs={len(prs[c]):3} P1/High={hi[c]}") + if B: + caught = Counter(); caught_hi = Counter(); by = defaultdict(Counter); anyc = 0 + for i, o in enumerate(f): + ss = B.get(str(i), []); anyc += bool(ss) + for s in ss: + caught[s] += 1; caught_hi[s] += o["priority"] in ("P1", "High"); by[s][L.get(str(i), "?")] += 1 + print(f"backtest: caught by any structure {anyc}/{len(B)}") + for s, n in caught.most_common(): print(f" {s} {n:4} P1/High={caught_hi[s]:3} top classes {by[s].most_common(3)}") + +if __name__ == "__main__": + cmd, *a = sys.argv[1:] + {"extract": extract, "classify": classify, "backtest": backtest, "report": report}[cmd](*a) From d7764996c073bb2d62497cadab5bbbcb2079de14 Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sat, 17 Oct 2026 07:04:38 +0200 Subject: [PATCH 2/3] docs: keep the pitfall lever under docs/ so the PR stays docs-only --- docs/agent-friendly-plan.md | 6 +++--- {tools => docs}/agent-pitfalls/README.md | 2 +- {tools => docs}/agent-pitfalls/findings.csv | 0 {tools => docs}/agent-pitfalls/findings.py | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename {tools => docs}/agent-pitfalls/README.md (88%) rename {tools => docs}/agent-pitfalls/findings.csv (100%) rename {tools => docs}/agent-pitfalls/findings.py (100%) diff --git a/docs/agent-friendly-plan.md b/docs/agent-friendly-plan.md index 2fd935220..40f48fb97 100644 --- a/docs/agent-friendly-plan.md +++ b/docs/agent-friendly-plan.md @@ -52,10 +52,10 @@ in the repository, not in the agent. ## The data -`tools/agent-pitfalls/findings.py` is the lever. It extracts the findings, +`docs/agent-pitfalls/findings.py` is the lever. It extracts the findings, classifies them, backtests them and prints the report. Classification and backtest are LLM judgements, made in batches of 40. -`tools/agent-pitfalls/findings.csv` holds every label, so a reviewer can +`docs/agent-pitfalls/findings.csv` holds every label, so a reviewer can spot-check any row. Codex labelled all 1,150 findings, and Grok labelled 920 of them @@ -248,7 +248,7 @@ They are good first follow-ups once steps 1 and 2 land. - Whether the CI cost of the race job is worth it on every Core PR, or only on PRs that touch the listed packages. -- Whether `tools/agent-pitfalls/` stays in the repo, or the plan merges +- Whether `docs/agent-pitfalls/` stays in the repo, or the plan merges without it. - The order of steps 5–7. The backtest ranks S5 and S1 above S4 by count, and S1 and S4 above S5 by P1/High findings. diff --git a/tools/agent-pitfalls/README.md b/docs/agent-pitfalls/README.md similarity index 88% rename from tools/agent-pitfalls/README.md rename to docs/agent-pitfalls/README.md index 281030993..321a61aa0 100644 --- a/tools/agent-pitfalls/README.md +++ b/docs/agent-pitfalls/README.md @@ -1,6 +1,6 @@ # Agent pitfalls -The lever behind [docs/agent-friendly-plan.md](../../docs/agent-friendly-plan.md). +The lever behind [docs/agent-friendly-plan.md](../agent-friendly-plan.md). ```bash gh api --paginate 'repos/srcfl/ftw/pulls/comments?per_page=100' | jq -s add > review_comments.json diff --git a/tools/agent-pitfalls/findings.csv b/docs/agent-pitfalls/findings.csv similarity index 100% rename from tools/agent-pitfalls/findings.csv rename to docs/agent-pitfalls/findings.csv diff --git a/tools/agent-pitfalls/findings.py b/docs/agent-pitfalls/findings.py similarity index 100% rename from tools/agent-pitfalls/findings.py rename to docs/agent-pitfalls/findings.py From 31409cfbef5a6cb4f618c021b36ba3c82681dfeb Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sat, 17 Oct 2026 07:42:09 +0200 Subject: [PATCH 3/3] docs: distinguish model estimates from executable evidence Signed-off-by: Fredrik Ahlgren --- docs/agent-friendly-plan.md | 108 ++++++++++++++++++++++------------ docs/agent-pitfalls/README.md | 7 ++- 2 files changed, 76 insertions(+), 39 deletions(-) diff --git a/docs/agent-friendly-plan.md b/docs/agent-friendly-plan.md index 40f48fb97..2fd5a4641 100644 --- a/docs/agent-friendly-plan.md +++ b/docs/agent-friendly-plan.md @@ -7,7 +7,8 @@ Agents write most of FTW. 919 of the 2,250 commits on `master` carry a Claude co-author trailer, and 346 of the 1,415 pull requests come from `agent/`, `codex/`, `claude/` or `cursor/` branches. Both counts are lower bounds, since many agent PRs carry no marker. Review bots then raised -1,150 inline findings on 573 of those pull requests. 760 of the 1,735 +1,150 inline findings on 573 pull requests. These are bot comments, not +1,150 confirmed, distinct defects. 760 of the 1,735 conventional commits on `master` are `fix` commits. Agents copy the nearest example and take the shortest path that compiles. @@ -52,15 +53,20 @@ in the repository, not in the agent. ## The data -`docs/agent-pitfalls/findings.py` is the lever. It extracts the findings, -classifies them, backtests them and prints the report. Classification and -backtest are LLM judgements, made in batches of 40. +`docs/agent-pitfalls/findings.py` extracts the findings, classifies them, +estimates which structures would prevent them and prints the report. Classification and +backtest are LLM judgements, made in batches of 40 from excerpts of up to +450 characters. The judge did not compile or run each historical change. `docs/agent-pitfalls/findings.csv` holds every label, so a reviewer can spot-check any row. Codex labelled all 1,150 findings, and Grok labelled 920 of them independently as a second rater. The two agreed on 78.9 % of those 920 -(726). Both raters put the same four classes in their top five. +(726). Both raters put the same four classes in their top five. Agreement +measures consistency between these labels; it does not establish that the +comments describe real defects or that the proposed fixes prevent them. +The sample can contain duplicate reports, false alarms and findings that +reviewers later resolved. It excludes mistakes that these bots missed. | Class | Findings | PRs | P1 or High | |---|---:|---:|---:| @@ -123,13 +129,16 @@ telemetry summed into the dispatch EV total (#36); stale PV readings used as the live prediction anchor (#85); `siteLoadW` built from stale readings and returning 0 when the meter is missing (#310). `telemetry.Store` keeps a reading after its driver goes stale, and `Get`, `ReadingsByType` and -`ReadingsByDriver` return it unfiltered. Health filtering is opt-in. There -are 147 direct reads outside the package, 35 of them `ReadingsByType` +`ReadingsByDriver` return it unfiltered. Health filtering is opt-in. The +original grep found 147 matching lines outside the package, 35 of them `ReadingsByType` calls, against 11 `TelemetryLive()` checks. Direct reads of `RawW` and `SmoothedW` alone grew from 44 in 8 files (1 May) to 101 in 20 files (17 October). -- **Level: lint now (step 2), then types (step 3).** The ratchet stops new - cases today. Step 3 makes the safe accessor the only one. +- **Level: lint now (step 2), then types (step 3).** The revised ratchet + counts 150 occurrences on the proposal's base, including several on one + line. It stops per-file count increases for four named read forms; it + does not prove that an existing or replacement read uses live data. + Step 3 aims to make the safe accessor the only one. **5. Duplicated truth (95).** 40 of these findings are in `docs/`, where prose restates code and drifts from it. Others are web constants that copy @@ -143,10 +152,11 @@ Go, or Lua host helpers that docs promise but the host does not expose For every finding, the backtest asked: had this structure existed before the PR, would the mistake fail to compile, fail CI, or be impossible to write? The judge (Codex) was told to be strict, so "might help" counts as -no. Because this is an LLM judgement, treat the counts as a ranking, not a -precise rate. +no. Treat the counts as hypotheses for setting priorities. They are not +an observed prevention rate, a causal estimate or a test of these draft +PRs. Each structure needs its own executable test and failure case. -| Structure | Caught | P1 or High | Mostly in | +| Proposed structure | Judged caught | P1 or High | Mostly in | |---|---:|---:|---| | S5 one source of truth, generated or deleted docs | 85 | 14 | duplicated-truth 54, incomplete-wiring 18 | | S1 one write path into Core, shared case table per adapter | 69 | 28 | incomplete-wiring 36, concurrency 9 | @@ -156,18 +166,31 @@ precise rate. | S6 distinct unit types for W, Wh, SoC, A, money | 8 | 1 | power-units-sign 7 | | Any of the six | 257 of 1,150 | | | -Besides the LLM judge, two checks were tested against git history -directly: -- The race detector fails on the parent commits of #787 and #789, and - passes on `master`. -- The telemetry ratchet fails on the merged commits of #36, #85, #310 and - #647. Over 1,423 first-parent commits it would have fired 42 times. Of the - 33 of those that came from numbered PRs, 10 had an unknown-as-value - finding. +The 257 total covers all six hypothetical structures. After dropping S6, +the union is 249 findings. Overlap means the rows must not be added. The +remaining 901 received no prevention label among S1–S5; that does not prove +that the labelled 249 would be prevented in practice. -S6 is dropped for now. It would have caught 8 findings, and the existing -`internal/units` reflection tests already cover kWp and SoC scale. The -other 893 findings (78 %) need judgement, or a structure not on this list. +The executable evidence has a narrower scope: + +| Check | Evidence and limit | +|---|---| +| #1676 race detector | It fails on the parents of #787 and #789. Both races were in test fixtures, not production code. The new CI job passed at `bcc32d7d` in 4 min 20 s. This tests the detector on exercised paths; it does not prove absence of races, ordering bugs or shutdown bugs. | +| #1677 telemetry ratchet | Both the original line counter and the revised occurrence counter reject #36, #85, #310 and #647 against their parents. Rejection proves that a read count grew, not that the check identified the stale value itself. The revision adds tests for fields, multiple reads per line, exclusions, exceptions and Git errors on macOS and Linux. | +| #1678 simulator skill | The initial Linux run covered launch, doctor, idle and cleanup. Review then reproduced false success with missing feedback and with another instance answering the port. The revision adds process and port checks and requires fresh command evidence for both batteries. A macOS run on 17 October 2026 passed launch, doctor, idle and cleanup: both drivers accepted 0 W commands, all five ports closed, and the evidence remained. Helper tests cover missing feedback, stale commands, wrong listeners and reused PIDs on macOS and Linux. No hardware result follows from a simulator run. | + +S2 includes a lifecycle harness as well as `-race`; #1676 adds only the race +detector. S3 assumes typed values that prevent unsafe number access; +#1677 adds only a count check. S1, S4 and S5 remain designs. None of their +model counts measures the protection shipped by these four drafts. + +The earlier cost estimate (42 rejections over 1,423 first-parent commits, +33 from numbered PRs and 10 with an unknown-as-value label) used the old +line counter. It is not a measured cost for the revised occurrence check. + +S6 remains out of scope. The model assigned it eight findings; the existing +`internal/units` reflection tests cover kWp and SoC scale. This is a scope +choice, not evidence that unit types have no further value. ## Steps @@ -175,18 +198,23 @@ Each step merges on its own and leaves `master` working. They are ordered by what the backtest and the proofs support, cheapest first. 1. **Race detector in CI.** Draft #1676. One job, one script, no product - code. It catches the concurrency class at the CI level. -2. **Telemetry read ratchet.** Draft #1677. It stops unknown-as-value from - growing, and its error names the safe accessor. + code. It catches data races on paths the tests execute. Changes to + `race.sh` itself must select the Core CI job. +2. **Telemetry read ratchet.** Draft #1677. It rejects per-file increases + in the four counted read forms, and its error names the safe accessor. 3. **Health-gated telemetry accessors** (S3, types). Add `Store.Live(driver, type) (Reading, bool)` and `Store.LiveByType(type) []Reading`. They return copies and skip stale, - offline and faulted drivers. Migrate the 147 reads package by package, + offline and faulted drivers. Migrate the counted reads package by package, with the ratchet proving each count only falls. Then make `Get` and - `ReadingsByType` unexported, and delete the ratchet once the count is 0. + `ReadingsByType` unexported. Returning `Reading` and `bool` alone does + not provide S3's type guarantee: callers can ignore the flag or retain + a reading past its freshness window. Prove the stronger boundary before + removing the ratchet or claiming S3's predicted coverage. 4. **verify-ftw skill.** Draft #1678. It is a scripted launch, doctor, - drive and cleanup over the simulators, proved end to end. Agents use it - before claiming behaviour. + drive and cleanup over the simulators. The supported assertion is idle + dispatch for both batteries. Other modes, driver fallback, UI and real + hardware each need their own run and evidence. 5. **One write path into Core** (S1, architecture). Settings and control requests become typed commands handled by one Core service that owns the locks. The API, web, HA, app protocol, CLI and watchdog become adapters. @@ -226,23 +254,27 @@ cover a rule indirectly. | Planner output is never sent directly to hardware | No check found. `internal/mpc` does not depend on `internal/drivers` today, so an import check would pass | | Sign conversion only at the driver boundary | No check found | | Stale site-meter data stops dispatch | Control tests; seen live in the verify-ftw run | -| No new race | Step 1 | -| No new direct telemetry read | Step 2, then step 3 types | +| No data race on exercised test paths | Step 1; logical lifecycle errors still need tests | +| No per-file increase in four counted telemetry read forms | Step 2; freshness itself needs step 3 | The two "no check found" rules that pass today (planner and database) cost one import check each, written the same way as the cloudlink check. They are good first follow-ups once steps 1 and 2 land. -## Open questions settled by prototypes +## What the prototypes establish - *Does the race detector find anything today, or would the CI job be red - on day one?* It passes on all 16 package trees on `master`. It fails on - the two historical races. + on day one?* It passed on all 16 package trees at `3789764a` and in the + draft's CI job. It fails on the two historical test-fixture races. - *Can a check for stale reads be precise enough?* As a ratchet on new - reads, it fired on 42 of 1,423 commits, and it caught four of the PRs - where review found the stale-read bug. + reads, the old counter rejected four historical PRs with stale-read + findings. Negative tests exposed portability, same-line and exception + gaps. The revised counter tests those cases; it still does not prove + the health of a reading. - *Can an agent run Core end to end without hardware?* Yes, with the - simulators on isolated ports, in about 15 seconds after the build. + simulators on isolated ports. The initial Linux run reported about 15 + seconds after the build. That run alone did not test false success or + establish support on other operating systems. ## Left for the owner diff --git a/docs/agent-pitfalls/README.md b/docs/agent-pitfalls/README.md index 321a61aa0..31cc90d19 100644 --- a/docs/agent-pitfalls/README.md +++ b/docs/agent-pitfalls/README.md @@ -1,6 +1,6 @@ # Agent pitfalls -The lever behind [docs/agent-friendly-plan.md](../agent-friendly-plan.md). +The labels and analysis script for [docs/agent-friendly-plan.md](../agent-friendly-plan.md). ```bash gh api --paginate 'repos/srcfl/ftw/pulls/comments?per_page=100' | jq -s add > review_comments.json @@ -13,3 +13,8 @@ python3 findings.py report findings.json labels.json backtest.json `findings.csv` holds the labels behind the plan's numbers: one row per bot finding, the Codex and Grok classes (Grok labelled 920 of 1,150) and the structures the backtest judged would have caught it. + +These are model labels for bot comments, not confirmed defects or measured +prevention. The union is 257 across S1–S6 and 249 after dropping S6. S2's +label assumes a lifecycle harness as well as the race detector. Read the +plan's evidence table before using these counts to assess a draft PR.