A page that could not save, and said nothing
The model page has been unable to save anything below the reasoning efforts since 1.3.0. "Save changes" did nothing at all, so the description, the system prompt, every capability and tool switch and the whole availability card silently would not take -- while the fields above it saved normally, which is what made the page look as though it worked. "Detect from the endpoint" had stopped detecting too: it submitted the page as an ordinary save carrying only the top half of the form, so every field below took its empty default. Pressing it would have cleared that model's description and system prompt and switched the model off with all of its tools disabled. One HTML rule causes both. A form inside another form is not allowed, and rather than complaining a browser discards the inner start tag and lets the matching end tag close the *outer* form -- so from that point down the page was in no form, and a button in no form does nothing. The detect form is now declared before the main one and the button reaches it by id. Nothing in the markup reads wrong, and no test that posts to a route can see this, because such a test supplies the fields itself. tests/test_form_structure.py reads every template the way a browser parses it instead, including that rule, and was checked against the old markup before being trusted: it reports the same orphaned "Save changes" that headless Chromium did. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -69,6 +69,12 @@
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{# Empty, hidden, and outside every other form: the Detect button further down
|
||||
is associated with it by `form="detect-efforts"`. It carries no fields on
|
||||
purpose — detection asks the endpoint and needs nothing from this page. #}
|
||||
<form id="detect-efforts" method="post"
|
||||
action="/admin/models/{{ model.id }}/detect-efforts" hidden></form>
|
||||
|
||||
<form method="post" action="/admin/models/{{ model.id }}">
|
||||
<section class="card">
|
||||
<h2 class="card__title">Presentation</h2>
|
||||
@@ -132,13 +138,28 @@
|
||||
pretending the model accepts nothing.
|
||||
|
||||
Its own form, because this page's main form is a PUT of everything and
|
||||
a detect must not carry half-edited fields with it.
|
||||
a detect must not carry half-edited fields with it — and that form is
|
||||
declared before the main one rather than here, with this button reaching
|
||||
it by id.
|
||||
|
||||
🚨 It was written inline here, nested inside the main form, which HTML
|
||||
does not allow. Nothing complains: the parser *drops* the inner `form`
|
||||
start tag and then lets the matching end tag close the outer one — so
|
||||
from this point down the page was in no form at all. "Save changes"
|
||||
submitted nothing; the description, the system prompt, every capability
|
||||
and the whole availability card could not be saved. And this button
|
||||
submitted the main form's surviving half to the *save* route, where every
|
||||
field it did not carry took its default: description cleared, system
|
||||
prompt cleared, and the model disabled with all of its tools off.
|
||||
|
||||
Shipped in 1.3.0 and found in 1.3.2 by asking a browser which form each
|
||||
control belonged to, which is the only thing that finds it — the markup
|
||||
reads correctly, and a test posting to the route bypasses the parser
|
||||
entirely. `tests/test_form_structure.py` is the guard.
|
||||
#}
|
||||
<form method="post" action="/admin/models/{{ model.id }}/detect-efforts">
|
||||
<button class="btn btn--sm" type="submit">
|
||||
{{ icon('search', 'icon--sm') }} Detect from the endpoint
|
||||
</button>
|
||||
</form>
|
||||
<button class="btn btn--sm" type="submit" form="detect-efforts">
|
||||
{{ icon('search', 'icon--sm') }} Detect from the endpoint
|
||||
</button>
|
||||
|
||||
<p class="field__hint">
|
||||
The vocabulary is <strong>not the same for every model</strong>, and
|
||||
|
||||
Reference in New Issue
Block a user