Aquí hi ha 177 versions d’Anchors, des de 28 d’agost del 2026 fins a l’actual, 0.1.374. Cadascuna enllaça amb els instal·ladors del mateix desenvolupador.
| Versió | Data | Mida | Fitxers |
|---|---|---|---|
| 0.1.374Darrera versió | 25 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: evidence kept by declaration survives the next change that proves nothing
anchors keep-evidence moved a file's evidence to its current content and moved the node's
revision with it, but left the node's evidence revisions — the content without what proves
nothing, such as the header's date — those of the previous content. The next rebuild compared
the new content's evidence revisions with those, found them changed, and dropped what the
declaration had kept. At MIF, keep-evidence --lines on 781 files whose imports alone had
changed, followed by anchors touch bumping their headers' dates, left 271 of them with no
mutation.
The node now takes the evidence revisions of the content kept. The same holds for the files
check --fix repairs and for the specs anchors migrate rewrites.
keep-evidence also brings back the mutation the map at HEAD holds for a file whose signal
holds none — a coverage run at the new content had started a new signal, and the command
found nothing to carry. A mutation measured again at the new content stays its own. To recover
files that lost their mutation this way, run keep-evidence --lines on them again before the
map is committed: the map at HEAD is where the mutation comes back from.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- a9c9092 fix(keep-evidence): the kept evidence survives a date; a mutation HEAD holds comes back |
| 0.1.373 | 24 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: a package's double is not the project's file of the same name
Reported from MIF: jest.mock('stripe', …) in infra/stripeBalance.test.ts doubles the npm
package stripe, and anchors stamp stamped it against the project's own infra/stripe.ts.
A double's specifier the import resolution does not reach was matched by its tail, and a bare
name of one segment matched any file of that basename in any folder. The test was tied to a
file it never reads, and every edit there would have charged a divergent stamp.
A bare name of one segment that no alias maps (stripe, uuid) is now the project's only as
a file at the root. Everywhere else it is a package's: mock-typed and mock-stamped do not
charge it, anchors stamp does not stamp it, and the map no longer records the test as
doubling the file. A path with folders (src/a), a relative path and an alias resolve as
before.
At MIF's HEAD one more double changes: jest.mock('uuid') in apps/mobile/src/utils/uuid.test.ts
no longer names apps/mobile/src/utils/uuid.ts, so that test's proof reaches the file it tests.
The @contract: stamps written against uuid.ts and infra/stripe.ts for those packages are
no longer asked for, and can be removed.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 9eed79f fix(mock): a package's double is not the project's file that shares its name |
| 0.1.372 | 24 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: pagination-honored reads each function's own text
Reported from MIF (packages/backend/models/adminSources.ts): two sister functions read through
a local readAll that walks every page, each with // @no-paginate: <reason> above its
signature. The first passed and the second stayed accused; only a second mark inside its body
made it pass. Three things were wrong, and all three are fixed:
- The mark above a signature is that function's. A function's body ran to the next
declaration, so the mark above the second function was read as the first one's. The comments
right above a declaration now belong to it, wherever it stands in the module.
- A helper of the module that drains the cursor paginates its callers. A function that
reads through a function the module defines (dialect.definition) whose code walks the
cursor in a loop now passes with no mark. The mark stays for what reads one page on purpose.
- A comment is no code. The gate read loops and cursors in comments too: the Portuguese
do of "o uso do mês" counted as a loop, and functions passed as paginating by accident.
Comments are now blanked before the code is read; the mark, a comment, is still read.
At MIF's HEAD the verdicts of the 109 files with a collection query are unchanged; the marks in
adminSources.ts can now be removed.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 3fafddb ci(release): the Winget submission gets a second attempt a minute later
- 1811254 fix(pagination): a waiver above a signature is its function's; a draining helper paginates |
| 0.1.371 | 24 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióDocs in the project's language, orphan pages removed, and a calmer progress view
The progress shows detail only where something is moving. A settled demand is one that
is all done, or that has none of its tasks started and none in progress.
- progress summary and the monitor print a settled demand as one line, without its
stages.
- progress show, for the whole file, prints a settled demand as its heading only,
without its stages or tasks.
- What keeps everything: progress show <demand> still details that demand, and the
file and --json still keep everything.
docs build removes the pages its templates no longer produce. A page in docs/ whose
generated marker names a template of doct/ that is gone is removed, along with any folder
left empty, and the build lists each removal. This covers renamed templates and deleted
ones.
- A page without the marker is never touched.
- A page listed in docs.keep is never touched either. The list takes globs relative to
docs/, for pages generated once and kept by hand since:
docs:
keep: ["guides/**"]
- --dry-run lists what it would remove and removes nothing.
The layer page's summary note follows the project's language. It used to be in
Portuguese whatever lang: said.
This repository's docs are now in English: architecture.md, behavior.md, rules.md
and layers/gate.md. docs init already scaffolds in the project's language. A project
whose templates predate that can delete them and run docs init again, and the next build
removes the old pages.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 459e6fb feat: docs in the project's language, orphan pages removed, settled demands as one line |
| 0.1.369 | 21 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA cutoff date for legacy code, a result cache for project tools, and a truthful warning
legacy lets a gate be stricter on new code than on old code. A project that tightens a
gate can now leave the code written before a date under the old rule:
- name: mutation-score
severity: {pending: block}
legacy:
before: 2026-10-21
severity: {pending: inform}
- A target whose last commit is older than before, and that has no uncommitted change, uses
legacy.severity.
- A target changed since then uses the gate's own severity: one committed after the cutoff,
one with uncommitted changes, or a new one. Whoever touches legacy code takes on the full
rule.
- Only what the verdict does changes. The legacy findings are still reported, they just do
not block.
- legacy.severity can never be stronger than the gate's own, and a level it leaves out
takes the gate's.
cache keeps a project tool's verdict over the same inputs. It is opt-in for each gate:
- name: eslint
run: "bash scripts/anchors-eslint.sh {{files}}"
cache:
inputs: ["**/eslint.config.*", "pnpm-lock.yaml", "scripts/anchors-eslint.sh"]
- The tool runs again only when something its verdict depends on changed:
- the gate's declaration;
- the content of each target;
- the content of each file the inputs match;
- the version of Anchors.
- A pass is kept. A failure is kept only with failures: true. In a CI the cache is used only
with ci: true.
- A tool that did not get to run is never kept.
- A replayed verdict says it came from the cache, and when it was measured.
- check --no-cache runs every tool.
- The cache lives in .anchors/cache/tools/, outside git.
The "nothing to measure" warning tells the truth in partial checks. In a check --changed, a gate whose requires matched nothing in the changed files was reported as if
nothing in the map matched it. Outside --all, the warning now names only a gate that no
node of the whole map reaches by its on: and tags:.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- b558382 feat(gate): legacy cutoff, opt-in tool result cache, truthful nothing-to-measure warning
- a096e47 test(gate): the tool cache test counts runs in the project, the same under every shell |
| 0.1.368 | 21 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: a handle of values alone is measured through its file's own head
A component can give its handles a head of its own, as the default of the prop that carries
it, and build each handle from values only:
function RolePicker({ testIDPrefix = ':rlpc-role' }) {
return roles.map((r) => <Pressable testID={`${testIDPrefix}-${r.key}`} />)
}
testid-consistent treated ${testIDPrefix}-${r.key} as a handle made of values alone, and
left the spec pending. The head is in the text, though: it is the default the exposed
patterns already read as a prefix (rlpc-role-*). When a file's patterns find a head of its
own, such a handle is now that head's and is measured through it. At MIF, the two pickers
that were pending (RolePicker, SeatTypePicker) now pass.
A handle of values alone in a file that gives no head of its own stays pending, as before.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 150f0e5 fix(gate): a handle of values alone is measured through its file's own head |
| 0.1.367 | 20 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióGates in parallel, a faster map, and late reports stamped as their run found the files
The gates run side by side.
- The gates Anchors answers itself run on every core.
- The project's tools run beside them, a few at a time.
- A tool that writes something another tool reads declares exclusive: true on its gate,
and runs alone after the others.
- Results come back in the order of the gates, as before.
- anchors check --sequential runs one gate after another, to rule the parallel run out
when a result looks wrong.
A parallel run surfaced a race: a gate that loads the configuration rewrote shared values
while other gates read them. Those values are now written only when they change.
The map is faster.
- map build reads and parses the files on every core. On MIF it went from 28 s to 8.6 s,
and the map came out identical.
- check --all no longer walks the whole tree to compute a stale-map list it never prints.
A late report is stamped as its run found the files. A JUnit report ingested by hand
used to be stamped with the tree of the ingestion. A screen that changed after the run
then kept a fresh proof. Now:
- anchors ingest places the run in time:
- --ran-at, a time or the commit the run measured;
- otherwise the report's timestamp;
- otherwise the report file's modification time.
- Each file a proof stands on is compared with its content at the last commit before the
run, using the evidence the map already uses, where comments and the header do not count:
- the test;
- the files the test reaches;
- the specs whose scenarios the test proves.
- A file whose evidence changed since then is stamped changed-after-run, so the proof is
stale and names it.
- --alias OLD=NEW (repeatable) and --alias-file read a code renamed since the run. The
alias applies to the report's cases and paths, and to each file's content at the run's
commit:
- a unit's code renames all of that unit's scenarios;
- a scenario's code renames only that scenario.
A file whose only change is the rename keeps its proof fresh. The signal records ran_at
and remapped.
- A run that anchors test just made is ingested as before.
coverage-delta now tells an earlier 0% apart from no earlier measure. Before, both
were stored as an empty value, so a file whose previous coverage was 0% read as having no
baseline. Now:
- a file measured for the first time is skipped, because there is nothing to compare;
- an earlier measure of 0% is compared like any other, so a rise or a hold passes;
- a file never measured is still pending.
Coverage measured at 0% before this version starts being compared from its next
ingestion.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- a084a44 feat: parallel gates, a map scanned on every core, late reports stamped as their run found them |
| 0.1.366 | 20 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióPerformance: check --all takes half the time on a large project
A check --all on a clone of MIF, with the slow external tools skipped, went from 681 s to
329 s. Every verdict stayed the same: the same counts in all 109 gates, and the same 2675
findings.
Three things were redone over and over:
- A gate's premises. Every run of a gate on a target checked whether the configuration
declares what the gate needs, by converting the whole configuration to YAML and back. This
was 28% of the run. It is now done once per gate in each run.
- The project files. Each gate re-read its target's file, so the same file was read about
50 times. Within a run, a file is now read once, and read again after each tool the project
runs, since a tool may write files.
- The shape of the map in evidence-fresh. The gate rebuilt the map's edges for every
test, three times. It now builds them once per map. Revisions are still read live, because
the watcher updates them in place. The gate went from 65 s to under 3 s.
What remains is mostly the project's own tools. At MIF, eslint alone takes 1m43s.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 611eb5c perf(check): a run asks each premise and reads each file once; evidence indexes the map once |
| 0.1.365 | 20 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFreeze a folder, and leave a frozen part's work out
Freezing an area that is out of scope used to mean freezing it unit by unit. Its gates went
quiet, but its tasks were still handed out, the progress still counted it, and impact
still listed its files as work to redo.
A folder can be frozen. anchors freeze [CODE] --path '<glob>' writes the scope to
anchors.yaml:
frozen_paths:
- freeze: "PLNAP-F01" # the freeze's code, or the reason with no doctrine
paths:
- "apps/mobile/src/features/ir/**"
- The freeze's record stays in the doctrine. The globs only say where it applies.
- The map freezes every file a glob matches, as the file's own header mark would. A unit
whose spec falls in the folder is frozen whole, including tests that live elsewhere.
- A file's own mark wins over the folder's.
- freeze-consistent names a glob that matches no file.
- anchors thaw CODE removes the globs together with the marks. thaw --path '<glob>'
removes one glob, and freeze show lists them.
- The agent hook warns about a new file inside a frozen folder too.
The work of a frozen part is not handed out.
- anchors next leaves a task on a frozen file in the queue, waiting for the thaw. It claims
the next task instead, or, when there is none, says the queue is empty and counts the
tasks waiting.
- The cold start does not seed a frozen plan, and does not count a spec inside a frozen
folder as missing.
- In github mode, the claim runs in the pipeline. A card for a frozen unit is still handed
out there, with the warning.
anchors impact lists frozen parts apart, under their own heading with their freezes,
not among the parts to redo.
The progress leaves a frozen plan out. A demand whose plan is frozen, by its header or
by a frozen folder, leaves the totals of progress summary, the monitor and status, and
its row says it is frozen. The file's own lines are unchanged. A task names no unit, so to
leave out one task of a live plan, use progress cancel with a reason.
The freezes section follows the project's language: ## Congelamentos in a pt-BR
project. A document that already has the section under another language's title keeps it.
Run anchors map build after adding frozen_paths by hand.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 5ed9728 feat(freeze): a folder is frozen by glob, and a frozen part's work is left out |
| 0.1.364 | 20 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFixes: several --junit reports, one flag per module on a line, typeof import is a type
anchors ingest takes several --junit reports. Before, only the last one was ingested,
with no warning. Now each report is ingested in turn as a suite of its own, and the
--lcov and --mutation reports go with the first. A single --suite given with several
reports is refused: one name cannot stand for several suites.
One flag per module on a line. A line can hold two statements of the same module, as in
require('x') as typeof import('x'). The fixer wrote the flag twice
(// @dep: CODE // @dep: CODE). Now:
- the line takes one flag, which answers for both statements;
- dep-declared asks for that one flag, and dep-honored checks it against both statements;
- the flag is @dep[type]: only when every statement on the line is types only, so with the
require it is a value flag;
- a line that imports two different modules still takes a flag for each.
typeof import('x') is types only. The ts family example now reads
typeof import('…') as a statement of its own, ahead of the dynamic import('…') that took
the same path, and its type_import_pattern reads it as types only. The fixer flags it
@dep[type]:, so it no longer counts as a value edge in a test's evidence. A project that
copied the example into its anchors.yaml adds two things by hand:
- the new pattern to dialect.imports, before the require|import( one:
\btypeof\s+import\(\s*['"](?P<path>[^'"]+)['"]\s*\)(?:\.<ident>)?;
- the alternative ^\s*typeof\b| at the start of type_import_pattern.
Then run anchors check --fix.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- ca495a8 fix: several --junit reports, one flag per module on a line, typeof import is a type |
| 0.1.363 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA test's proof stops at its doubles, and a proof tied to no code is pending
A test's evidence stops at the modules it doubles. A test that doubles a module, such as
jest.mock('../client'), never runs that module. Its proof expired anyway whenever that module
changed, or anything behind it, because the closure walked into the real code. The map now
records on each test the files its doubles replace: each specifier that derived.mock_detect
captures, resolved like an import to one file of the project. The closure stops at them,
wherever the walk meets them, not only at the test's own imports. A change to a doubled module
is caught by the double's stamp (mock-stamped). A specifier that names a third party's
package, or several files the test's folder cannot choose between, stops nothing.
A proof tied to no code is pending. evidence-fresh passed a test whose score was measured
against no code at all: its imports carried no @dep, so its closure was empty and no change
could expire it. The gate now answers pending when all of these hold:
- the project's dep-declared confronts tests (on: holds test);
- the test imports code of the project;
- its proof reaches none of that code.
The verdict names the imports, and anchors check --fix writes the flags. An import of types
only, or of a module the test doubles, does not count. A project that keeps dep-declared on
code alone sees no change.
Run anchors map build once to record the doubles.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 928d565 feat(evidence): a test's proof stops at its doubles; a proof tied to no code is pending |
| 0.1.362 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: a derived handle that ends in its segment can be queried
A handle built on the caller's head can end in its own segment, as in ${testId}-spin. It
was written *-spin-*, so a query only counted with a hyphen after the segment. b-spin
was never queried, and testid-consistent failed.
Such a handle is now *-spin: a consumer queries it when the segment comes after a head and
is followed by the end of the id or a hyphen, as in b-spin, ${id}-spin or
b-spin-overlay. b-spinner does not count. A caller's own handle is queried through it
the same way, as in :row-transfer-badge. A segment followed by a value, as in
${id}-row-${i}, stays *-row-*.
Declare a closed handle as written in Test IDs: *-spin.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- c1d2da9 fix(gate): a derived handle that ends in its segment is queried at the id's end |
| 0.1.361 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: a broken anchors.yaml is an error, never an absent one
The commands that read the project's configuration loaded it and ignored the error.
An anchors.yaml that does not load, for example one holding a field this binary does not
know, was treated as if there were no configuration. anchors touch then found no comment
syntax and said every file had no header. It dated nothing and still exited 0. Measured at
MIF, a chain left 16 headers with their old date.
These commands now fail with the load error:
- touch, verify, stamp --refresh, new, deliver, next, progress;
- map nav, guide gates, report, monitor.
A project with no anchors.yaml still runs those that work without one. anchors migrate
is the exception: it has already rewritten files when it reads the configuration, so if it
still does not load it reports so, skips the steps that need it, and asks you to fix it and
run migrate again.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 1858f30 fix(cmd): a broken anchors.yaml is an error, never read as an absent one |
| 0.1.360 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versiódep-honored names a flag whose kind contradicts its import
What reads the map trusts a @dep flag's kind: section-required's depends_on_layer
counts only value dependencies. dep-honored now names two mismatches:
- @dep: on an import of types only. Write @dep[type]:.
- @dep[type]: on an import that runs. Write @dep:.
anchors check --fix already rewrote these flags; until now the gate let them pass.
The ts example's type_import_pattern now also reads braces whose every name is a type,
import { type A, type B as C } from …. If your project declares its own pattern, add the
second branch:
type_import_pattern: '^\s*(?:import|export)\s+type\b|^\s*(?:import|export)\s*\{(?:\s*type\s+[\p{L}_$][\p{L}\p{N}_$]*(?:\s+as\s+[\p{L}_$][\p{L}\p{N}_$]*)?\s*,?)+\s*\}'
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 2813ab9 fix(gate): dep-honored names a flag whose kind contradicts its import |
| 0.1.359 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFixes from a code review: nothing concluded from what was not read
- Project-wide gates check presupposes. A gate of scope: project or batch now checks
its presupposes like any other. With a field undeclared it is pending and names the
field; when the field is waived in dialect.opt_out, it skips.
- An unreadable test or flow leaves testid-consistent pending. When a linked test, a
flow or a neighbour test cannot be read, the gate no longer reports its handles as never
queried. It also no longer passes on the grounds that there is no consumer. It is pending
and names the files. Consumers are read through the run's reader, so check --index reads
them from the git index.
- obligation-honored no longer knows JavaScript identifiers. A token is found at the
edge of an identifier written in letters, digits and _, in any script.
- Generic file names are the project's. dialect.generic_basenames lists the names that
are a role in their folder: a code generated for such a file is made from the folder's
name. Each family's example carries the usual list. A project migrated before this
version has none, so anchors code and anchors new stop treating handler.ts as its
folder until you add:
dialect:
generic_basenames: [handler, index, resource, mod, main, types, route, routes, schema, config]
- The release waits for the CI. The release workflow publishes nothing unless the CI of
the tagged commit passed.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 905c838 fix: project gates presuppose, unread consumers pend, no JS identifier, release waits for CI |
| 0.1.358 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióHandles built on the caller's head: measured, or pending — never green
A component often builds its testID from the id its caller passes in, for example
`${testID}-option-${opt.value}`. The exposed patterns only read a template that
starts with a literal, so such a unit looked like it exposed nothing. testid-consistent
and section-required then passed without measuring anything.
- The suffix group. dialect.test_handles.exposed now accepts a suffix group: the
segment the unit adds to its caller's head. The ts example reads it, so copy this pattern
into your own:
- 'testID[a-z]*\s*[=:]\s*\{?`\$\{[^}]*\}(?P<suffix>[^`$]*)'
- How a derived handle is checked. The handle becomes *-option-*:
- the component's spec declares it as written, in Test IDs;
- a test or flow queries it by naming the segment after a head, such as :pay-option-a;
- the caller's own handle (:pay) counts as queried through a segment that some unit of
the project derives. A segment that no unit derives counts for nothing, so
:pay-other does not query :pay.
- Handles built from values alone. ${prefix}${key} and ${prefix}-${i} leave the
segment naming nothing. The gates report them as pending, with the file and line, and
never pass them. Give the handle a literal segment.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- ac47f57 feat(gate): a handle built on the caller's head is derived; one of values alone is pending |
| 0.1.357 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versiósection-required: a dependency on types only no longer calls for a section
By default, when: {depends_on_layer: [...]} now counts only dependencies on a layer's
values. A component that only imports a layer's types (@dep[type]) receives its data some
other way, so it no longer triggers the requirement. Measured at MIF, this was the case for
22 of 36 charges.
To count type imports too, add kinds:
when: {depends_on_layer: [hook, store], kinds: [value, type]}
The map now records the kind of a depends-on edge: kind: type when the target's types
are its only import. Older binaries ignore the field.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 82e29fa feat(gate): depends_on_layer counts value dependencies; a types-only import asks for kinds |
| 0.1.356 | 19 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: anchors coverage agrees with the scenario-coverage gate
anchors coverage and anchors report now count a spec's requirements the way the
scenario-coverage gate does: only what the spec defines. In particular, they no longer
count as requirements:
- codes the spec only cites, such as handles listed in a Test IDs table;
- rules marked @no-scenario.
Before this fix, the coverage overview could show missing proof that the gate did not
report.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 5ce0f21 fix(coverage): the coverage view counts the requirements scenario-coverage counts |
| 0.1.355 | 18 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióNew: section-required, the spec sections your code calls for
A layer can declare the spec sections its code calls for. Each section comes with a trigger
that Anchors already measures:
layers:
component:
requires_sections:
- section: "Test IDs"
when: {exposes: test_handles} # the code exposes a handle
- section: "Data Contract"
when: {depends_on_layer: [hook, store]} # the code depends on these layers
- section: "Navigation"
when: {flag: "@navigates"} # the code carries the flag
- section: "User Messages"
when: {code_matches: 'showToast\('} # your own pattern
The new gate section-required fails a spec that lacks a section its code triggers. The
message names the section, the file and what triggered it.
A section is found by its heading, at any level and in any case. When the unit has none of
what the section covers, write the section anyway and say so and why.
The gate is blocking by default. While you write the sections over an existing tree, set
blocking: false on the gate, or declare a skip with its reason in the commit message.
New: anchors check --show-skips
Lists every indeterminate result (~), grouped by gate and then by reason, the commonest
reason first. Each reason shows its count and the addresses it covers. Use it to tell "does
not apply" from "should have been measured" without reading the gate's source.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 75d39a2 feat(gate): section-required charges the spec sections a unit's code calls for; check --show-skips |
| 0.1.354 | 17 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: mock-stamped finds the stamps anchors stamp wrote
mock-stamped now ties a stamp to a double through the same resolution anchors stamp
uses: the project's aliases, its extensions, then the tail of the path.
It used to compare path suffixes. A double could stay "without stamp" right after
anchors stamp wrote its stamp, in two cases:
- an alias that maps into another folder, such as @mif/shared/x → packages/shared/src/x.ts;
- a directory resolved to its index.ts.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- 4a9d426 fix(gate): mock-stamped finds a stamp by the file the writer resolved, not by suffix |
| 0.1.353 | 17 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: two monitors of one tree keep separate memories
Each anchors monitor now keeps its state in its own file: .anchors/runs/monitor.<ANCHORS_SESSION>.json.
With no ANCHORS_SESSION, the file is still monitor.json.
Two agents watching the same tree used to share one file. Their monitors overwrote each
other's state ("cannot write its state"). An event one monitor reported was also marked as
seen for the other, so that agent never heard it.
A watcher with a session starts with a fresh memory on its first run of this version. It
then says what is going on, once.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- dd0d490 fix(runs): each watcher keeps a monitor state of its own
- c0c3688 test(runs): watchers save at once, each tick after tick, as their monitors do |
| 0.1.352 | 16 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióFix: mock doubles of another workspace's modules are measured again
v0.1.351 lost doubles whose specifier uses an alias the project declares for a different
workspace. For example, @/lib/x in apps/landing-page, with @/ declared for
apps/mobile/. mock-typed and mock-stamped took them for third-party modules and stopped
measuring them, without saying so.
Now, when the aliased path is not a file of the map, the tail after the alias's prefix is
matched by its suffix.
New: aliases scoped per workspace
dialect.import_resolve.scoped declares aliases that hold only for the importers a glob
matches. Use it for each workspace's own tsconfig paths:
dialect:
import_resolve:
aliases: {"@/": "apps/mobile/"}
scoped:
- files: 'apps/landing-page/**'
aliases: {"@/": "apps/landing-page/src/"}
An importer's scoped aliases win over the global ones for the same prefix.
Everything in the v0.1.351 notes still applies: run anchors migrate once, crossing format 8.
Changelog
- c7c54fa fix(gate): a declared alias that misses the map still names the project's module by its tail |
| 0.1.351 | 16 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióThe core reads no syntax — format 8
Breaking. From this release Anchors knows no language by itself. Comments, a language's
lexicon, test names and the shapes some gates used to recognise are now declared in your
anchors.yaml. A gate whose field is not declared is pending and names the field.
anchors doctor shows the family's example to copy.
The map moves to format 8. A map not migrated is refused, with the message to run
anchors migrate.
Upgrade: run anchors migrate once, then commit
anchors migrate crosses format 8 once. Where your project declared nothing, it writes the
examples this binary used to apply by itself, so your check table does not change:
- dialect.comments — the entries covering the extensions of your map's files;
- your family's lexicon — exported_func, param_name, loop, cursor, http_status,
env_read, definition, handle_patterns, log_patterns, guard_patterns,
signature_end, limits, statement_end, set_promise, set_slice. With no family, only
set_promise and set_slice;
- dialect.tests — the family's, or, inside your own, its pattern (when you declared only the
assertion) and the block shape (block_open, block_close, empty_body);
- derived.route_pattern, when you declare route-exists;
- derived.mock_detect, mock_factory and mock_typed, when you declare mock-typed;
- headless: true on a test layer of YAML files (a runner's flows);
- monitor.runners for the tools your suites run with (jest, vitest, go test, pytest, maestro,
playwright, stryker, gremlins).
It prints each field it writes. Run anchors migrate --dry-run first to see the list.
By hand: what migrate cannot write
anchors migrate prints these as ! by hand:
- An extension no example covers. Its files have no header or flag read until you add a
dialect.comments entry for them.
- A dialect.tests.pattern with no title group. The title is what the pattern captures
now, e.g. \bit\(\s*'(?P<title>[^']*)'. Name one group per quote your language uses:
title, title2…
- env-declared with no family. Before, every family's environment reads were read
together. Declare dialect.env_read for your language.
- A section written in flow style — dialect: {family: go}. Migrate refuses to rewrite it.
Turn it into block style and run again.
Not printed by migrate, but worth checking:
- Test names come from derived.files. A test file is paired with its unit by the part
after {{name}} in a template: {{dir}}/{{name}}.test.{{ext}}, {{dir}}/{{name}}_test.go.
This covers the map's identities, duplicate codes, deliver, watch, work and
check --changed. Declare the template your tests follow if you have none.
- Code extensions come from your code layers. Several gates look for a spec's code file:
rule-implemented, unit-complete, the doctrine gates and plan-seeds-valid. They try the
extensions your code layers' patterns end with (*.go, *.{ts,tsx}).
- marker-parity reads only files whose comments you declare.
- No import fallback. These gates no longer read every import/require line by
themselves: proof-crosses-boundary, test-exercises-unit and test-ref-matches-unit.
With no dialect.imports they are pending. anchors doctor offers the family's example.
- Mock aliases. A double's module now resolves through dialect.import_resolve.aliases.
Doubles of your own modules written with an alias (@backend/x) are now charged by
mock-typed and mock-stamped.
- Stamps over a JSX flag. A line holding only {/* @navigates: … */} is a comment as a
whole now. The old reading left {} in the stamped block. A stamp covering such a module
diverges once: renew it with anchors stamp --refresh <module>.
Also in this release
- anchors init writes the family's lexicon and the comments of the extensions it finds.
- anchors doctor offers:
- the comments of the extensions found without an entry;
- the lexicon fields your declared gates presuppose.
- anchors stamp stamps the real module's exports that a double's call names. It reads no
object literal.
- The tests a pattern lists keep their titles as written: the core re |
| 0.1.350 | 16 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 28f00e9 feat(dialect)!: navigation_call is the project's; dotted import paths resolve |
| 0.1.349 | 16 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d66350d feat(dialect)!: imports and declarations are read by the project's patterns |
| 0.1.348 | 15 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 047417c fix(scan): an identifier the chain reads may hold letters of any script |
| 0.1.347 | 15 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b7878c6 feat(gate)!: test handles are read by the project's patterns — the core reads no syntax |
| 0.1.346 | 15 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 192be3c fix(gate)!: a fallible call propagates when its pattern's propagates group says so
- 8e2306e fix(ingest): a run drops only the external coverage of its own test layer |
| 0.1.345 | 15 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e411c2b fix(ingest): a full run drops only the external proof it measured again |
| 0.1.344 | 15 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1dcdc3b fix(gate)!: a fallible call is named by its pattern's name group — the core reads no syntax
- 969f3b3 fix(gate): a fallible call with a type argument is cited by the name it calls |
| 0.1.343 | 15 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 5909a7b fix(gates,doctor): navigation ends at any heading; a hook with no commit-msg is told
- 1c16524 fix(map): a unit's declared layer tags its spec and feature, so gates scoped by tag find them |
| 0.1.342 | 15 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 578f3a6 feat(guide): anchors guide gates explains the gates — what each measures, if it bars, the way out |
| 0.1.341 | 14 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 53c3b65 fix(map): a proof set aside when a file changes comes back when its content does |
| 0.1.340 | 14 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 2ae16ed fix(code): a suggested code is reserved, across the repository's worktrees |
| 0.1.339 | 14 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e6bafe3 fix(monitor): the heartbeat says the CPUs' use, and HIGH needs them busy, not the load alone |
| 0.1.338 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1fc2b87 fix(monitor): a holder's edits in its worktree are activity, and its quiet tasks go in one line |
| 0.1.337 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 9ef79b6 fix(monitor): a run still going in another worktree keeps its holder active |
| 0.1.336 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 4698cd8 fix(code): a file's own code is taken — --check, code list and suggestions see it |
| 0.1.335 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e6a8970 feat(progress): move takes a task to the stage it arose in, and drop removes an empty stage |
| 0.1.334 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 40551ef feat(progress): rename gives a demand, a stage or a task a new title, keeping its history
- c39d65f feat(progress): unplanned work is recorded where it arises, marked, and the flow says so |
| 0.1.333 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 31d6028 feat(test): a test that ran out of time under load runs once more, and says so |
| 0.1.332 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 7d774f9 fix(monitor): a held task's silence counts activity in every worktree, since the monitor watched |
| 0.1.331 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- bac2051 feat(monitor): a held task with no activity is said, and subagents are runs
- c762144 feat(monitor): the summary goes out when it changes; --level action says only what needs a reaction
- 6023d01 fix(test): an impact path over the command-line ceiling runs in batches |
| 0.1.330 | 13 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 45c6dd4 feat(monitor): the agent copies the progress summary verbatim, total included |
| 0.1.329 | 12 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d859d3d feat(monitor): a line apart asks the agent to show the user the progress summary
- 38e550b fix(check,monitor): Anchors' own files have nothing to confront, and that is no failure |
| 0.1.328 | 12 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1273f88 feat(monitor): says the progress summary with what it says — --summary or monitor.summary
- f410bf8 feat(progress): one anchors.progress.md of weighted demands, written only by anchors progress
- 906633b fix(lock): the release insists when Windows refuses to delete a lock being read |
| 0.1.327 | 12 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 2e5e9fd fix(fix): a file of a declarative layer gets its code and its layer |
| 0.1.326 | 11 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a642bef feat(guidance): the first canonical layer — how the project says it is worked on |
| 0.1.325 | 11 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a01fb06 feat(init): AGENTS.md and CLAUDE.md point to CONTRIBUTING.md, which asks to watch long work |
| 0.1.324 | 11 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 0e74046 feat(hooks,review): hooks speak the project's language; each review item is a finding |
| 0.1.323 | 11 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 6a93121 docs(site): the affected-tests command in the confronting family
- 90167ed feat(chain,test): OCaml modules become edges, and the tests a change can break are listed |
| 0.1.322 | 11 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 2e66950 fix(init,config): a broken anchors.yaml is fixed, ignored folders are no layers, OCaml is read |
| 0.1.321 | 11 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 14ef571 feat(freeze): a frozen part is kept as it is, quiet, and told when touched (FRUNF) |
| 0.1.320 | 10 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 489db79 perf(gate): a check over MIF from 14m29s to 5m01s, with the same verdicts |
| 0.1.319 | 10 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 21daa7c fix(map): a capture test depends on the baselines it compares against, not its neighbours' |
| 0.1.318 | 10 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 3986f07 feat(scan): a line that is only a comment is no evidence |
| 0.1.317 | 9 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 54b26c1 feat(map): a test's evidence follows its asserts, not the wiring that gets it there (EFTAV)
- f8355b1 feat(map): what has no side effect on the tests stales no proof — @navigates and @dep[type]
- b450907 fix(monitor): a report with no test is no result |
| 0.1.316 | 9 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 065df0a fix(monitor): only background commands are the hook's runs, read by their first line |
| 0.1.315 | 9 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 880998c feat(monitor): the heartbeat says the load against the CPUs (load=8.4/10) |
| 0.1.314 | 9 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 6ba19fe feat(install-hooks): --agent --user puts the agent hook in the user's own settings
- 2dd918c fix(monitor): a blocked check records its exit, and the shell around a run is no run |
| 0.1.313 | 9 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- af7a15c feat(monitor): anchors monitor — one line when a long process starts, stalls, dies or ends (PRMNP) |
| 0.1.312 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 3224730 fix(map): refreshing revs after a run carries the evidence a flag-only edit left proven
- cd9cf22 fix(stamp): --refresh takes every file given after it, not only the first |
| 0.1.311 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- f8d353d chore(map): the committed map carries the evidence revisions (EBWIP)
- cf1b687 feat(map): a proof goes stale when what it proves changes, not when the file does (EBWIP) |
| 0.1.310 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 22cf6b2 fix(scan): a bare @dormant keeps the navigation flag, as a plain edge |
| 0.1.309 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 734ec3c feat(gate): a dormant navigation annotates its call and is no edge (NCGNV-B08) |
| 0.1.308 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 45c836a feat(gate): flags, code and features confront their repeats (DPDCD-W03) |
| 0.1.307 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- ccd71a3 feat(gate): a rule of another unit a spec cites lives in the product (DOOSD-D05) |
| 0.1.306 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- ba34e9d feat(map): kinds of dependency — what the code reaches that is no import (DOOSD-W04) |
| 0.1.305 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a12bad8 feat(spec): the spec declares no dependency; migrate takes the tables out (DOOSD-W02, W03) |
| 0.1.304 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 4cf5b62 fix(gate): a test lists in @used-by only when the project puts its tests in the chain |
| 0.1.303 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1601efd feat(gate): a component's navigation counts for the screens that render it (NCGNV-B07)
- dbd289b feat(gate): the dependency chain reaches every artifact that imports (DOOSD-W01)
- d711eae fix(touch): a touch run on its own carries the evidence in the map (HDTHD-B16) |
| 0.1.302 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- ef6132a fix(gate): a stamp reads out a flag in a block comment inside a line (MCSTM-B22) |
| 0.1.301 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 7e84274 fix(gate): the navigation fixer never writes into JSX text; suites run without the hook's repository |
| 0.1.300 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- cf59635 feat(gate): the spec catalogue confronts its repeats (DPDCD-W02)
- c5dddd1 fix(fix): a repair carries only the evidence that held before it (EDSTD-B18) |
| 0.1.299 | 8 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 53ab9a4 feat(gate): each gate confronts the repeats of what it declares; rule codes first (DPDCD-W01)
- 0ac763b fix(gate): a mock stamp reads its module without the chain's flags (MCSTM-B21) |
| 0.1.298 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a1ec29c fix(gate): contract-impact answers a rule where it lives (CTRIM-B06) |
| 0.1.297 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 24125fc fix(new): a rule letter keeps one home in the spec, and no code is defined twice (NWARN-B21) |
| 0.1.296 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 688943a feat(map): a test that asserts a navigation goes stale when its Out row changes (DNDDP-W05) |
| 0.1.295 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d243a63 fix(docs): the navigation page places an edge that lands on the screen's spec
- 604683d test(map): flagged imports feed the capture's closure and the change's impact (VRCPT-B09) |
| 0.1.294 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a75c9de feat(docs): the navigation map and the dependency chain as pages; their guides (DNDDP-W04)
- 1f63b62 fix(gate): a re-export declares what it lists; an inline import brings its member (DCGDP-B06)
- 75ee28a fix(scan): a destructured dynamic import brings the names it destructures |
| 0.1.293 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 7606fa3 feat(gate): the navigation chain — annotated, matches-spec, symmetric, reachable (DNDDP-W03) |
| 0.1.292 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 5287b34 fix(fix): one git snapshot per run of the fixers; the site pages of the chain's gates |
| 0.1.291 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d0b6a23 feat(gate): the dependency chain — dep-declared, dep-honored, used-by-declared (DNDDP-W02) |
| 0.1.290 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- f96b80a feat(map): the code's flags — @dep, @used-by, @navigates — read and mapped (DNDDP-W01) |
| 0.1.289 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b131fea feat(new): the screen preset writes the load states and the load's failure (DFLSR-W04) |
| 0.1.287 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 5dbca21 feat(gate): each fallible call has its handling beside it (DFLSR-W02) |
| 0.1.286 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- fe460aa feat(gate): a retired rule stays as a tombstone; a change's revision answers its impact |
| 0.1.285 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- edf179e feat(gate): a unit that can fail names how — fallible sources (DFLSR-W01) |
| 0.1.284 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d6c7f81 feat(gate): data states as requirements, opt-in; their passing tests are kept |
| 0.1.283 | 7 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b073c32 fix(new): a rule section takes its letter's own title, not the shared one |
| 0.1.282 | 6 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 4532dab fix(gate): a code an open question cites as context does not close it |
| 0.1.281 | 6 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 27c6099 fix(gate): an open decision is no requirement |
| 0.1.280 | 5 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1145440 fix(evidence): keep-evidence brings back the suites a later run did not replace |
| 0.1.279 | 5 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d450817 fix(gate): a @no-vr exempts its own row, not a code its reason mentions |
| 0.1.278 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- f430d06 fix(gate): a mechanical change to a plan asks for no revision |
| 0.1.277 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- f75f7a2 fix(migrate): names a code heads keep following it, and binaries stay untouched |
| 0.1.276 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 0baf8ac fix(migrate): rename a code only where it is cited as one, and fast |
| 0.1.275 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 4ce00ab fix(map): a file's unit is the one it refs, not its own code |
| 0.1.274 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 7ec9af1 fix(migrate): format 7 leaves nothing stale, and old codes stay aliases
- 05a3914 fix(migrate): widened rule codes also follow in files the project does not govern |
| 0.1.273 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 531d1ea feat(migrate): format 7 — every governed file gets a code of its own |
| 0.1.272 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d51c8f7 feat(map): VR evidence follows what changes the look, and a file's own code |
| 0.1.271 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 5e260dc fix(gate): a spec section is found at any heading level |
| 0.1.270 | 4 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a33bacb feat(env): environment variables declared in the spec, confronted with the code, listed in docs |
| 0.1.269 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 27b4558 feat(gate): validations lead to states, errors show messages, messages are captured |
| 0.1.268 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 4e506c2 feat(api): API spec sections, and the project's OpenAPI compiled from them
- 2518239 feat(gate): contract-tested — an API unit is proven against the compiled OpenAPI
- 45e085e feat(gate): the coherence of an API spec, and its error codes in the code
- 7e20b61 feat(testsig): a green capture of a state proves the state |
| 0.1.267 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 3c5db35 fix(mutation): a file that gives no mutant is measured, not pending forever |
| 0.1.266 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 2e8ae7a feat(gate): exempt a state with no visual value with @no-vr: <reason> |
| 0.1.265 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d0b2351 feat(map): a VR test captures its unit, so a screen's change stales its capture |
| 0.1.264 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 6edb40a fix(gate): a VR code carries its state, so scenario-identity reads each state apart |
| 0.1.263 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 500a2bf ci(gates): gofmt is a blocking gate, so the pre-commit catches what the CI did
- ef4513f feat(gate): the four questions of visual regression, one VR scenario per state
- 3719736 feat(gate): vr-states-covered — every state of a screen or component has visual regression |
| 0.1.262 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d3af065 fix(check): a gate the run leaves out is still declared in the catalog line
- 5c1e869 fix(check): suggest only the catalog gates that would measure here |
| 0.1.261 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- ce40b7c feat(report-bug): agents report bugs in Anchors itself to co2-lab/anchors
- bf9c985 feat: issue forms for bugs and features, and --upstream writes the bug form |
| 0.1.260 | 3 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 865e74f fix(mutation): a file where no mutant ran has no score, and the gate does not apply
- c207dd5 fix(sitecli): a re-run leaves the command pages as they are |
| 0.1.259 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b3eb52e ci(site): deploy to the production branch, main
- da25aa5 docs(site): one page per command and per gate, generated from the code
- 1f6ca7a feat(escalate): --upstream reports a bug in Anchors itself to co2-lab/anchors
- 2a4d937 fix(daemon): on Windows, an exited process is not alive
- 70bd10d fix(map): a later release restamps the map, so the stale-binary warning clears |
| 0.1.258 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 5641b10 docs(site): the unit, review, the header everywhere, init without presets
- 4754860 feat(gate)!: every governed file carries the header, and --fix writes it from the map |
| 0.1.257 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 7e6a698 feat(init): seed what relates to the layers; doctor and check name the rest of the catalog
- fc2eb38 fix(gate): a -- header, a YAML comment that is no heading, a rule charged once |
| 0.1.256 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 6eef3e2 feat(gate): review — a gate's targets marked for a second look, apart from its verdict
- a801ebe fix: the ref-resolves message names header-valid; test repos run no detached gc |
| 0.1.255 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 2e0543f fix(gate): manual gates stay manual, and a gate says the field it presupposes |
| 0.1.254 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1ec76dc refactor(gates)!: the gate steps are Go, not shell — and init says to do the same |
| 0.1.253 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 7397849 fix(gate): a test's fake is not a copy, coverage floors per gate, Go JUnit finds its file |
| 0.1.252 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 59f7af4 fix(docs): rules in every form, sections in any language, pages in the project's |
| 0.1.251 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a48e14d fix(dialect): the go family sees an error in a field and a sentinel error |
| 0.1.250 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 10ecaf2 feat(gate)!: the triad is the unit — triad-complete becomes unit-complete |
| 0.1.249 | 2 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 18c139c feat(init)!: read the project's folders and language, propose no structure, seed CONTRIBUTING.md |
| 0.1.248 | 1 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 3e49e7c feat(config): a project-wide severity, the default of its blocking gates |
| 0.1.247 | 1 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 8ccac11 fix(gate)!: with no severity, a blocking gate blocks only its failures
- 94d4e41 fix(gate): an open decision informs by default, as any divergence |
| 0.1.246 | 1 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- afd955f fix(coverage): a suite that ran none of a file leaves its coverage |
| 0.1.245 | 1 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 2f3ccab feat(gate)!: each verdict level takes a state — block, inform or ignore |
| 0.1.244 | 30 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b50c93c fix(coverage)!: a rule is proven only when each of its variants is |
| 0.1.243 | 30 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 8a6ce4d fix(cli): every command that takes files reads a list the same way |
| 0.1.242 | 30 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 8c39f35 docs(guide): a spec is written in four passes, and reviewed
- 72d3c5a feat(verify): the pre-commit compiles and stages the docs |
| 0.1.241 | 30 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b7be4e7 fix: an it.each table closes into its test, and every named file is answered |
| 0.1.240 | 30 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- bbd14c7 fix(test): the selection reads the map as a build would leave it now |
| 0.1.239 | 30 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 065dcc1 fix(touch): named files narrow the touch to them |
| 0.1.238 | 30 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 71f3ca7 fix(gate)!: remove workdir: index and the copy of the index |
| 0.1.237 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- add9b1f fix(gate): under --index the tests are listed from the commit |
| 0.1.236 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- da64771 feat(gate): a run: gate can run in a copy of the index |
| 0.1.235 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 55b1427 fix(scan): the index reader confronts the tree at each read |
| 0.1.234 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 157ea1e fix(gate): the index copy is passed with forward slashes
- 142490a fix(gate): under --index a command gate reads the commit's content too |
| 0.1.233 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 3a5ca35 fix(check): a commit is judged with its own map, and a file not in it is not judged |
| 0.1.232 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 0e1715e ci: macOS and Windows block, now that they pass
- 6606708 ci: test on macOS and Windows, informational until clean
- 48d1a19 fix(new): the spec an identity is read from is named with /
- 6af43d2 fix: Windows paths, a crashed map writer, and the budget's process tree
- fcb721d fix: on Windows, a lock being released is busy, and init does not wait on a console
- f9429fc fix: paths keep / on Windows where the map and the reader expect it
- 632d4ca fix: run on Windows and with only git and gh installed |
| 0.1.231 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 9f0e784 feat(stamp): handed a test, the refresh names the modules to refresh
- 59dc617 fix(hook): the commit's map keeps what HEAD proved, and the tree keeps its own |
| 0.1.230 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 7ce19fc fix(evidence): a kept declaration is not a measurement, and the hook dates by the index |
| 0.1.229 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 34f00f5 fix(check): a commit is judged by what it records, not by the tree
- cdb65bf style: gofmt the index reader and the verify args |
| 0.1.228 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 2ad73cb feat(quality): keep-evidence — a change that proves nothing new keeps what was proven
- 159db15 fix(scan)!: the header is the block at the top of the file |
| 0.1.227 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 0680c99 feat(gate): header-layer-declared — a header's layer is one the Estrutura has |
| 0.1.226 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- bd66d2d fix(docs): only a layer that runs code is out of every container |
| 0.1.225 | 29 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 993276d fix(docs): a container's layer with no spec is said, not an error |
| 0.1.224 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 03f2475 feat(gate): branches no test takes, and Examples rows no test runs |
| 0.1.223 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 4f04e7b feat(gate): a test asserts, and reaches the unit it says it tests |
| 0.1.221 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 95e62db feat(gate): contract-impact — a changed field names the rules that use it, and their tests run |
| 0.1.220 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 04136c4 feat(gate): rule uses reach the code, and presentation validations are confronted |
| 0.1.219 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1afd89f feat(gate): every test citing a code, copied scenario bodies, one test file per unit
- db79b37 fix(mutation): a run measures only what the gate confronts |
| 0.1.218 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b91517e feat(map): a new file enters the map at once, reading only its unit
- 95cb2d3 fix(map): the edges are in a total order |
| 0.1.217 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e3ced99 feat(spec): tie each rule to what it uses — Validations, Presentation validations, Rule uses |
| 0.1.216 | 28 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 43117e2 feat(vocabulary)!: the letters of plans, flows and actions in English, by migration
- d4f0336 fix(new): the plan template follows the project's language, with its own title
- 0086909 fix(plan): a phase's dependency is read in any supported language |
| 0.1.215 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e38834c chore(map): rebuild after the hook dated the staged specs
- cb0a68b fix(map): each command applies only its change, to the map re-read under a lock |
| 0.1.214 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- cb0e5e9 fix(changelog): a Bug block followed by a Co-Authored-By block is still the footer |
| 0.1.213 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e0ff969 ci(site): build the site on Node 22 — Astro refuses Node 20
- e7a661e fix(ingest): a run's proofs are stamped with the tree's revs, not the map's
- 3c48022 fix(mutation): a mutation result keeps its own rev; coverage no longer makes it current
- 203c2d1 fix(suite): a report stamped by a coarse clock just before the run is this run's |
| 0.1.212 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- efb9c77 feat(changelog): anchors changelog builds the technical changelog from the commits |
| 0.1.211 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 45bc75a feat: a fix is its own commit, and a bug — a defect that shipped — carries a Bug: footer
- 98fe1e9 fix(dialect): the TS family recognises catch { without a binding |
| 0.1.210 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 85a1ab5 chore(mutation): measure the budget and selection files; the coefficient can be raised
- 22b8526 feat(gate): a test of a declarative unit is not charged a feature |
| 0.1.209 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 690c6a2 chore(mutation): ingest the re-measurement of the six changed packages
- 624ffd6 fix(budget): a cut batch gets a TERM and a grace before the KILL |
| 0.1.208 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 6686717 fix(suite): a suite declares its files with paths:, and is handed no other |
| 0.1.207 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- dea2481 feat: runs take only what is stale and below the minimum, with flags to take the rest |
| 0.1.206 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e1cb635 feat(gate): distrust mutation scores measured under load; declare targets with nothing to measure
- 4eb9c18 feat: record each file's run time, and run fastest first within a --budget
- 287732a fix(mutation): a mutant that times out on a slow rebuild is not a killed mutant |
| 0.1.205 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- b115b9c chore(gates): drop plan-doctrine-exists, and put the docs-covered comment back on its gate
- 3d06583 chore(gates): header-valid blocks, and its comment says what it measures now
- 736bc4f chore(gates): promote the six clean informative gates to blocking
- 4dfbb03 chore(mutation): measure every package, not only internal/gate
- cd1ab42 docs(spec): test-level-codes closes its open decisions with none
- 8bace69 feat(gate): no-duplication reads jscpd's report and judges each file
- 570ba3a feat(init): header-valid joins the canonical catalog, on specs and features
- 4e7f36d feat: the project says how its tests are written, and which test files are support
- 34a7a85 fix(gate): a file the tests source lists no test in is read as without a source
- 14c34c9 refactor: calibrate jscpd for this repository and remove its two real duplications |
| 0.1.204 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a3845c8 feat(gate): test-level-codes — each test level accepts only the codes it declares |
| 0.1.203 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- a6c9975 fix(identity): a rule's VR baseline is read by its unit code |
| 0.1.202 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- c37ef9d chore(map): the mutation signal after the surviving mutants were killed
- e81a9ec fix(failure): the failure gates read Go as written; specs say why each failure is absorbed
- 006a857 fix: the ~95 bugs the triad specs surfaced
- b972679 test(gate): kill the surviving mutants of four gates, and fix route-declared's section reader |
| 0.1.201 | 27 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 1dfdf7a feat(spec): every code file of Anchors under a triad |
| 0.1.200 | 26 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 935fe43 build(test): the unit suite also reports line coverage
- 1dadef4 fix(gate): close the last failure-declared findings, and the minor bugs of the review |
| 0.1.199 | 26 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- c59e596 feat(spec): rule aliases, and real failure rules for the gates
- f267b45 fix(gate): nine gates that answered for what they never read |
| 0.1.198 | 26 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- d02a15c feat(gate): close the two open decisions; docs-fresh no longer trips on the header date |
| 0.1.197 | 26 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- 543d029 fix(check): clear the check --all failures, and promote the gates to blocking
- 129c550 fix(gate): resolve feature-test-match divergences and catalog failure rules
- 4257651 fix(ingest): a full run drops the proof that reports from outside the repo left
- 70e7dd3 fix(review): address third review points across specs, tests, and map |
| 0.1.196 | 26 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióChangelog
- e9cf61b fix(ingest): a partial test run keeps the proof of what it did not run
- 58cdc1e fix(touch): only the header at the top of the file is dated |
| 0.1.2 | 28 d’agost del 2026 | — | 64 bits ZIPARM64 ZIP |