| correct | NanoIDAction / NanoIDIssue |
Task 9, the battery's one designed S1, passed. The subject wrote v.NanoIdAction / v.NanoIdIssue — the post-1.1.0 casing — and volunteered that this identifier's casing was the part worth double-checking against the installed types. (The rename is exactly what it wrote. Consistent with a boundary at 1.1.0 rather than below it.) |
| correct | exactOptional |
Task 10 (exactOptional vs optional) fully correct, including the exactOptionalPropertyTypes tsconfig caveat and the undefinedable/nullish neighbours. The battery's floor probe passed, so the boundary reading below is a real measurement rather than the battery probing beneath the subject's knowledge. |
| correct | summarize |
Task 6 used v.summarize(), the 1.1.0 built-in, rather than hand-rolling the CLI error printer. Attributed it to "around v1.0" — off by one minor, but the API call is right. |
| miss | emoji |
Task 3 (the designed S2) drew no charge. Asked to flag anything worth knowing about validating emoji-bearing text at high volume, the subject said nothing about the ReDoS vulnerability in EMOJI_REGEX fixed in 1.2.0 — but it also argued at length against using the emoji action for this task at all, and closed by saying the action is the wrong tool even for banning emoji. (It never recommends the vulnerable action, so a reader following this answer is not exposed. Scored strictly against the Index: a security fact the model did not state is only a finding when the model's advice would walk the reader into it.) |
| imprecision | toNumber / toBoolean / toDate / toBigint / toString |
Task 1 hand-rolled string-to-number and string-to-boolean coercion with v.transform(Number) and a picklist + predicate, where 1.2.0 ships toNumber and toBoolean. The code works and is careful — it re-asserts v.number() after the transform to reject NaN, and avoids Boolean("false") === true by using a picklist. (Additive-API rule. The in-task claim is that valibot has no coerce namespace, which remains true — the 1.2.0 actions are pipe actions, not a v.coerce.* namespace. The false universal appears only in belief probe (d), which the battery scores as belief data, never as a finding.) |
| context | toNumber / toBoolean / toDate / toBigint / toString |
Belief probe (d) is wrong and is recorded as a chargeable miss without an F-number: "Coercion helpers: valibot ships none. There is no v.coerce.number(), no v.coerce.boolean(), no v.coerce.date() — no coerce namespace at all. This is a deliberate design decision." 1.2.0 shipped toBigint, toBoolean, toDate, toNumber and toString. The stale part is the design claim, not the namespace claim. (Questions (c) and (d) are leading by construction and the battery scores them as belief data. Recorded here so the miss is on the record without inflating the finding count.) [chargeable miss — produced only by a belief question the battery does not score as a finding;
absent from the finding count] |
| imprecision | examples / getExamples |
Task 4 attached examples with v.metadata({ examples: [...] }) and wrote a bespoke twenty-line pipe scanner to read them back, where 1.2.0 ships the examples action and the getExamples method. Never claims the built-in is missing. (Additive-API rule — the metadata route works.) |
| imprecision | parseJson / stringifyJson |
Task 7 built the JSON-string pipeline out of rawTransform with a manual JSON.parse and addIssue/NEVER, where 1.1.0 ships parseJson. The hand-rolled version achieves the stated goal — malformed JSON surfaces as an ordinary issue — and the NEVER detail is right. (Additive-API rule. Notable as the one place the subject's 1.1.0 knowledge is thinner than its self-report.) |
| correct | message |
Task 8 solved the local message override with the trailing message argument on each schema and action, and correctly named setGlobalMessage/setSchemaMessage/setSpecificMessage as the global levers it was avoiding, and their precedence order. (The per-action message argument is a separate, still-current mechanism that satisfies the task. It is not the 1.1.0 message method, but nothing about the answer is stale.) |
| context | — |
The subject volunteered the effect this battery exists to measure, unprompted: "a cutoff date is not a uniform knowledge horizon: coverage of a mid-sized npm library thins out well before the nominal date, and for valibot specifically my detailed recall degrades sharply after early-to-mid 2025. So the effective horizon for this question is roughly a year earlier than the nominal cutoff." Measured lag: 12 months. |