Announcements

Release notes and updates across Codifide — the Codifide Harness framework and harness files, and the Codifide Programming Language.

Codifide Harness v3.2.1 — released 12 November 2026

A CI fix, and the first signed release tag

The example CI workflow checked out GitHub’s synthetic merge commit for pull requests. That commit carries no provenance trailers, so the review-level check failed every pull request that touched a governance file, even with the approval label applied. The workflow now checks out the pull request’s own head commit. If you installed v3.2.0, add the one line by hand: the installer does not overwrite your workflow file.

The v3.2.1 tag is signed with an SSH key. The download is not separately signed; check it against SHA256SUMS. The whitepaper is retitled “Codifide Harness: How We Govern AI-Powered Development in Healthcare”. The fix was found on two of our own repositories, where governance pull requests then passed; it has not been exercised by anyone else yet. See the release on GitHub.

Codifide Harness v3.2.0 — released 11 November 2026

A pinned installer, with upgrade and uninstall

The steering files, hooks and four enforcement scripts are unchanged from v3.1.0. What is new is the way to get them into a repository and keep them current, without a network install.

Dry run first

install.sh runs from a downloaded release, prints its plan and writes nothing until you pass --apply. It targets one or more hosts (Kiro, Claude Code, Cursor, Copilot, Codex) and refuses to run from anything but a tagged release.

no network · no commits · no git config changes

Your files stay yours

Policy files you own, such as .codifide/immutable-paths, CLAUDE.md and AGENTS.md, are created only when absent. .claude/settings.json is never written; the installer prints a snippet to merge instead.

no-clobber · merge snippets · hash manifest

Upgrade and uninstall

upgrade shows a diff and replaces only files you have not edited. uninstall removes only the unmodified files it installed. Changes then go through a normal pull request.

manifest-driven · stops on local edits · one version number

What has been checked: the installer’s own suite (367 checks) and one cross-vendor review, after which eight findings were fixed with regression tests. What has not: any host actually loading the installed files. The release is not cryptographically signed yet; check the download against SHA256SUMS. See the quickstart or the release on GitHub.

Codifide Harness — 2026

Run multiple agents on one codebase — without the mess

The Codifide Harness files were first built for one agent session at a time. Running several against the same repository used to mean clobbered files, tangled git history, and lost handoffs. This update adds a deliberately right-sized way to run concurrent sessions safely — and it stays completely out of the way when you're working solo.

Isolation by worktree

Each concurrent session gets its own git worktree — a separate working directory and branch that share one object store. Two sessions physically cannot overwrite each other's files. External state (ports, scratch databases, caches) is separated per session too, because isolating files is a false comfort if the running processes still collide.

git worktree per session · per-session ports/DB/caches · serialized git metadata

Sharded session state

Each session records its own handoff instead of overwriting a shared one, so no session's notes are silently lost to a last-writer-wins race. An integrator consolidates the per-session handoffs when the parallel work merges.

per-session handoff files · integrator consolidates on merge · solo work unchanged

Verified integration

Each branch passing its own tests does not prove the branches compose — one session can change an interface another still relies on, and every isolated test still passes. When a test suite exists, it runs against the merged state before anything reaches the main branch. A clean textual merge is not a pass; git detects textual conflicts, not semantic ones. This is what turns "we think it's clean" into evidence.

tests run against merged state · catches interface drift · confidence, not hope

This is for one codebase. Coordinating lanes of agents across many codebases, with frozen seam contracts and merged-state verification across them, is the separate, private Codifide Swarm, which is in development. Deliberately right-sized: heavier coordination machinery (scope partitioning, merge queues, flaky-test classification) is left out until collisions recur despite isolation — the same scale-adaptive principle that governs the gates. Read the deep dive on the Codifide Harness page, or copy the open-source harness from GitHub.

v4.0 — tagged 15 May 2026, the same day as v2.0 and v3.0

What v4.0 adds — the usability release

v4.0 closes the gap between research prototype and usable tool. Runtime type enforcement makes sig declarations checked at runtime (best-effort: untagged values pass). A standard library covers file I/O, HTTP, JSON, and date arithmetic. 450 tests passing, 0 skipped.

Runtime type enforcement

sig declarations are now enforced at every call boundary. Passing a String where Int is declared raises TypeViolation. Any accepts all values. Number accepts both Int and Float.

# v4.0 — type mismatch caught at call boundary
def double
  intent "double an integer"
  sig    (n: Int) -> Int
  effects {}
  cand
    add(n, n)

# double("hello") → TypeViolation: parameter 'n' expects Int but got String

New TypeViolation error · 20 new tests · best-effort (untagged values pass)

File I/O and HTTP

io.read, io.write, io.exists for filesystem access. http.get, http.post for HTTPS requests. Path traversal defense built in. HTTPS-only enforcement.

def fetch_and_save
  intent "fetch a URL and save to disk"
  sig    (url: String, path: String) -> Unit
  effects {http.fetch, io.write}
  cand
    body <- http.get(url)
    io.write(path, body)

{io.read} · {io.write} · {http.fetch} · 30s timeout · 16 MiB limit

JSON and date arithmetic

json.parse and json.encode are pure — no effect declaration needed. clock.today, clock.parse, clock.add_days, clock.format for date work.

def days_until
  intent "days from today until a target date"
  sig    (target: String) -> Int
  effects {clock.read}
  cand
    today_ts <- clock.parse(clock.today())
    target_ts <- clock.parse(target)
    div(sub(target_ts, today_ts), 86400)

json.parse · json.encode · clock.today · clock.parse · clock.add_days · clock.format

V4-4 deferred — network-safe server

Bearer token auth and TLS for the RPC server were scoped for v4.0 but deferred. The public registry (V4-3) must demonstrate multi-machine use cases before the security investment in network exposure is justified. The server remains local-only for now.

v3.0 — tagged 15 May 2026

What v3.0 adds

Three requirements shipped. Refusal reasons make bottom diagnosable. Remote symbol resolution makes content-addressed composition work across machines. Parallel import support closes the last known gap in the parallel evaluator. 383 tests passing, 0 skipped.

Refusal reasons — bottom "reason"

bottom now accepts an optional string payload. The reason propagates through RefusalError for diagnostics. Bare bottom is unchanged — existing hashes are not invalidated.

# v3.0 — reason propagates through RefusalError
believe result
  ge(conf(result), 0.85) => result
  else                   => bottom "confidence below threshold"

AST · runtime · canonical form · Rust · 24 new tests

Remote symbol resolution

Push a symbol to a remote registry and resolve it from any machine. codifide serve --read-only enables public registry deployments.

python3 -m codifide store push sha256:1c01… \
  --registry https://registry.example.com

python3 -m codifide run pipeline.cod \
  --registry https://registry.example.com

RemoteStore · fetch-and-cache · hash-verified · --read-only flag

Parallel evaluator import support

Branch interpreters in the parallel evaluator previously ran with empty resolved_imports, making imported symbols unavailable inside parallel branches. Fixed — imported-symbol calls are now eligible for parallel evaluation.

# Imported symbols now work inside parallel branches
import classify_content = sha256:3770…

def main
  intent "classify in parallel"
  sig    () -> List
  effects {}
  cand
    list(
      classify_content("message one"),
      classify_content("message two")
    )

AUD-OVERNIGHT-02 closed · branch interpreters carry resolved imports

V3-4 deferred — no adoption evidence

Time-indexed types (T@timestamp) were on the v3.0 roadmap but deferred. No agent session produced evidence that the feature was needed. Adoption evidence outranks intuition — the feature stays on the roadmap until real usage justifies it.

v2.0 — tagged 15 May 2026

What v2.0 adds, fixes, and enables

Every friction point that blocked agents from completing Program 5 — content-addressed composition — is now fixed. Four requirements, driven by four LLM-agent case-study sessions (not human users), one governance review.

RPC API — Program 5 without the ceremony

Content-addressed composition previously required four CLI commands, an index ceremony, and a runtime flag. Now: start the server, POST canonical forms, import by the returned hashes. No index. No flag.

python3 -m codifide serve

# Publish a symbol
curl -X POST http://localhost:7777/symbols \
  -H 'Content-Type: application/cbor' \
  --data-binary @- < canonical.cbor

# Import by hash in your program
import classify_content = sha256:1c01b8b5…

POST /symbols · GET /symbols/{hash} · GET /symbols/{hash}/imports · idempotent writes · 36 tests · reviewed by an AI persona (Sable)

Static bind-before-when detection

The most common footgun in Codifide — using a bound name in a when guard before the body runs — was a confusing runtime error. It is now a parse error with a one-line fix message.

# Before v2.0: runtime error "unknown callable: 'label'"
# After v2.0: parse error with fix hint
cand
  label <- moderate(message)
  when   eq(label, "unsafe")   # ← caught at parse time
  "blocked"

Python parser + Rust parser · 12 regression tests

from-import in the Rust runtime

from sha256:<hash> import name1, name2 previously required CODIFIDE_RUNTIME=python. That workaround is gone. Both runtimes support from-imports as of v2.0.

# Works in both Python and Rust runtimes
from sha256:a8b5f554… import classify_content,
                               moderate,
                               route_message

Rust parser + Rust interpreter · --store flag · 2 conformance tests

Capability manifest docs field

The machine-readable capability manifest now links to human-readable documentation. An agent fetching the manifest gets a pointer to the quickref, cookbook, and getting-started guide — no separate discovery step.

python3 -m codifide capability --hash
# sha256:42d73647ba8de29a7d219bf2218bad0a42dc2a11d7878cac12ee931be2a1a185

curl https://www.codifide.com/capability.json | jq .docs

New manifest hash · publicsite updated · docs/CAPABILITY.md schema updated

Informed by four LLM agent sessions

v2.0 requirements were driven by what four LLM-agent case-study sessions needed. Four models (GPT-4o, Gemini 2.5 Pro, Claude, GPT-5.4) ran the pipeline task spec and documented every failure. The friction points they hit became the v2.0 requirements. The B-Team governance review (GPT-5.4, live interpreter) informed the release decision.

4 external models tested
5/5 programs completed by all models
12 cookbook failure modes documented
341 tests passing