Releases
v0.9.2
Bug-fix release targeting PISA v0.8.0. Maps can be dispersed into storage again, Cocolab events
record where they were emitted, and a few small language additions arrive. One change breaks
0.9.1 sources: endpoint enlist no longer compiles.
Type: Bug-fix · PISA: v0.8.0 · Date: September 28, 2026
Breaking (all targets):
enlistendpoints are rejected with "invalid function: enlist endpoints are not supported", on every PISA target. MOI has no enlist interaction, so Coco no longer compiles one. Usually the endpoint can be deleted, because an actor that was never written reads every field as its zero value. If it did real setup, make itdynamicand guard it against repeat calls. In Cocolab and inline tests, call it withinvoke.enliststays a reserved word
Changes:
- Maps can be
dispersed into storage again, reverting the 0.9.1 restriction. Dispersing a map merges into the stored map: keys the local map doesn't mention are kept, anddisperse make(Map[K]V) -> mclears nothing. Delete a key withif m[k]?: sweep remove(m, k).gatherof a map is still rejected - Grouped constants: a
const:block ofNAME Type = literallines.pub const:makes the whole group public - Named outputs on
Environment.*,Invocation.*,Builtins.*andasset.*calls, such asts = (timestamp) <- Environment.Timestamp(). Optional, but a name that doesn't match is a compile error - Fixed: at
-O2, the default, using only one output of a multi-output call such asadded, _ = Environment.StorageResult(...)no longer fails at runtime withbuiltin.CallFailure::invalid outputs - The error for an unsupported
Environment.*method now reads "is not a valid environment function" (was "envrionment"). Update scripts that grep for the old spelling
Cocolab:
- Events record
AddressandLogicId. TheAddressis the emit target (-> Sender,-> <id>), or the emitting logic when there's no target. This fixes the 0.9.1 known issue whereget events on <address>matched nothing get events onaccepts a registered user or compiled logic name, as inget events on alicecoco lab initlogs each setup step as succeeded, skipped or failed before the REPL opens--no-coloralso strips color from the parse error of a mistyped command- The
enlistcommand is legacy. Useinvoke, which persists state the same way
v0.9.1
Bug-fix release targeting PISA v0.8.0. Stricter compile-time checks close gaps that let invalid code through, and Cocolab now matches the runtime more closely. Three of the fixes can stop 0.9.0 sources from compiling or change how they behave in Cocolab.
Type: Bug-fix · PISA: v0.8.0 · Date: September 14, 2026
Breaking (all targets):
Maps can no longer beReverted in v0.9.2, where dispersing a map merges into storage.dispersed into storagegatherof a map was already rejected, and still is. The check is recursive: a class or array that contains a map at any depth was rejected too.disperse make(Map[K]V) -> m, which some sources used to initialize a map indeploy, didn't compile in 0.9.1, and was never needed- Argument names of
Environment.*calls are checked. A bare variable supplies its own name, soEnvironment.StorageResult(acct, pay)must now be writtenEnvironment.StorageResult(account_id: acct, payer_id: pay). Literal and keyword arguments such asStorageResult(Identifier(Token), Sender)compile unchanged. A label doesn't change the generated bytecode, so adding one doesn't require redeploying the logic
Breaking in Cocolab (0.8.0 targets):
Environment.Timestamp()is supplied in nanoseconds, as the PISA runtime defines it; before 0.9.1, Cocolab supplied seconds. Lab tests that compared timestamps against second-based constants need nanosecond constants
Changes:
Environment.*andInvocation.*calls are checked for argument count, names and types.Environment.VolumeCapacity()andVolumeAvailable()on a0.8.0target both report "<name> is not a valid envrionment function" (spelled as the 0.9.1 compiler prints it; corrected in 0.9.2)- A misspelled state field is reported as
storage field not found: <name> coco lab run --no-colorstrips ANSI color codes from the output, for scripts that grep lab output- Fixed: Cocolab crashed on
get eventsonce a string emit had been logged
Known issue (fixed in v0.9.2):
- Cocolab records every event with an empty
Address, soget events on <address>matches nothing. Compiled logics are unaffected. Usefrom <logic>orof <ixHash>instead
v0.9.0
Feature release targeting PISA v0.8.0. As PISA v0.8.0 supports storage costing, Coco supports specifying the payer for logic storage via payer keyword on mutate statement. Cocolab supports access control and few new syntax changes improve developer's experience.
Type: Minor Feature · PISA: v0.8.0 · Date: August 14, 2026
New (requires version = "0.8.0" under [target.pisa]):
payerclause onmutate— names who pays for the storage a logic-state write consumes (payer Logic,payer Sender,payer Actor(id);Senderis the default). Logic state onlyEnvironment.StorageResult(account, payer)— returns the storage bytes added and removed in the current interaction, replacing the globalVolumeCapacity()/VolumeAvailable()metering- Actor query methods
Actor(id).Exists(),Actor(id).HasSigned()andActor(id).Param(name)
New in Cocolab:
- Storage access control —
grant,getandwipe storage_mutatesimulate an actor authorizing a logic to write their state, matching the default-deny enforcement of the PISA v0.8.0 runtime. Policies are kept in the session snapshot - Names are validated when a command runs:
callers(...)may only name compiled logics andorigins(...)only registered users, and everyas <actor>clause — on thestorage_mutatecommands and ondeploy/invoke/enlist/create— is rejected outright when it names nothing, instead of coming back as an empty result
Changes (all targets):
- Field name shorthand in class literals —
Person{name}instead ofPerson{name: name}
Breaking (all targets):
- Every asset engine method now carries a required
qualifier: writes are
dynamic, reads arestatic. Asset logic written for 0.8.2, where transfer and approval endpoints carried no qualifier, needs the qualifiers added
Breaking on 0.8.0 targets:
- Writing another actor's state is denied by default.
mutate Module.Actor(id).*for anyone but the sender now requires that actor'sstorage_mutategrant;Module.Sender.*andModule.Logic.*writes and all reads are unaffected Environment.VolumeCapacity()andEnvironment.VolumeAvailable()are not supported; useEnvironment.StorageResult()
v0.8.2
Bug-fix release. Updates runtime to PISA v0.7.1.
Type: Bug-fix · PISA: v0.7.1 · Date: June 19, 2026
Changes:
- Cocolab: persistent session state, configurable
default.basefueland per-callfuel, and events are printed even when an interaction fails - Fixed quoting of hex literals in generated YAML manifests
- Fixed
+=on strings and bytes (now concatenates) - Fixed f-string handling of literal
{{/}}braces and a brace at the end of an expression - Nested and brace-elided composite literals; omitted class fields default to their zero value
- Interface endpoint qualifiers now propagate to the caller
- Updated runtime to PISA v0.7.1
v0.8.1
Bug-fix and added SKILLS.md file.
Type: Bug-fix · PISA: v0.7.0 · Date: March 19, 2026
Changes:
- Fixed a bug when using
gatherdirectly into a function return value - Added SKILLS.md file
v0.8.0
Bug-fix and minor feature release. Updates generation and runtime to PISA v0.7.0.
Type: Bug-fix & Minor Feature · PISA: v0.7.0 · Date: March 6, 2026
Changes:
- Asset and logic names can be used as arguments when invoking endpoints in Cocolab
- Fixed: failed execution no longer leaves partially changed asset objects and state
- Fixed: compiler bug in f-strings when first argument was a non-string expression
- Fixed: "mode" value to "pure" in generated manifests for internal functions
v0.7.1
Minor non-breaking release with participant handling improvements.
Type: Minor Feature · PISA: v0.6.0 · Date: December 23, 2025
Changes:
statickeyword required for endpoints thatobservestate- Endpoints are
pureby default (no access to logic's or actors' state) - Optional sender when interface is bound to a logic enables cross-logic calls as any participant
- Cocolab
invokecommand enhanced withasandwithkeywords
v0.7.0
Major breaking release introducing native assets and cross-logic calls.
Type: Major (Breaking) · PISA: v0.5.0 · Date: October 2, 2025
Changes:
- Native assets support
- Cross-logic calls and state access
- Cocolab environment with asset and cross-logic call support
- Discontinued Logiclab; Cocolab works as standalone testing environment
Breaking:
- Syntax changes from previous versions (function keyword, storage field names)
Binaries for previous releases are available on request.
v0.6.0 (alpha)
Type: Maintenance
Changes:
- Recursive initialisation of non-primitive class fields when using
make - Layered maps support deep assignments by initialising all intermediary map keys
v0.5.0 (alpha)
Type: Maintenance
Changes:
- Bug fixes for layered map behaviours
- Deep assignments support for layered maps
v0.4.0 (alpha)
Type: Major (Breaking)
Changes:
- New language features and syntax changes
- Codegen optimisations and bug fixes
Breaking:
- Compatibility impacts with MOI Protocol and PISA Virtual Machine Runtime