Repository navigation
Releases: X-T-E-R/assay
Release list
Assay 0.14.0
Assay 0.14.0
Assay 0.14.0 removes the immutability ceremony from the evidence loop, gives
every Source one home reachable from any workspace, prunes Source adoption to a
traceability record, and teaches the CLI to explain its own semantics. The
workspace envelope is 0.14.0+s4+l8: it breaks record formats on purpose, and
assay update migrates a 0.13.0 workspace in place; there are no compatibility
shims behind it.
This note covers the full change set since v0.13.0.
Breaking
- The workspace envelope is now
0.14.0+s4+l8. A0.13.0+s4+l8workspace is
refused by every command exceptassay update, which migrates it and says what
it rewrote. Anything older still requires the external cutover tool. The refusal
for a migratable workspace now namesassay updateand carries an
assay-update:<observed>-><required>locator instead of the cutover locator. source add --mode living|frozenandsource add --capture checkout|archive
are gone, along with theliving,frozen, andarchiveconcepts. A source's
shape follows the material: a Git repository or URL is checkout-backed, and
anything else is copied once intocontent/. Scripts passing either flag will
fail on an unknown option.source.yamlreplacesmodeanddefault_capture_modewith a single
content_modeofcheckoutorcopy. Both retired fields are rejected on read.- Source observations are now cheap append records:
{observation_id, observed_on, lineage_id, source_path, previous_observation, kind, change_class, note, advisories}plusvcsfor a Git source andcapturefor an observation that
preserved bytes. Thefingerprint,manifest,capture_mode,materials_path,
checkout_path, andcapture_pathfields are gone, and a record still carrying
them is rejected on read. No default path computes asha256-treeany more. - Per-observation manifests under
sources/<alias>/manifests/are no longer
written or read. A capture keeps its integrity manifest beside its bytes, at
captures/<id>/manifest.json. source syncandsource switchapply only to checkout-backed sources. Calling
either on copied content is a teaching error that namessource importand
source captureinstead.syncandswitchno longer refuse a dirty checkout, an unrecorded local
commit, or checkout bytes that differ from the last observation. They proceed and
record anobserved with local modificationsadvisory on the observation. Refresh
is non-destructive:git fetchplusmerge --ff-only, neverreset --hardor
clean -fd. An upstream that cannot fast-forward is recorded and left alone.
Byte-loss protection is delegated to Git, which already declines to overwrite
uncommitted work.SourceObservationResolutionreturnscontentMode,contentPath, and
capturePathin place ofmanifestFile,materialsPathas observation state,
andcheckoutPath.SourceStatusEntryreturnscontentMode,latestAdvisories, andcapturesin
place ofmodeandcaptureMode.assay statuscounts sources ascheckouts
andcopiesrather thanlivingandfrozen.assay source addno longer prints aManifest:line; it printsCheckout:or
Content:depending on the content mode.- The
frozensource alias is no longer reserved, since there is nosources/frozen
namespace to protect. - The Source adoption command surface is
take,list,show,remove. The
register,update,status,inspect,evidence add,verify,decide,
history, androllback recordsubcommands are gone, along with the whole
inspection, evidence, decision, and rollback workflow behind them: its storage,
its schemas, theSOURCE_ADOPTION_POLICY_BLOCKED,SOURCE_ADOPTION_STALE, and
SOURCE_ADOPTION_BUSYerror codes, and its tests. A single-user workbench
records decisions inanalysis close --exitand in the adoption's note; the
adoption record's job is traceability — where did this material land — not an
approval pipeline. - A Source adoption is now one mapping: source alias and path, target system and
path, an optional note, an optional tier-1 identity pin, andmode. An intent
that moved several paths is several records. Theassay.source-adoption/v1
schema replaces theassay.source-adoption-definition/v1,
-state/v1,-inspection/v1,-evidence/v1, and-decision/v1family, and
each record is a single file at.assay/source-adoptions/<id>.jsonrather than
a per-adoption directory.--mode adapt|copystays, as descriptive metadata for
upstream-drift review. - Per-adoption
.lockfiles are gone. One record is one atomic file write, so
there is nothing to serialize; adoption writes still pass through the workspace
mutation gate that fences a conversion. assay statusreports Source adoptions asadoptions,systems, andpinned
in place oftargets,acceptedTargets, anddraftTargets.FrameworkStatus
and--jsonoutput change with it.assay checkreports Source adoption structure only: whether each record parses
and validates, whether its filename still matches its id, and whether the system
it names is still registered.
Added
- Cross-workspace Source references.
assay source link <target-workspace> <target-source> [--alias <local-alias>]writes a thin pointer at
sources/<local-alias>/source.ref.yaml— schemaassay.source-reference/v1,
fieldsworkspaceandsource, nothing else — so a Source that already has a
home is reached instead of cloned again.assay source home <alias>says where
an alias actually lives, for owned and referenced Sources alike, and
assay source unlink <alias>forgets the local name. See
docs/source-reference.md. - Read operations on a referenced alias always show the relation.
source status
appendsref -> ../shared-research#qiskitto the row;source log,
source diff, andsource syncprintRelation:andHome:lines. A
reference is never displayed as if the workspace owned the material. - Write operations through a reference —
sync,capture,import,switch—
land in the home. They print the home's path before starting the work, run
under the home workspace's mutation coordination rather than the consumer's,
and add no confirmation gate.--jsoncallers get the same fact from the
result'sreferenceblock.assay statuscountsreferencesand
broken referencesalongsidecheckoutsandcopies. - Deletion stays asymmetric.
unlinkremoves the pointer file and the directory
it was alone in, never recursively and never through to the home; a shell that
somehow holds content keeps it. Aimingunlinkat a Source this workspace owns
is a teaching error, not a delete. Removing an owned Source is only possible in
its home workspace. linkresolves a chain of references at creation time and records the workspace
that actually ownssource.yaml, so runtime resolution is exactly one hop.
Linking a target that is already linked is a notice rather than a failure;
passing--aliasexplicitly creates a second local name for the same home and
reports the existing one.- A reference whose home cannot be reached fails locally.
source statuslists it
asbrokenwith the recorded target and the reason, commands on that alias fail
with an error naming the repair,assay checkreports it as a structure finding
without scanning for the home or repairing it, and every other object in the
workspace keeps working. A reference shell holding its owncheckout/,
content/,observations/, orcaptures/is refused the same way, because a
pointer plus material is two answers to where the Source lives. - A rebuildable clone registry at
~/.assay/clone-registry.json
(ASSAY_CLONE_REGISTRYoverrides the location): entries of normalized origin
URI, home workspace root, alias, andlast_seen.source add,source link,
andsource syncwrite to it best-effort — a write that fails never affects the
command. It buys three hints and no decisions:source addof an origin that
already has a home prints an advisory naming that home and suggesting
source link, then proceeds;source link <target-source>with the workspace
omitted links directly when exactly one home verifies and lists the exact paths
and stops when several do; a broken-reference error appends the registry's
current location when one verifies. Every read re-verifies the workspace and
alias and drops stale entries, it stores absolute machine-local paths while ref
shells prefer relative ones, and it records homes only — never a consumer's
pointer. Deleting the file loses those three hints and no facts. assay source capture <alias> [--note <text>]preserves a source's current
bytes atcaptures/<id>/sourcewith asha256-tree-v1integrity manifest. It
works for either content mode and is the only routine command that hashes a tree.assay source import <alias> <dir-or-archive> [--note <text>]replaces a copied
source's content. The bytes it is about to replace are captured first, so an
import adds a record rather than destroying one.- Evidence tiers are named in the semantics registry and the bundled skill: tier 0
is the default record (alias, date, commit when there is one), tier 1 is identity
(commit and origin, or a tree hash computed on demand for copied content), tier 2
is an explicit capture.analysis close --exit adopt|rejectsuggests recording a
tier-1 pin; it never requires one. assay source adoption remove <adoption>forgets a mapping. It deletes the
record and nothing else; the material in the target system is the target
project's and was never Assay's to write.assay source adoption takegained--note <text>for the rationale worth
re-reading, and records a tier-1 identity pin without being asked: the comm...
Assay 0.13.0
Assay 0.13.0
Assay 0.13.0 replaces the 0.6 built-in workflow/runtime stack with a smaller,
local-first project evidence workbench. The release contract is exactly
0.13.0+s4+l8+r3: package 0.13.0, manifest schema 4, layout 8, and systems
registry schema 3.
This note covers the full change set since v0.6.0. Intermediate 0.7–0.13
candidates were never released and have no compatibility contract.
Native Project work
- Project is a native schema-1 object.
project/project.yaml(or
.assay/project/project.yamlin overlay mode) is the sole Project id/name
authority. - Task provides durable bounded-work identity with readable
task-0001-<slug>ids, a closedtask.jsonenvelope, reader-ownedprd.md,
optional checkpoint/design/research material, explicit lifecycle and archive,
exact host-context bindings, typed lineage relationships, and partial-health
listing. Task does not own dispatch, permissions, project acceptance, or
host runtime state. - Roadmap provides readable
roadmap-0001-<slug>ids, reader-owned outcome
prose, independent state and horizon, validated dependency/replacement graphs,
explicit Task links, revisions, archive, and partial-health reads. Roadmap and
Task lifecycle never propagate into each other. - Spec provides readable
spec-0001-<slug>ids, a closed schema-1 envelope,
reader-owned specification prose, draft/active/retired lifecycle, explicit
replacement and archive, and digest-bound promotion provenance from an
Analysis or approved Task file. Activation validates structure; it is not
approval or Project acceptance. - Readable ids are allocated across live and archived records, tolerate
duplicate titles, and remain stable when titles change.
External Plugin metadata, not execution
- The former built-in plugin runtime is replaced by schema-1 external Plugin
metadata under.assay/external-plugins.json. plugin register,observe,list,check,disable,enable, and
removevalidate and record descriptors, exact payload integrity, requested
host surfaces, grants, observations, and Assay-owned contribution state.- Assay does not fetch, install, activate, execute, supervise, or uninstall
external payloads. Host execution and host-owned state remain outside Assay. - The repository includes a descriptor-only generic fixture and an unpublished,
metadata-only Ponytail adapter. Neither package contains executable Ponytail
or host payload code.
Source convergence
- External evidence is consistently a Source. Living and frozen modes share
thesources/<alias>/namespace, observation/manifests/captures ledger, and
Source-bound Analysis flow. - The former Reference and Absorb command families, public schemas, templates,
and help entries are removed. Layout 8 has noreferencespath and current
Templates do not scaffold Reference/Absorb records. - Source observations no longer contain Analysis lifecycle state. Analysis
close does not rewrite an observation; derivedhistory.mdand persisted
comparison files are removed, whilesource diffderives comparisons from
immutable manifests. statusreports local upstream movement without network access;--fetchis
explicit.source syncandswitchpreserve unrecorded managed-checkout work
by failing before a destructive refresh.- Adopted Source material is tracked only through
assay source adoption ....
Definitions, inspections, evidence, decisions, baselines, and rollback
receipts use theassay.source-adoption-*/v1schema family and lazy
.assay/source-adoptions/store. - The earlier internal Donor module, diagnostics, schema tokens, and loose-state
path are removed. No dual reader or migration writer exists for those
unpublished candidate records. - Overlay-to-standalone conversion preflights and preserves the current Source
ledger and Source adoption receipt store without taking ownership of target
System code.
Simpler Templates, manifest, and workspace index
- Built-in
study,solve, andexploreare one-shot Templates. A custom
Template is an explicit YAML path with a closed schema; Template identity is
not persisted or reloaded after expansion. - Manifest schema 4 contains the literal framework version and exact layout-8
resolver block.layout.entriesstores only bounded paths expanded from the
one-shot Template; fixed native/core paths are resolved rather than copied
into the manifest. - Retired manifest fields for minimum versions, Project identity, profiles or
archetypes, capability modules, plugin declarations, and bindings are not
accepted. External Plugin metadata has its own schema-1 store. - Layout-8 path names describe the actual areas directly, including
systems.
No unpublishedsystems_contracts/systemsContractsalias remains. .assay/managed-files.jsonschema 1 is the independent no-clobber receipt for
fixed core assets. It owns generator/asset identity, baseline hashes,
protection, and executable metadata; the manifest does not.updatereconciles only fixed core files. Template output and reader-owned
Project artifacts remain outside managed overwrite behavior.- Global workspace discovery is an explicit schema-1 index under
~/.assay/workspaces. Onlyworkspace track,discover, andforgetwrite
it; lifecycle and read commands do not register, repair, or deduplicate
workspaces implicitly. The former global projects store is not read or
migrated.
Registry-canonical Systems
.assay/systems-registry.jsonschema 3 is the sole Project-local System
authority. The map key is the exact canonical selector; records hold only
locator, lifecycle, VCS/version observations, and supersedes edges.- Selectors are exact. Prefix fallback is removed.
- Assay does not create, parse, validate, refresh, move, or delete a
system.yaml; such a file is ordinary System-owned content. system update --pathchanges only the registry locator.system archive --applyis a logical registry transition and never moves or deletes System
bytes. The primary transition and supersedes graph remain registry operations.- Standalone/overlay conversion preserves registered System content as opaque
user/System bytes and rewrites only registry locators it owns.
Removed authorities and runtimes
- Native ADR is removed, including its index, commands, templates, provider
responsibility, Source hints, and Intent-promotion target. Current normative
contracts belong in native Specs; durable decisions and findings can remain
in reader-owned Project prose, Analyses, and Knowledge. - Iteration authority is removed: there is no layout path, command family, core
API/type, template/profile module, status/check projection, Knowledge
back-reference, conversion ownership, or root-discovery marker. Native Task
owns bounded future work.solveattempts andexploretrials remain
Template-specific user work areas, not Iteration records. - The native capability-module abstraction and product Intent are removed,
including commands, manifest fields, archetype modules, scaffolds, gates,
projections, events, capture/list/promotion/integrity, System authority,
templates, zones, and conversion behavior. External descriptor capability
requests remain opaque host metadata and grant no Assay authority. A manually
createdintent/or.assay/intent/directory is ordinary unowned content. - The built-in Trellis runtime, protocols, channels, hooks, migrations, memory,
plugin reconciliation, and execution surfaces are removed. Agent DAG,
dispatch, permissions, and activation stay with the host; Relay retains its
own fork/promotion semantics. - Manual/freeform event commands and public event-append/capture exports are
removed. Mutating core operations still append their automatic structured
events internally. .assay/VERSIONis removed. The exact framework version lives only in the
schema-4 manifest envelope.- There is no physical migration subsystem, native Intent compatibility layer,
or host execution runtime hidden behind the retained commands.
Narrowed Analysis and Knowledge vocabularies
analysis close --exitaccepts exactlyadopt,reject, orexperiment;
retired decision exits and ADR/Iteration coupling are absent.knowledge addaccepts exactlypattern,guide, ortroubleshooting;
retired Knowledge types and Iteration back-references are absent.
Breaking cutover boundary
- Repository installation and the distributable core/CLI packages require
Node.js >=22.13.0; repository workflows pin pnpm 11.3.0. - Assay 0.13 reads only the exact current workspace tuple
0.13.0+s4+l8; System operations additionally require registry r3. - v0.6.0 workspaces and every unpublished intermediate candidate fail closed
before semantic reads or writes. Core does not contain a legacy reader,
in-place upgrader, dual writer, or downgrade path. - Any retained workspace that must cross the boundary requires a separately
reviewed external exact-pair cutover tool. This release does not claim that a
real workspace migration was performed. - Package metadata is set to 0.13.0. This repository note does not claim npm
publication, tagging, deployment, or installation into a user environment.
Release verification
The repository release gate builds all packages, runs type checking, lint,
package tests, CLI smoke scenarios, disposable init/adopt flows, and the
committed public-example check. The public example is a sanitized generated
study workspace with no runtime ledgers or local systems registry.