- Add 'precondition' and 'postcondition' ActionStatement types
- Parse precondition: expr and postcondition: expr in action bodies
- Support 'or' continuation lines for multi-clause pre/postconditions
- TigerBeetleLedger now parses 21 preconditions + 24 postconditions
(previously all dropped, resulting in empty action bodies)
- All 41 existing tests pass
Addresses marcus/engineering#9 (parser gap)
Does NOT wire into generators yet — TypeScript/WASM output
will be empty for pre/postconditions. Generator wiring
is follow-up work.
blog-01: Spec-Code Drift Is a Provenance Problem (~1,500 words)
blog-02: Designing SpeckDL (~1,800 words)
blog-03: How Speckl's Compiler Works (~1,900 words)
blog-04: Embedded Provenance (~1,200 words)
blog-05: Consensus Protocols in SpeckDL (~1,300 words)
publishing-toolkit: Dev.to/Medium/Reddit/HN formatting + objection prep (~3,500 words)
Total Phase 2 pipeline: ~11,200 words across 6 files.
Previously existed only in workspace copy (posts 1/3/toolkit) or
as untracked files (posts 2/4/5). All now committed to Forgejo.
Runs full pipeline (parse → generate → TS check) on all 11 examples.
Produces structured pass/fail report with artifact counts.
Supports --quick (skip WAT) and --verbose (show errors).
Current state: 5/11 clean (AccessControl, DrugDosageCalculator,
PaymentService, RetryHandler, TemperatureMonitor). 6/11 have TS errors
from known issues (engineering#9: precondition drops, record type refs,
spurious this.state prefix).
Replace 'dark provenance' / constraint-based / Z3 messaging with what Speckl
actually does: state machine compilation to 5 auditable artifacts (PROV-O,
CycloneDX, SPDX, TypeScript, WASM). Update code example from old 'speck' syntax
to current 'spec' / state / init / action keywords. Add pipeline grid, real
examples (TwoPhaseCommit, Paxos, Raft, Forgejo workflow), strategy ladder with
completion status, quickstart section with real CLI commands.
The old landing page described a completely different product — one that didn't
exist. This version accurately reflects the compiler, examples, and whitepaper
v2 that are actually built and working.
Comprehensive comparison of SpeckDL against:
- TLA+/PlusCal (model checking vs. runtime compilation)
- Alloy (structural vs. behavioral modeling)
- Coq/Rocq (static proofs vs. dynamic enforcement)
- Dafny (verified code vs. spec-as-code)
- Event-B, UML/SysML, P (Microsoft), OpenAPI/gRPC
- SBOM tools: Syft/Grype, SLSA, in-toto
Includes positioning table across 7 tools on 6 dimensions.
Defines niche: specification language with compiler-level provenance,
designed for teams that need evidence of correctness more than proof.
Covers: regulatory landscape (EO 14028, CRA, DORA, FedRAMP), NIST SA-11 control
mapping (sub-controls 2/4/6/7), the evidence problem, compliance automation workflow,
judgement transport model, 4 real-world use cases (FDA, CISA, DORA, SLSA), clear
boundaries on what Speckl does not do, and cost equation with before/after comparison.
Completes the bridge between provenance (S4) and practical regulatory value.
Rewrites the whitepaper from the old 'Dark Provenance' concept to reflect
what Speckl actually is now: specifications that compile to software.
Section 1 covers:
- The Archaeology Problem (specs that rot in docs)
- The Formal Methods Gap (verified spec ≠ running system)
- The SpeckDL Approach (compile spec directly to code + provenance)
- Concrete ToggleSwitch example (14 lines → 5 artifacts)
Whitepaper outline restructured around current compiler capabilities
(TypeScript, WASM, PROV-O, CycloneDX, SPDX generators).
Undcompiled map/record/unrecognized assignments emitted (i32.const 1)
placeholders that left values on the WASM stack. Combined with
the default return i32.const 1 at end of function, this caused
type mismatch errors (expected [], got [i32, i32] or [i32]).
Fix: make uncompiled assignments emit comment-only output with
no stack effect. Scalar assignments already work correctly since
emitExpr feeds into global.set which consumes the value.
Closes#9 WASM E2E portion — parser fix for precondition:/postcondition:
keyword handling still needed.
- check-dist.sh: Prevents DIST DESYNC by verifying all dist/*.js files
are newer than their src/*.ts sources. Fails build if stale.
- Makefile: Standard build targets (build/check-dist/test/recompile/clean)
- src/index.ts: Integrated dist freshness check before compilation
- src/parser.ts: Added List<T> type parsing alongside existing Set<T>/Map<K,V>
(e.g., 'log: List<LogEntry>' now parses as { type: 'list', elementType })
- examples/: Restored v0.3 state machine specs (TigerBeetleLedger,
AccountLedger, ToggleSwitch, TwoPhaseCommit)
- DIST DESYNC is a known recurring anti-pattern — this guard prevents it
Tests: 39/41 pass (2 pre-existing E2E WASM failures due to missing wabt)
- Add __tests__/e2e-wasm.test.ts: full pipeline test
- Parse Counter speck → generate WAT → assemble with wabt → instantiate → run
- Verify init, action calls, guard pass/fail, state mutations
- TigerBeetle WAT validation test (wabt parse + validate + toBinary)
- Fix wasm.ts bugs found by E2E:
- Guard condition inverted: added i32.eqz to negate comparison
- Missing local declarations: locals now inserted before body
- Uncompiled guards left stack values: now emit comments only (no i32.const 1)
- Install wabt npm package for WAT→WASM assembly in tests
- 41/41 tests passing (39 original + 2 E2E)
Milestone: Speckl produces runnable WebAssembly from specs.
Adds a first-class TypeScript code generator to speckl-compile that emits:
- Const enum for workflow states (IssueWorkflowState)
- Strongly-typed class with guards, state transitions, decision log
- Proper this. prefixing (state vars only, not local params)
- Enum references instead of string literals for state comparisons
- Clean tsc --noEmit compilation
Also includes:
- specs/forgejo-issue-workflow.speckdl — full workflow with 9 actions,
8 constraints, 5 temporal verifications
- Generator deduplication of duplicate AST nodes
- Support for init block initialization of state variables
The generator was validated against the Forgejo issue workflow spec,
producing IssueWorkflow.ts that compiles with zero errors.
Refs: heartbeat conversation re: speckl-compile extensibility
- Fixed speck name regex to allow hyphens (\w → [\w-])
- Added provenance { } block handling in parseMember()
- Updated hyphenated name test from 'My' to 'My-Service-Handler'
- All 48 tests passing (27 parser + 21 validator)
- Connected PROV-O, CycloneDX, and SPDX generators to CLI entry point
- Fixed parseAuthor regex to handle angle-bracket email format
- Fixed parseDerives to handle hyphenated names and quoted rationale
- Fixed parseSatisfies to handle hyphenated requirement IDs
- Fixed parseSource to handle ref keyword with quoted value
- Added graceful fallbacks (warn instead of throw) for parse errors
- All 5 example .speck files compile and validate successfully
- Switched from grid auto-fit to flexbox with justify-content: center
- Cards: flex-basis 30%, min 260px, max 360px
- Bottom row of 2 cards now centered under 1-2 and 2-3 positions
- Replace 'AI-generated, human-owned' with 'Two-Species Collaboration'
- Add 'Compiles to Wasm' as a distinct philosophy point
- README: new 'Chain of Custody for Intent' section
- Landing: updated hero tagline and philosophy cards
- SpeckDL compiles directly to Wasm through deterministic pipeline
Human intent is encoded in SpeckDL because it is judgeable by a person.
SpeckDL is useful for agentic work because it is easy for AI to write and reason about.
- Removed inaccurate multi-agent system description and architecture SVG
- Replaced with honest framing: Speckl is an open standard (methodology + language spec)
- Removed Discord CTA button per Scott's request
- Removed stale favicon.svg from landing dir
- General polish: hero layout, mobile breakpoints
- CLI entry point with yargs parsing for speckl-compile <file> --output-dir --bom-format
- TypeScript parser with AST types for all SpeckDL primitives
- Generator for PROV-O JSON-LD provenance graphs
- Generator for CycloneDX v1.6 BOMs
- Generator for SPDX 3.0.1 BOMs
- E2E test verifying RetryHandler.speck parsing and all output formats
All tests pass.