From 9b4114012bcf322a4d180ff52cf19c4957c01fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Fri, 9 Oct 2026 22:58:43 +0300 Subject: [PATCH] v3.23.9 review: the counter-low exemption and the hint cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review fixes for the CAP compatibility test suggestion: - A cntr_low rejection is exempt from both the failure hint and the one-click button: the card never executed the command (the packet's counter was rejected), so the counter box is the actionable path - the v3.6.58 rule that a low counter is never retried. - The INSTALL [for load] advice names the cascade action: the package row's "Delete All" (a plain delete of a package with related objects can be refused), in EN and RU. - The RU LOAD hint quotes the RU button label ("Все 0.0" rather than the English "Set all 0.0"). - Two orphaned LANG_RU entries from the replaced hint strings removed (the i18n test only checks the missing direction, so they survived). Tests: the counter-low exemption, the cascade wording and the button guard pin. 862 frontend + 842 Python; sw cache simple-v422. --- frontend/index.html | 15 +++++++++------ frontend/tests/ram.test.js | 8 ++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 7b8de9a..28a9c81 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -12062,6 +12062,9 @@ function ramStepLine(s, idx, comps, blockSize) { // (capmem memory_json) when the install came from a .cap. function ramInstallFailHint(data, mem) { if (!data || data.success) return ''; + // a low-counter rejection is not a CAP problem: the card never executed + // the command, and the counter box is the actionable path (v3.6.58) + if (spCntrLow(data)) return ''; const steps = data.steps || []; const step = steps[(Number(data.failed_step) || 1) - 1] || null; const name = step ? String(step.name || '') : ''; @@ -12069,7 +12072,7 @@ function ramInstallFailHint(data, mem) { // the card refused to open the load file: usually the package is // already on the card (a duplicate load-file AID from an earlier // run), or it rejected the load parameters - return t('the card refused to open the load file. If this package is already installed (an earlier run), delete it first (Explore \u2192 Delete) and retry; otherwise check the install parameters.'); + return t('the card refused to open the load file. If this package is already installed (an earlier run), delete it first in Explore (\u201cDelete All\u201d on the package row) and retry; otherwise check the install parameters.'); } if (!/^LOAD /.test(name)) return ''; // the LOAD gate: the card verifies the CAP's import list while it reads @@ -12962,7 +12965,9 @@ function ramShowInstallResult(data, okText, capMem) { // a failed LOAD is typically the library gate: offer the one-click // compatibility test with the same CAP (the file input still holds it, // the probe list is prefilled with its imports) - if (!data.success) { + // a low-counter rejection is not a CAP problem - the card never executed + // the command and the counter box below is the actionable path (v3.6.58) + if (!data.success && !spCntrLow(data)) { const fStep = (data.steps || [])[(Number(data.failed_step) || 1) - 1] || null; if (fStep && /^LOAD /.test(String(fStep.name || ''))) { modal += '