Follow-up from #6199 / PR #6501, filed by the services seat (session session_01USNUyHEr7uaU6MoEWXitei). The gate is correct and landed; this card is about the one real declaration it now binds.
Situation
packages/services/service-settings/src/manifests/ai.manifest.ts declares on temperature: min: 0, max: 2, step: 0.1. Before PR #6501 the step key was decorative (zero read points anywhere in this repo or objectui — measured in that PR). Now it binds: PUT /api/settings/ai with temperature: 0.15 is rejected with invalid_value (constraint: { step: 0.1, min: 0 }), and OS_AI_TEMPERATURE=0.15 is ignored with a loud error.
That consequence was accepted at ruling time (declared = enforced; the dev deliberately did not touch the manifest to dodge it — see the "known consequence" section of PR #6501). What was never decided — because until enforcement existed nobody had to have an opinion — is whether the declaration says what the manifest owner means.
The question
Is step: 0.1 on temperature a legality claim (only 21 values between 0 and 2 are valid) or a slider increment that got written into a slot that now has teeth?
Evidence pointing at "slider increment, not legality claim":
Options
- A — keep
step: 0.1. The declaration binds as written; an admin who wants 0.15 is asking for a finer grid, which is a manifest change when that need is real.
- B — drop
step from temperature (or declare step: 0.01), keeping min: 0, max: 2. The gate then enforces exactly what is meant and 0.15 stays legal.
The #6199 dev's recommendation was B (drop or refine), explicitly deferred out of that PR's scope. Either way the change is one manifest line plus a test adjustment (settings-service.test.ts pins the current 0.1-grid consequence on the real ai manifest — the pin would move with the declaration, not be deleted).
Refs: #6199, PR #6501, #5932 / PR #6201 (the family ruling that declared bounds bind), #6514 (the data-field step twin, separate schema/validator).
Follow-up from #6199 / PR #6501, filed by the services seat (session
session_01USNUyHEr7uaU6MoEWXitei). The gate is correct and landed; this card is about the one real declaration it now binds.Situation
packages/services/service-settings/src/manifests/ai.manifest.tsdeclares ontemperature:min: 0, max: 2, step: 0.1. Before PR #6501 thestepkey was decorative (zero read points anywhere in this repo orobjectui— measured in that PR). Now it binds:PUT /api/settings/aiwithtemperature: 0.15is rejected withinvalid_value(constraint: { step: 0.1, min: 0 }), andOS_AI_TEMPERATURE=0.15is ignored with a loud error.That consequence was accepted at ruling time (declared = enforced; the dev deliberately did not touch the manifest to dodge it — see the "known consequence" section of PR #6501). What was never decided — because until enforcement existed nobody had to have an opinion — is whether the declaration says what the manifest owner means.
The question
Is
step: 0.1ontemperaturea legality claim (only 21 values between 0 and 2 are valid) or a slider increment that got written into a slot that now has teeth?Evidence pointing at "slider increment, not legality claim":
0.15is a legitimate sampling temperature for every provider behind this setting; no provider constrains temperature to a 0.1 grid.stepexists (measured in PR fix(service-settings): enforce the declaredstepgrid on the settings write path and the env path (#6199) #6501: nothing in this repo orobjectuireads it), so the declared grid currently serves no rendering purpose either — its only observable effect is rejecting values like0.15.Options
step: 0.1. The declaration binds as written; an admin who wants0.15is asking for a finer grid, which is a manifest change when that need is real.stepfromtemperature(or declarestep: 0.01), keepingmin: 0, max: 2. The gate then enforces exactly what is meant and0.15stays legal.The #6199 dev's recommendation was B (drop or refine), explicitly deferred out of that PR's scope. Either way the change is one manifest line plus a test adjustment (
settings-service.test.tspins the current 0.1-grid consequence on the real ai manifest — the pin would move with the declaration, not be deleted).Refs: #6199, PR #6501, #5932 / PR #6201 (the family ruling that declared bounds bind), #6514 (the data-field
steptwin, separate schema/validator).