Skip to content

Skillscript

v0.8.0 Breaking

This release includes 2 breaking changes for platform teams planning a safe upgrade.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

agents dsl llm mcp skills workflow

Affected surfaces

auth breaking_upgrade

Summary

AI summary

Updates Changed — OutputKind shape, Notes for cold authors, and NEW across a mixed release.

Full changelog

Delivery model lockdown. Closes the v0.8.x delivery-model design (Perry/CC
threads 42a0cc416995d006ef5219a9bb34de4ea39345f9,
May 26). Three substrate-portable output paths replace the v0.7.x
# Output: enum's implicit-substrate behavior:

  1. Substrate writes$ memory_write (NEW) + file_write (existing)
  2. Programmatic return — result binding -> VAR (existing)
  3. Direct agent alertingnotify() op (NEW) + # Output: agent: /
    template: lifecycle hooks (substrate-neutral, end-of-skill)

Auth model deferred for rethinking. The skill-author tracking + promotion
gate work settled in 43178c86 / 1866302d is kicked down the road per
Scott's call ("needs to be better thought out and perhaps made simpler").
$ memory_write ships with the current approved= lint gate (same as
file_write); # Status: Draft → Approved stays self-promotable.

Changed — OutputKind shape (breaking change; pre-adoption rule applies)

  • prompt-context: renamed to agent:. The pre-v0.8.0 name leaned on
    substrate-specific "prompt-context" terminology that doesn't apply to
    Obsidian-vault-backed or mailbox-style agent substrates. agent: is
    substrate-neutral — "deliver to whoever's wired for X via their
    AgentConnector."
  • # Output: agent: <name>AgentConnector.deliver({kind: "augment", content: <joined-emissions>})
  • # Output: template: <name> (unchanged) → AgentConnector.deliver({kind: "template", prompt: <joined-emissions>})
  • Internal v0.7.x value prompt-context removed from the OutputKind union;
    internal output_kind discriminator in AgentDeliveryReceiptRecord
    similarly updated.
  • Sweep across examples/*.skill.md, test fixtures, scaffold docs.

Added — notify() runtime-intrinsic op

  • notify(agent, message?, connectors?) -> ACK dispatches mid-skill
    synchronous alerts via wired AgentConnector(s). Specialization vs the
    # Output: agent: end-of-skill lifecycle hook (per Perry's
    refactor-resistance argument: ordering puzzles dissolve when the
    end-of-skill hook owns emission accumulation and notify() owns
    mid-skill fires).
  • Default behavior when message is absent: dispatches the accumulated
    emissions-so-far. Authors can write notify(agent="X") between emits to
    fire a checkpoint without manually constructing the message.
  • Fan-out: dispatches to ALL wired AgentConnectors whose list_agents()
    includes the target agent. connectors=["webhook","tmux"] restricts.
  • Failure semantics: best-effort by default. Per-connector errors are
    captured in the ACK's dispatched[] array but don't propagate. strict=true
    opt-in deferred to dogfooding signal (per Q3 lockdown).
  • Return shape (signature lock): {agent: string, dispatched: Array<{connector: string, ok: boolean, error?: string}>}. Fire-and-forget
    callers ignore the binding; check-delivery callers inspect ACK.
  • Substrate-neutrality: nothing bundled. Adopters wire AgentConnector
    impls (webhook, tmux, Slack, Discord, etc.). Substrate-specific delivery
    destinations live in adopter-wired AgentConnectors, NOT in the language.
  • Closed-set RUNTIME_INTRINSIC_FN_NAMES expanded with "notify".

Added — tier-2 # Output: lint contract warns

  • output-agent-target-no-emit# Output: agent: X / template: X
    declared but skill has no emit() ops in body; delivery would fire with
    empty content. Warns to surface contract drift.
  • output-agent-target-no-connector# Output: agent: X / template: X
    declared but no AgentConnector wired; delivery would silently no-op via
    the NoOp default. Warns when lint context provides registry info.
  • Per Q4 lockdown: tier-3 advisories for "header + notify(agent=X) both fire"
    deferred to dogfooding signal (Perry's call — wait for real footgun
    evidence before adding the lint).

Added — $ memory_write op + MemoryStore.write() contract

  • MemoryStore.write({content, tags?, recipients?, expires_at?, metadata?}) -> {id, created_at} — new method on the typed MemoryStore contract.
    Bundled SqliteMemoryStore implements via the existing upsert schema with
    generated UUIDs. Companion: onboarding-scaffold FileMemoryStore.write()
    implements via JSON file append.
  • $ memory_write content="..." [recipients=[...]] [tags=[...]] [expires_at=N] [metadata={...}] -> R — bare-form MCP dispatch through
    the MemoryStoreMcpConnector bridge. Bridge dispatches on toolName:
    memory routes to query(); memory_write routes to write(). Bootstrap
    auto-registers the same bridge instance under both names.
  • Returns {id, created_at} envelope (per Q6 ack-shape lockdown).
  • recipients[] is a substrate-advisory hint — memory systems with alerting
    (AMP) act on it; systems without (Obsidian-vault) ignore. Skillscript
    doesn't enforce or implement alerting at the language layer.
  • Memory handoff delivery channel (the third "first-class" path
    documented in QUICKSTART since v0.7.0) is now real, no longer paper.

Deferred to future v0.8.x or later

  • Skill-author tracking + promotion gate. Per Scott (2026-05-26):
    "needs to be better thought out and perhaps made simpler." The
    43178c86 / 1866302d design is reopened for re-thinking. Possible
    simplification: promotion gate as operator-policy at the SkillStore layer
    rather than language-level identity tracking. Until then,
    # Status: Draft → Approved stays self-promotable as today.
  • Drop unconfirmed-mutation lint + reframe # Autonomous: true as
    documentation.
    Pairs with the auth model rethink — under the current
    approach the lint is still load-bearing. Defer with auth.
  • R7 cold-author harness for NFR-6 — queued post-v0.8.0; tests
    ops/filters/lint-rules extension surfaces against the new file layout.
  • Portability stress-test scaffold — v1.0 gate prep; vector-DB memory +
    hosted-API LLM + webhook AgentConnector substrate combination.

Notes for cold authors

  • # Output: prompt-context: X from v0.7.x skills is a parse error in
    v0.8.0. Rename to # Output: agent: X — pre-adoption rule applies (no
    external installed base; sweep your own test fixtures).
  • notify() is for mid-skill alerts; # Output: agent: X is for end-of-skill
    bulk delivery. See docs/adopter-playbook.md for the lifecycle distinction.
  • $ memory_write content="..." works against any MemoryStore impl that
    implements the typed write() contract. Bundled SqliteMemoryStore and
    the onboarding-scaffold FileMemoryStore both ship it.

Breaking Changes

  • Renamed `prompt-context:` to `agent:` in OutputKind shape; removed internal `prompt-context` value.
  • Added `$ memory_write` operation and `MemoryStore.write()` contract as a new first-class output path.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Skillscript

Get notified when new releases ship.

Sign up free

About Skillscript

All releases →

Related context

Earlier breaking changes

  • v0.35.0 Editing `# Deadline:` on an approved skill drops it to Draft (signature invalidates).

Beta — feedback welcome: [email protected]