Spark

Spark self-host path (A + B bootstrap + C)

Destination: Spark hosts Spark — VM and compiler authored as .spark under selfhost/, not forever hand-written GAS.

Path: A with B bootstrap and C assembler.

This doc is the architecture SoT for the self-host lane. No vapor calendar dates — stages advance when evidence on disk exists.

selfhost/ holds seeds plus a C tokenize aid. Stages advance when evidence on disk exists.


Roles

Lane Owner tree Job
A selfhost/ + this doc Destination sources: lexer → parser → compiler/VM in Spark
B bootstrap/ or vm/ (peer) Thin C VM that runs a growing .spark subset
C sparkasm/ (peer) Spark-native assembler (.sasm → ELF .o / .bin)

GAS asm/*.s./spark: disposable scaffold that still runs today. Not forever authoring SoT. Delete/replace only when B (+ C where needed) covers the same ops with proof.

Do not start a Rust/Python product VM. Do not deepen “GAS forever.”


Stages (evidence gates)

Stage 0 — Scaffold + A seeds (current)

Stage 1 — Bootstrap B runs a subset ← REAL (advanced)

Stage 2 — Assembler C replaces hand-GAS authoring ← REAL (phase-1)

Self-host sources run on B

Stage 4 — Spark compiles Spark

Stage 5 — Kick the ladder


What A owns now

Path Role
selfhost/README.md Today vs goal; what dry-runs on GAS
selfhost/token_kinds.spark Token kind catalog (dry-run)
selfhost/lexer.spark Lexer algorithm seed (dry-run)
selfhost/grammar.spark Statement grammar catalog (dry-run)
selfhost/parser.spark Parser/AST plan seed (dry-run)
selfhost/fixtures/mini.spark Tiny program for lex golden
selfhost/fixtures/ops.spark Richer: PIPE, review path, NUMBER
selfhost/fixtures/bootstrap_ops.spark Stage 1 B: tool/with/extract/listen/speak/pipeline
selfhost/fixtures/review_voice.spark review path/text + voice{listen/speak}
selfhost/fixtures/browser_dry.spark browser run/goto + mitm enable
selfhost/fixtures/ide_dry.spark ide open/run/ask/show
selfhost/fixtures/classify_dry.spark model + classify (+ multi) + print
selfhost/fixtures/let_dry.spark model + let + print (let KEYWORD)
selfhost/lex.c Real byte lexer (aid until Spark lexer on B)
selfhost/expected_*.tokens.jsonl Goldens for test-selfhost-lex
make selfhost-lex / make test-selfhost-lex Build + golden + dry-runs

Today A owns catalogs, lexer seeds, and lex goldens — parser and compiler work advances with Stage gates.


Coordination rules


Run (scaffold + seed)

# Stage 0
        ./spark --dry-run examples/hello.spark
        ./spark --dry-run selfhost/token_kinds.spark
        ./spark --dry-run selfhost/lexer.spark
        ./spark --dry-run selfhost/grammar.spark
        ./spark --dry-run selfhost/parser.spark
        ./spark --dry-run selfhost/fixtures/mini.spark
        ./spark --dry-run selfhost/fixtures/ops.spark
        ./spark --dry-run selfhost/fixtures/bootstrap_ops.spark
        ./spark --dry-run selfhost/fixtures/review_voice.spark
        ./spark --dry-run selfhost/fixtures/browser_dry.spark
        ./spark --dry-run selfhost/fixtures/ide_dry.spark
        ./spark --dry-run selfhost/fixtures/classify_dry.spark
        ./spark --dry-run selfhost/fixtures/let_dry.spark

        # Real tokenize today (C aid)
        make selfhost-lex
        ./selfhost/spark-lex selfhost/fixtures/mini.spark
        ./selfhost/spark-lex selfhost/fixtures/ops.spark
        ./selfhost/spark-lex selfhost/fixtures/bootstrap_ops.spark
        ./selfhost/spark-lex selfhost/fixtures/review_voice.spark
        ./selfhost/spark-lex selfhost/fixtures/browser_dry.spark
        ./selfhost/spark-lex selfhost/fixtures/ide_dry.spark
        ./selfhost/spark-lex selfhost/fixtures/classify_dry.spark
        ./selfhost/spark-lex selfhost/fixtures/let_dry.spark
        make test-selfhost-lex
        

Peer reports when present: