Repository navigation
0.4.0 was staged and never released, except for the CLI. This is what an
adversarial pass over it found, and the first item is why the release was pulled.
Fixed
-
jev_askreturned invalid output on every call, in every real host. The
host validates a tool's return value against the schema that tool declares, on
the ordinary dispatch path, and rejects an undeclared key.JevServicestamps
egressonto every result,renderResultforwards it, andask.tsreturns
renderResult(...)verbatim — whileask.ts's output schema declared neither
truncatednoregress.rank.tsandcheck.tsdeclared both. So every call
came back astool "jev_ask" returned invalid output: "value.egress" is not a declared property (additionalProperties: false).This was already broken in the published 0.3.1. The schema and the core's
stamping are byte-identical atfc8f016; only the tool that returns the core's
rendered payload directly was affected, which is whyjev_rankandjev_check
kept working. A thousand lines of tests never saw it because they drive
definition.execute(...)— one level below the validator the registry runs on
every top-level call.test/tools.test.tsnow asserts each tool's payload
against its own declared schema. -
The question map's redaction leaked secrets nested inside a question. The
fix that stoppedcredential_exposurebeing replaced by"[redacted]"disabled
the key rules for the entire question subtree, so a secret named by its key
inside a question stopped being redacted at all:noul({ password: '…' })
reached the provider verbatim andredactionswas0. Now only the map's
top-level ids are exempt — they key the answers and are protocol
identifiers — while each question's value is redacted with the full rules. -
The shape guard did not fire for every reshape. A redactor returning a
number or a boolean produced no error at all, becauseObject.entries(7)is
[];nullproduced aTypeErrorrather thanEgressShapeError. The guard
now requires a non-null, non-array object whose id set is exactly the declared
one. -
recent()'s freeze was shallow, so the record could be rewritten.
recent()[0].redactionRules.push('FORGED')succeeded and changed what
stats().lastCallreported: the record object was frozen, its array was not,
and it was the array the service kept. This package describes the call history
as the honest record of what happened, and a record a caller can edit is not
that. -
An open breaker still charged the call budget.
budget.reserve()ran before
breaker.assert(), so a provider that had been failing burned the budget on
calls that were never made — measured at three of three consumed with zero
transmissions. The breaker is consulted first. -
A cache failure could be recorded as a provider failure, turning a storage
bug into an unhealthy endpoint and incrementingfailuresfor a call whose
provider answered correctly. A cache hit also droppedwarning, so a
synthetic answer came back from the cache looking like a real one. -
The safety and context gates dropped the egress facts, the same defect class
fixed in the MCP and DSH adapters earlier in this release: they rebuild a
JevResultfield by field, and the rebuilt value losttruncatedandegress. -
The published CLI answered
--versionwith the wrong version.
jevcore-cli@0.4.0reported0.3.1, because the constant was kept in step with
package.jsonby hand and the hand slipped during the bump. It is read from the
manifest at run time now, so there is no second copy to forget. -
The GitHub Action's output heredocs were not delimiter-safe. A stdout line
readingJEV_RESULT_EOFclosed the heredoc early and every line after it was
parsed by the runner as a further$GITHUB_OUTPUTcommand — an output whose
name came from the document. The delimiters are generated per run. Separately, a
newline in thecommandinput forged a second::error::annotation line;
newlines are stripped from any value before it reaches a workflow command. -
scripts/check-workflow-shell.mjsboth missed violations and invented them.
It did not seerun: |2-, a plain scalar whose value continues on the next
line, orrunwritten inside a flow mapping — and it reported backticks inside
quoted-heredoc bodies and single-quoted strings, where bash expands nothing at
all. A guard that is wrong in both directions teaches people to ignore it.
Changed
- The release path records why
0.4.0is not a version to install.
jevcore-cli@0.4.0is live and cannot be installed: its name was new, a first
publish of a package name cannot be staged, and it pinnedjevcore@0.4.0
exactly — a version that never left staging.latestmoves to 0.4.1, which
resolves.