Skip to main content

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):

  • enlist endpoints 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 it dynamic and guard it against repeat calls. In Cocolab and inline tests, call it with invoke. enlist stays 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, and disperse make(Map[K]V) -> m clears nothing. Delete a key with if m[k]?: sweep remove(m, k). gather of a map is still rejected
  • Grouped constants: a const: block of NAME Type = literal lines. pub const: makes the whole group public
  • Named outputs on Environment.*, Invocation.*, Builtins.* and asset.* calls, such as ts = (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 as added, _ = Environment.StorageResult(...) no longer fails at runtime with builtin.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 Address and LogicId. The Address is the emit target (-> Sender, -> <id>), or the emitting logic when there's no target. This fixes the 0.9.1 known issue where get events on <address> matched nothing
  • get events on accepts a registered user or compiled logic name, as in get events on alice
  • coco lab init logs each setup step as succeeded, skipped or failed before the REPL opens
  • --no-color also strips color from the parse error of a mistyped command
  • The enlist command is legacy. Use invoke, 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 be dispersed into storage Reverted in v0.9.2, where dispersing a map merges into storage. gather of 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 in deploy, 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, so Environment.StorageResult(acct, pay) must now be written Environment.StorageResult(account_id: acct, payer_id: pay). Literal and keyword arguments such as StorageResult(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.* and Invocation.* calls are checked for argument count, names and types. Environment.VolumeCapacity() and VolumeAvailable() on a 0.8.0 target 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-color strips ANSI color codes from the output, for scripts that grep lab output
  • Fixed: Cocolab crashed on get events once a string emit had been logged

Known issue (fixed in v0.9.2):

  • Cocolab records every event with an empty Address, so get events on <address> matches nothing. Compiled logics are unaffected. Use from <logic> or of <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]):

  • payer clause on mutate — names who pays for the storage a logic-state write consumes (payer Logic, payer Sender, payer Actor(id); Sender is the default). Logic state only
  • Environment.StorageResult(account, payer) — returns the storage bytes added and removed in the current interaction, replacing the global VolumeCapacity() / VolumeAvailable() metering
  • Actor query methods Actor(id).Exists(), Actor(id).HasSigned() and Actor(id).Param(name)

New in Cocolab:

  • Storage access control — grant, get and wipe storage_mutate simulate 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 and origins(...) only registered users, and every as <actor> clause — on the storage_mutate commands and on deploy/invoke/enlist/create — is rejected outright when it names nothing, instead of coming back as an empty result

Changes (all targets):

Breaking (all targets):

  • Every asset engine method now carries a required qualifier: writes are dynamic, reads are static. 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's storage_mutate grant; Module.Sender.* and Module.Logic.* writes and all reads are unaffected
  • Environment.VolumeCapacity() and Environment.VolumeAvailable() are not supported; use Environment.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.basefuel and per-call fuel, 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 gather directly 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:

  • static keyword required for endpoints that observe state
  • Endpoints are pure by 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 invoke command enhanced with as and with keywords

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