Skip to content

luci-app-usteer: per-SSID settings tabs and known-station tracking - #8869

Open
grzegorz914 wants to merge 2 commits into
openwrt:masterfrom
grzegorz914:usteer-per-ssid-known-stations
Open

luci-app-usteer: per-SSID settings tabs and known-station tracking#8869
grzegorz914 wants to merge 2 commits into
openwrt:masterfrom
grzegorz914:usteer-per-ssid-known-stations

Conversation

@grzegorz914

@grzegorz914 grzegorz914 commented Jul 25, 2026

Copy link
Copy Markdown

Summary

Companion LuCI frontend for openwrt/usteer#22 (per-SSID configuration overrides and known-station tracking with cold-start exploratory candidates).

  • Add a settings tab per configured SSID (nested under Settings), each bound to its own usteer_ssid UCI section, mirroring the daemon's new per-SSID configuration overrides. The SSID list determines which tabs are shown live, without a page reload.
  • Add a "Known stations" tab showing the daemon's persisted best-signal-ever-seen data per node, with a Delete button per local entry (new delete_known ubus call, granted in the app's rpcd ACL) and a description of the cold-start "exploratory" placeholder semantics. Remote nodes' entries have no Delete button, since removing one only clears the local synced copy, not the owning peer's own record.
  • Add live auto-refresh for newly seen MAC addresses on the Hearing map, removing the previous "refresh the page" notice.
  • Move the "Band steering interval" and its dependent fields to the per-SSID tab; setting the interval to 0 disables band steering for that SSID, matching the daemon's only convention for it (config.band_steering_interval).
  • Improve labels, descriptions, placeholders and default-value documentation across the existing global settings fields (units on time/signal fields, dual SNR/dBm convention explained where used).
  • Update the translation template and fully translate the new/changed strings into Polish.

Test plan

  • Built and installed on 4 production APs (mixed ipq806x/ramips) for this session
  • Verified per-SSID tabs render correctly, save to the right usteer_ssid UCI section, and fields fall back to the global setting when left blank
  • Verified Known stations tab, Delete button, and Hearing map live-refresh against real client activity

Update

Extended the per-SSID tab with the remaining station/node-scoped policy fields that were still global-only: sta_block_timeout, local_sta_timeout, max_retry_band, seen_policy_timeout, assoc_steering, probe_steering, max_neighbor_reports, load_balancing_threshold, steer_reject_timeout, roam_process_timeout, roam_kick_delay, initial_connect_delay and node_up_script (moved from the global Settings tab, matching the daemon's extended usteer_ssid overrides).

Also fixed a real bug found after the first round landed: the SSID tab nesting was only wired to the very first render - Map.prototype.save() re-renders the map's content in place on every Save via the same renderContents() used for the initial render, which silently undid the relocation (SSID tabs would jump back into the top-level tab bar after any Save). Fixed by wrapping renderContents() itself instead of reacting only to the first m.render() call, so relocation reruns on every render/Save/Reset.

  • Verified per-SSID tabs (including the newly-moved batch) render correctly, save to the right usteer_ssid UCI section, and fall back to the global setting when left blank
  • Verified tab nesting survives Save and Save & Apply, not just the initial page load

@openwrt openwrt Bot added the not following guidelines Pull request does not follow formatting guidelines label Jul 25, 2026
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 279269a to ff4374e Compare July 25, 2026 09:15
@openwrt openwrt Bot removed the not following guidelines Pull request does not follow formatting guidelines label Jul 25, 2026

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the two new commits (per-SSID settings UI + translation refresh). The backend dependency (openwrt/usteer#22) is disclosed in the PR body, so the new UCI options / delete_known ubus call are not flagged as frontend-only. Both commit messages match their diffs. Two inline questions about the per-SSID section handling below.


Generated by Claude Code

Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the two new commits since ff4374e (aab5f29 lazy per-SSID section creation + collision-free ids, 18f43f1 re-nest SSID tabs after every render). Both previous inline findings are addressed. The lazy-write approach checks out against form.js/uci.js: uci.set() is indeed a no-op on a section that doesn't exist yet, so creating the section inside the write() wrapper rather than at render time is the right hook, and AbstractValue.write() honours ucisection, so the wrapper lands in the correct section.

One follow-on issue with the collision fix and two nits inline.

Commit checks

  • 18f43f1 "luci-app-usteer: re-nest SSID tabs after every render, not just the first" — the body's claim "Pre-existing bug, not introduced by the per-SSID tabs commit itself (reproduced on an older build too)" doesn't hold against this tree: master (96a255d) has no tab-relocation code in usteer.js at all — no data-tab DOM manipulation, no knowndevices tab, no relocateSsidTabs equivalent. All of it is added by cd58ab1 in this same PR, so this is fixing a bug introduced two commits earlier in the series, not a pre-existing one. Worth rewording (or dropping the sentence) so the history doesn't mislead someone bisecting later.

Generated by Claude Code

Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 18f43f1 to cae4bcd Compare July 26, 2026 06:03

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the new work since 18f43f1. The branch was force-pushed: e1488b2 squashes the previously reviewed cd58ab1 + aab5f29 + 18f43f1 together with this round's ssidSectionId() fixes, cae4bcd carries the i18n, and 2a5c682 + 1443c8e are genuinely new. All four commit messages match their diffs, so no Commit checks section.

The ssidSectionId() rework addresses the previous round's findings correctly — ids are now resolved from each existing usteer_ssid section's own ssid option before any allocation, usedSsidSectionIds is seeded from the existing section names, and both maps are Object.create(null). uci.load('usteer') is part of load(), so uci.sections() has real data by the time render() calls ssidSectionId(). The known_stations_timeout o.default = '0' removal is right: renderWidget() seeds the input with this.default when cfgvalue is null, which is what was pre-filling a literal 0 over the placeholder.

The band steering toggle itself behaves as the commit message describes — with default = '1' and optional, Flag.parse() removes the option when checked and writes '0' when unchecked, so the daemon's implicit on-by-default is preserved and no section is created just by leaving the box ticked. One issue with how the four dependent fields are wired to it, plus one series nit, inline.


Generated by Claude Code

Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 1443c8e to 3d84344 Compare July 26, 2026 17:02

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now b3f29ea + 3d84344, replacing e1488b2/cae4bcd/2a5c682/1443c8e). The i18n squash asked for last round is done: the only non-reference change in the po files since 1443c8e is one re-wrapped Polish line in po/pl, and the .pot references line up with the final usteer.js (e.g. Band steering → usteer.js:667). Both commit messages match their diffs — b3f29ea touches only usteer.js, 3d84344 only the po files — so no Commit checks section.

The hasBandSteeringToggle hoist resolves the previous round's finding correctly: all four depends(sid + '_band_steering_enabled', '1') sites are now behind the same Initscript.includes() check that guards the toggle itself, so on a usteer build without band_steering_enabled the four parameter fields stay visible and parse() no longer strips their stored values.

New this round: the delete_known plumbing added by b3f29ea looks like it cannot work as shipped — the method is missing from the app's rpcd ACL, and the RPC declaration lacks reject: true, which turns any failure into a silent fake success. Details plus one question about remote nodes inline.


Generated by Claude Code

Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 3d84344 to 17fead0 Compare July 27, 2026 05:49

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 2516ae3 + 17fead0, replacing b3f29ea/3d84344). The delta since 3d84344 is small: reject: true on the delete_known declaration, the catch() now surfacing err.message via ui.addNotification(), the isLocal flag on collectKnownStaEntries(), and the ACL grant. Both commit messages match their diffs — 2516ae3 touches only usteer.js and acl.d/luci-app-usteer.json, 17fead0 only the po files — so no Commit checks section.

All three findings from the previous round are resolved correctly:

  • reject: true is set, so handleCallReply() now raises on a non-zero ubus status instead of resolving with the status code, and the catch() branch is reachable. L.raise('RPCError', …) produces a real Error, so err.message is populated.
  • "usteer": [ "delete_known" ] landed under write.ubus, which is the right block for a state-mutating call.
  • The remote-node question is answered by dropping the button on Remoteinfo rows rather than shipping one that silently undoes itself on the next remote_update_interval; both call sites (lines 200-201 and 802-803) pass the flag consistently.

The i18n commit is now purely reference-line churn relative to 3d84344 — no msgid or msgstr changed — and the regenerated references match the final file (e.g. Delete → usteer.js:171). FormalityCheck is green on 17fead0.

One nit inline.


Generated by Claude Code

Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 17fead0 to ced26b7 Compare July 27, 2026 17:00

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 9a7e04e + ced26b7, replacing 2516ae3/17fead0). The delta since 17fead0 is one line of usteer.js plus the i18n propagation of that single msgid. Both commit messages match their diffs — 9a7e04e touches only usteer.js and acl.d/luci-app-usteer.json, ced26b7 only the po files — so no Commit checks section.

The previous round's nit is addressed: the Known-stations help text now explains why remote rows carry no Delete button, and it gained the trailing period the two preceding sentences already had. The .pot reference still resolves to the right place (usteer.js:184), the new msgid is propagated to all 31 language files plus the template, and the Polish msgstr is a complete translation of the new wording. All three FormalityCheck runs are green on ced26b7.

Two i18n nits inline, both confined to po/pl/usteer.po; nothing blocking.


Generated by Claude Code

Comment thread applications/luci-app-usteer/po/pl/usteer.po Outdated
Comment thread applications/luci-app-usteer/po/pl/usteer.po Outdated
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from ced26b7 to c763e7d Compare July 28, 2026 05:32

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 8ae5020 + c763e7d, replacing 9a7e04e/ced26b7). 8ae5020 is byte-identical to the previously reviewed 9a7e04e — same tree, same message — so the entire delta is the po/pl/usteer.po rebuild plus the paragraph documenting it in c763e7d.

Both nits from the previous round are resolved, and the rebuild's claims check out against the tree:

  • Obsolete entries in po/pl/usteer.po drop from 52 to 31, and the resulting set is exactly the set po/de/usteer.po (and the other translated languages) gains from this PR — I compared the two files entry by entry, the msgid sets match with nothing extra on either side. The 21 PR-internal leftovers are gone.
  • All 165 live entries are still present, none went empty or fuzzy, and the #: reference lines and msgid ordering are identical to po/de/usteer.po, i.e. the file really was merged against this PR's final .pot (166 entries incl. header, matching po/templates/usteer.pot).
  • The Weblate header block (Project-Id-Version, PO-Revision-Date: 2026-03-29, Last-Translator, Plural-Forms, X-Generator) is preserved from master's copy rather than replaced by the template's, so the rebuild won't look like a translator change to Weblate.
  • The DostępneWypełniane revert landed and the Polish sentence now tracks the English Only populated while … again.

All three FormalityCheck runs are green on c763e7d. One wording issue on the new commit message below; nothing blocking.

Commit checks

  • c763e7d "luci-app-usteer: update translation template and Polish translation" — the new paragraph ends with "was diffed msgid-by-msgid against the carried-forward copy to confirm all 165 live translations are unchanged", but the commit does change one live translation: po/pl/usteer.po:587-590 restores Dostępne tylko gdyWypełniane tylko gdy in the usteer.js:184 description. That revert is correct and was the point of the previous round's second nit — but it is the only substantive msgstr change in the whole commit, and the message currently asserts the opposite. Everything else really is obsolete-entry churn, so a reader trusting the message would skip the one hunk that isn't. Suggest amending the last sentence to something like "…to confirm all 165 live translations are unchanged apart from the Only populated while … description, whose opening verb is restored to Wypełniane."

Generated by Claude Code

@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from c763e7d to 51a1bf4 Compare July 28, 2026 16:44
@grzegorz914

Copy link
Copy Markdown
Author

Fixed in 51a1bf4 (amend, no file changes): reworded the commit message's last sentence to call out the Dostępne→Wypełniane revert as the one substantive msgstr change, instead of implying nothing changed.

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 1 new commit; no new issues found.

51a1bf4 replaces c763e7d as the i18n commit and 8ae5020 is carried over unchanged. git diff c763e7d..51a1bf4 is empty — the trees are byte-identical, so the entire delta is the commit-message amend the author described, exactly as stated in the PR comment.

The previous round's Commit checks finding is resolved: the last sentence of the rebuild paragraph now reads "…are unchanged apart from the "Only populated while ..." description, whose opening verb is restored to "Wypełniane"", and a new paragraph explains the choice. That matches the tree — po/pl/usteer.po:584-588 is the one live msgstr the rebuild changed relative to the carried-forward copy, and the message no longer asserts the opposite.

All three FormalityCheck runs are green on 51a1bf4.


Generated by Claude Code

@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 51a1bf4 to 1b0a234 Compare July 29, 2026 07:01

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 3a4cee1 + 1b0a234, replacing 8ae5020/51a1bf4). This round is substantially bigger than the last few: 3a4cee1 moves thirteen options (sta_block_timeout, local_sta_timeout, max_retry_band, seen_policy_timeout, assoc_steering, probe_steering, max_neighbor_reports, load_balancing_threshold, steer_reject_timeout, roam_process_timeout, roam_kick_delay, initial_connect_delay, node_up_script) out of the global Settings tab into addSsidTab() and reorders the per-SSID field list, and 1b0a234 regenerates the whole i18n set for it.

What checks out:

  • The .pot really was regenerated against the final usteer.js — spot-checked references resolve (Sta block timeout → usteer.js:576, Band steering threshold → usteer.js:602, Node up script → usteer.js:786), and the msgids dropped by this round's rewording (default false, empty means all, Default: 3) are gone from the template while Default: survives because usteer.js:780`` still uses it.
  • The obsolete-entry claim holds: po/pl, po/de, po/cs and po/ru all carry exactly 47 #~ msgid entries and 162 live ones, matching the 162-entry template, so the pl file is in line with the rest as the commit message says. No fuzzy and no empty msgstr in po/pl.
  • All three FormalityCheck runs are green on 1b0a234.

Two problems introduced by this round, plus one question and one nit, inline. The i18n one is the bigger of the two — the rebuild carried in 19 changed Polish translations of msgids this PR doesn't touch on the English side.

Commit checks

  • 3a4cee1 "luci-app-usteer: add per-SSID settings tabs and known-station tracking UI" — the message says "The four band-steering parameter fields depend on it and hide when disabled", but after this revision's reorder only three do: band_steering_threshold was moved up into the station-policy cluster at usteer.js:602-604`` and lost its if (hasBandSteeringToggle) o.depends(…) in the process. Either restore the dependency (see inline) or drop the "four" from the message.
  • 1b0a234 "luci-app-usteer: update translation template and Polish translation" — the message says the rebuilt po/pl/usteer.po was "verified msgid-by-msgid against the working copy first to confirm no live translation regressed", but 19 live msgstr differ from the previously reviewed 51a1bf4 copy, and 13 of those had matched master exactly (Event log types, Interval (ms) between sending state updates to other APs, Local sta timeout, Local sta update, Max neighbor reports, Measurement report timeout, Message types to include in log., Node up script, Remote node timeout, Remote update interval, Seen policy timeout, Setting the interval to 0 disables link-measurements., Sta block timeout). None of those msgids changed in English in this PR, so the merge should have left them alone. Details inline on po/pl/usteer.po:288.

Generated by Claude Code

Comment thread applications/luci-app-usteer/po/pl/usteer.po Outdated
Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 1b0a234 to bf996b4 Compare July 29, 2026 17:00
@openwrt openwrt Bot added the not following guidelines Pull request does not follow formatting guidelines label Jul 29, 2026
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch 2 times, most recently from daf4473 to c5b1468 Compare July 29, 2026 17:19
@openwrt openwrt Bot removed the not following guidelines Pull request does not follow formatting guidelines label Jul 29, 2026
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch 3 times, most recently from 643bd11 to 9f1345e Compare July 29, 2026 19:59

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 46a98d9 + 9f1345e, replacing 3a4cee1/1b0a234). The code delta since 1b0a234 is 56 lines of usteer.js: hasBandSteeringToggle hoisted to the top of addSsidTab(), the band_steering_threshold dependency restored, local_sta_update moved out of the global Settings tab into the per-SSID tab, and assoc_steering/probe_steering converted from form.Flag to a three-way form.ListValue.

Both fixes from the previous round check out:

  • band_steering_threshold is guarded again (usteer.js:633-634), and hoisting the const above the field cluster removes the temporal-dead-zone problem; the toggle is still declared later in the same section, which is fine since depends() resolves by name at checkDepends() time.
  • The tri-state does what the new comment claims. With o.default = '' and optional, parse() removes the option when the blank choice is picked — so no usteer_ssid section is forced into existence — while '0' is a real write that can override a globally-enabled setting, which the old Flag could not express. And because the choice list contains '', ui.Select reuses that choice's own label instead of prepending a second -- Please choose -- entry, so the dropdown has exactly three items.

i18n: the template really was regenerated against the final file — the three new msgids resolve to usteer.js:615-617/621-623 and the reworded local_sta_update description to usteer.js:594. po/de, po/cs and po/ru are clean mechanical merges (exactly the four msgid additions and one removal, no msgstr touched). po/pl has the same msgid set as the template, 0 fuzzy and 0 untranslated, but also rewrites 10 live translations of msgids this PR leaves alone — inline.

All three FormalityCheck runs are green on 9f1345e.

Commit checks

  • 9f1345e "luci-app-usteer: update translation template and Polish translation" — the message scopes the regeneration to "the string changed by moving local_sta_update to the per-SSID tab", but this is the PR's only i18n commit: the template it produces adds 61 and drops 48 msgids relative to master, and this revision alone contributes three more (On, Off, Use global setting) beyond the local_sta_update rewording. The message also says it "translates the new/reworded Polish strings", while the commit additionally rewrites 10 live po/pl msgstr whose English text this PR does not change (details inline on po/pl/usteer.po:372).
  • 46a98d9 "luci-app-usteer: add per-SSID settings tabs and known-station tracking UI" — the content matches the diff, but the body is written as a changelog against states that will never exist in master: "plus fixes from review: reject:true and ACL grant for delete_known, Delete button hidden for remote-owned entries, band_steering_enabled dependencies guarded against builds lacking the toggle…". This is the commit that introduces delete_known, its ACL entry and those dependencies in the first place, so in git log the sentence reads as if an earlier commit had shipped them broken. Dropping "plus fixes from review:" and stating the behaviour directly keeps the same information without the phantom history.

Generated by Claude Code

Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
Comment thread applications/luci-app-usteer/po/pl/usteer.po
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 9f1345e to aec0084 Compare July 30, 2026 05:28

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 221882f + aec0084, replacing 46a98d9/9f1345e). The delta since 9f1345e is small: the addSsidTab() header comment rewritten, On/Off renamed to Enable/Disable on both tri-states, and the i18n propagation of that one msgid pair.

Both items from the previous round check out:

  • Enable/Disable landed on both assoc_steering and probe_steering (usteer.js:621-622 and [627-628](https://github.com/openwrt/luci/blob/aec00843dde2d08c35e50d3182a24a8924f1fc2d/applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js#L627-L628)),`` the .pot references resolve to exactly those two line pairs, and the Polish Włącz/Wyłącz matches what ~30 other luci apps already carry for these msgids, so nothing new for the translator to decide.
  • The i18n merge is mechanical in every language: po/de, po/cs, po/ru and the rest gain Enable/Disable, drop On/Off, and touch no msgstr. None of the msgids discussed in the previous rounds is rewritten again here, and po/pl has the same 164 live msgids as the template with 0 fuzzy and 0 untranslated.
  • The header-comment correction states the fallback the way you established it in the set_config thread, which makes Use global setting the right label — but the parenthetical it sits under still says the opposite, inline.

All three FormalityCheck runs are green on aec0084. Two nits and one comment-consistency issue inline; nothing blocking.

Commit checks

  • 221882f "luci-app-usteer: add per-SSID settings tabs and known-station tracking UI" — the amend adds a fourth "fix from review" sentence: "Corrected the addSsidTab() header comment, which claimed a blank field falls back to usteer's compiled default unless the SSID's UCI section doesn't exist yet". No commit in master ever contained that comment — this commit is the one that introduces addSsidTab() and its header — so in git log the sentence describes correcting a claim that, from the merged tree's point of view, was never made. Same shape as the "plus fixes from review: reject:true and ACL grant for delete_known …" framing raised last round, which is unchanged. Stating what the comment says (rather than what an intermediate revision said before it) keeps the same information without the phantom history.
  • aec0084 "luci-app-usteer: update translation template and Polish translation" — "Regenerates usteer.pot for the Enable/Disable strings that replaced On/Off" scopes the commit to this revision's delta, but On/Off never reach master either: against a3cc0e1 this commit's template adds 61 msgids and removes 48, of which the Enable/Disable pair is two. A reader of the merged history sees a 61-msgid regeneration explained by a rename that has no visible before-state.

Generated by Claude Code

Comment thread applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js Outdated
Comment thread applications/luci-app-usteer/po/pl/usteer.po Outdated
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from aec0084 to 2f59d60 Compare July 30, 2026 17:14

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 9a58cbc + 2f59d60, replacing 221882f/aec0084). git diff aec0084..2f59d60 is 11 lines: the two addSsidTab() header-comment hunks and the removal of the two obsolete po/pl entries. All three items from the previous round are applied verbatim:

  • The parenthetical now says "no longer exposed in the global Settings tab - each SSID overrides them independently", which matches the tree — the global settings tab at usteer.js:969-1077`` retains only genuinely global options (network, `syslog`, `local_mode`, `ipv6`, `debug_level`, `measurement_report_timeout`, `remote_update_interval`, `remote_node_timeout`, `link_measurement_interval`, `event_log_types`, `known_stations*`, `ssid_list`, `reassociation_delay`), and none of the thirteen moved fields is left behind. The sentence no longer contradicts the fallback description two lines down.
  • The tail paragraph is reflowed to the block's fill.
  • po/pl is back to 48 #~ msgid entries, and the obsolete set is now byte-identical to po/de's, as are the live msgid set and its ordering; the live set still matches po/templates/usteer.pot exactly (166 entries incl. header) across pl/de/cs/ru, with 0 fuzzy in pl. The only po/pl change since aec0084 is those two removals — no msgstr touched.

Both commit messages match their diffs by content and scope (9a58cbc touches only usteer.js + acl.d/luci-app-usteer.json, 2f59d60 only the po files), and the delete_known ACL grant still covers every usteer method the view declares (remote_hosts, remote_info, local_info, get_clients under read.ubus, delete_known under write.ubus). All three FormalityCheck runs are green on 2f59d60.

Commit checks

  • 9a58cbc "luci-app-usteer: add per-SSID settings tabs and known-station tracking UI" — the amend adds a fifth review-changelog sentence ("Corrected the addSsidTab() header comment: a blank field always falls back to …"), which is the same phantom-history shape raised in the last two rounds and still unaddressed: this commit is the one that introduces addSsidTab() and its header, so in the merged history there is no earlier state whose comment was wrong. Not repeating the detail — the correction itself is right, only the "fixes from review / corrected X" framing needs dropping before merge so git log describes the end state rather than the branch's revision history.

Generated by Claude Code

@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 2f59d60 to 3e96166 Compare July 31, 2026 05:44
@grzegorz914

Copy link
Copy Markdown
Author

Fixed in 3e2f5d7: reworded the commit message to describe the final state (per-SSID overrides, known-station tracking, delete_known ACL/reject/notification, Enable/Disable tri-state) instead of narrating the review-round fixes that produced it - dropped the "fixes from review"/"corrected X" framing since this commit is the one that introduces addSsidTab() in the merged history, so there's no earlier state for it to be correcting. Content is identical (git diff 2f59d60..3e96166 is empty), message-only change.

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now 3e2f5d7 + 3e96166, replacing 9a58cbc/2f59d60). The delta is message-only, as described in the PR comment: both revisions point at the same tree (d06d837f46f31ef38a2713ee1d602c3cc6e61adc), git diff 2f59d60..3e96166 is empty, and the i18n commit's message is byte-identical to 2f59d60's — so the only new content is the first commit's rewritten body.

The phantom-history finding raised in the last three rounds is resolved: the "plus fixes from review: …" / "Corrected the addSsidTab() header comment …" changelog framing is gone, and the message now states the end state directly. Everything it asserts holds against the tree — the tri-state is Use global setting/Enable/Disable with default = '' (usteer.js:618-628), the Delete button is gated on the `isLocal` flag ([usteer.js:165-171](https://github.com/openwrt/luci/blob/3e96166549f74c897ebe60a1db2bb5e6ec5e4bbf/applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js#L165-L171)),`` failures go through ui.addNotification() (usteer.js:131-135),`` and "usteer": [ "delete_known" ] is under `write.ubus` in the ACL.

All three FormalityCheck runs are green on 3e96166. One wording gap in the new message below; nothing blocking, and no inline comments this round since the tree is unchanged from the previously reviewed revision.

Commit checks

  • 3e2f5d7 "luci-app-usteer: add per-SSID settings tabs and known-station tracking UI" — the rewritten first paragraph enumerates what moves to the per-SSID tab as "station tracking/policy timeouts, SNR/signal thresholds, roaming, band steering, load kick, and local_sta_update's per-node update interval", but node_up_script is also moved and fits none of those categories: master has it as a global s.taboption('settings', …) at usteer.js:695, and this commit re-creates it as the last field of `addSsidTab()` at [usteer.js:810](https://github.com/openwrt/luci/blob/3e96166549f74c897ebe60a1db2bb5e6ec5e4bbf/applications/luci-app-usteer/htdocs/luci-static/resources/view/usteer/usteer.js#L810).`` It also isn't a "roaming-policy field", which is how the sentence characterises everything in the list. Since the practical effect is that the option disappears from the global Settings tab, it's worth naming explicitly (e.g. "…, load kick, local_sta_update's per-node update interval, and the per-node up script"), so someone bisecting a "where did Node up script go" report finds it in the message.

Generated by Claude Code

@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 3e96166 to 7ba9090 Compare July 31, 2026 17:01
@grzegorz914

Copy link
Copy Markdown
Author

Fixed in 1178df6: the first paragraph now names node_up_script explicitly ("...local_sta_update's per-node update interval) and the per-node up script", instead of folding it into a "roaming-policy fields" list it doesn't belong to. Message-only change, content identical to 3e96166.

…g UI

Adds a per-SSID configuration tab, letting each SSID override the
fields that were previously shared across the whole usteer instance:
roaming-policy (station tracking/policy timeouts, SNR/signal
thresholds, roaming, band steering, load kick, local_sta_update's
per-node update interval) and the per-node up script. A field left
blank on a per-SSID tab falls back to whatever the shared 'usteer'
section has stored for it. assoc_steering and probe_steering use a
three-way Enable/Disable/Use global setting choice (matching
tools/network.js's convention for this kind of tri-state), since a
plain checkbox can't express turning a globally-enabled setting off
for just one SSID. Band steering is disabled by setting its interval
to 0, matching link_measurement_interval's convention - there is no
separate enable/disable toggle for it.

Also adds known-station tracking: a per-node table of stations usteer
has ever seen, with a Delete button shown only for locally-owned
entries (deleting a remote node's synced copy doesn't propagate to
the node that actually owns it) that calls the daemon's delete_known
method over ubus - granted in acl.d/luci-app-usteer.json's write
block, and surfaced through ui.addNotification() on failure.

Signed-off-by: Grzegorz Kaczor <grzegorz914@icloud.com>
Regenerates usteer.pot to drop the Band steering toggle's strings
(reverted along with the field itself) and pick up the restored
"A value of 0 disables band-steering." sentence on the interval
field's description, merges into every language's po file, and
translates the new/reworded Polish strings. Dropped the resulting
pl-only obsolete entries for strings that only ever existed in an
intermediate revision of this series, matching every other language.

Signed-off-by: Grzegorz Kaczor <grzegorz914@icloud.com>
@grzegorz914
grzegorz914 force-pushed the usteer-per-ssid-known-stations branch from 7ba9090 to a5976fb Compare July 31, 2026 17:35

@openwrt-ai openwrt-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the force-pushed series (now b63fae6 + a5976fb, replacing 3e2f5d7/3e96166). The code delta since 3e96166 is 32 lines of usteer.js: the band_steering_enabled Flag, the hasBandSteeringToggle guard and its four depends() sites are all removed, and the interval field's description regains master's "A value of 0 disables band-steering." sentence. The rest is the i18n propagation of that one msgid change plus the two removed msgids.

What checks out:

  • The revert is right against the daemon: openwrt/usteer has no band_steering_enabled anywhere (code search over the repo returns zero hits), and band_steering.c short-circuits on if (!config.band_steering_interval) return;, which is exactly the convention b63fae6's message claims. No leftovers either — hasBandSteeringToggle and band_steering_enabled no longer appear in usteer.js at all.
  • The tri-state claim in b63fae6 holds for the structural pattern: tools/network.js in this branch's tree uses the same '' / '1' / '0' ListValue shape with a blank default choice for pse and pse_podl (tools/network.js:1136-1138).``
  • The i18n merge is mechanical in every language: the only non-reference changes in po/de, po/cs, po/ru and the rest are the reworded interval msgid and the removal of Band steering / This option enables band steering for clients of this SSID; no msgstr is touched. po/pl additionally retranslates the one reworded description and nothing else — none of the "rewritten translations of msgids this PR doesn't change" regressions from the earlier rounds recurs.
  • The template really was regenerated against the final file: all 194 usteer.js:NNN references in po/templates/usteer.pot resolve to a line whose _() call carries that msgid. pl/de/cs/ru each carry 164 live entries matching the template and the same 48 obsolete entries (byte-identical msgid sets), with 0 fuzzy and 0 untranslated in pl.
  • All three FormalityCheck runs are green on a5976fb.

One nit inline; nothing blocking.

Commit checks

  • a5976fb "luci-app-usteer: update translation template and Polish translation" — the message is written against intermediate revisions of this branch rather than against master, the same phantom-history shape that was fixed for the first commit in the last few rounds:

    • "Regenerates usteer.pot to drop the Band steering toggle's strings (reverted along with the field itself)" — neither Band steering nor This option enables band steering for clients of this SSID exists in master's usteer.pot, so nothing is dropped in the merged history; the template goes from 151 to 162 msgids, adding 59 and removing 48.
    • "pick up the restored "A value of 0 disables band-steering." sentence" — master's global field already carries that sentence (usteer.js:677);`` from master's point of view this is the wording of a new per-SSID msgid, not a restoration.
    • "Dropped the resulting pl-only obsolete entries for strings that only ever existed in an intermediate revision of this series, matching every other language" — this one describes zero hunks in the commit. That cleanup happened in an earlier revision (2f59d60); git diff b63fae6..a5976fb -- po/pl/usteer.po removes no #~ line and adds 48 obsolete entries, the same 48 every other language gains. git diff 3e96166..a5976fb touches no #~ line in any file.

    Scoping the message to what the commit does relative to master ("regenerate the template for the per-SSID fields, merge into every language, translate the new Polish strings") would keep it accurate without the branch-revision narration.


Generated by Claude Code

@grzegorz914

Copy link
Copy Markdown
Author

Fixed: bullet updated to describe the current state (interval=0 disables, no separate toggle) instead of the reverted band_steering_enabled toggle.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants