diff --git a/docs/agent-friendly-plan.md b/docs/agent-friendly-plan.md new file mode 100644 index 000000000..2fd5a4641 --- /dev/null +++ b/docs/agent-friendly-plan.md @@ -0,0 +1,286 @@ +# 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 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. +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 + +`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. 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 | +|---|---:|---:|---:| +| 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. 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 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 +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. 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. + +| 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 | +| 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 | | | + +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. + +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 + +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 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 counted reads package by package, + with the ratchet proving each count only falls. Then make `Get` and + `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. 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. + 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 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. + +## What the prototypes establish + +- *Does the race detector find anything today, or would the CI job be red + 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, 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. 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 + +- 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 `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/docs/agent-pitfalls/README.md b/docs/agent-pitfalls/README.md new file mode 100644 index 000000000..31cc90d19 --- /dev/null +++ b/docs/agent-pitfalls/README.md @@ -0,0 +1,20 @@ +# Agent pitfalls + +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 +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. + +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. diff --git a/docs/agent-pitfalls/findings.csv b/docs/agent-pitfalls/findings.csv new file mode 100644 index 000000000..ff062cfd5 --- /dev/null +++ b/docs/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/docs/agent-pitfalls/findings.py b/docs/agent-pitfalls/findings.py new file mode 100644 index 000000000..0d0da737e --- /dev/null +++ b/docs/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)