Open Issues
302 open issues of Nikaia-Language/Nikaia, read when this site was built (2026-11-04 02:23 UTC). Each issue has its own page; that page links to GitHub, where the issue is answered.
Waiting for a decision
- #1047 Decision: does a function field type an untyped let lambda by first use (#997, #1045 row b)?
- #1042 Decision: may a call apply to a call's result,
same(inc)(1)? (parser refuses it today)
- #851 lowering:
.trim().to_string() stays ref String, process::run rejects it as Vec[String] (NK1102)
- #833 Decision basis: should
let g = fn(k) { ... } infer k from later calls, instead of NK1245?
- #798 Facts about data, steps 2-3: a rule over every element the prover reads (
xs.all(|x| ...)), and std's sorted contracts (decision)
- #796 A formally verified compiler? Decision basis for using Nikaia's proofs on the compiler itself
- #795 CI: build-once caches, a test pool and an unqueued develop, so a run costs what changed
- #794 Long jobs: CI is the verifier, measuring only where the point is a number
- #793 A modular compiler: what to split so a step rebuilds less and two builders can run
- #770 Invariants over every slot of a table: array smashing as a strategy of ADR-361 D5 (prepare decision)
- #761 Lowering in phases: collect each file's facts once, then infer, then check and emit as reads (maintainability and #727)
- #759 Text the compiler proves short: an inline representation chosen at compile time (prepare ADR, with measurement)
- #755 ADR-371 D4, the rest: vectors at the build's width, the mask, a fixed width, the CPU-level query,
x86:: instructions, crc32c, prefetch
- #731
S {} for a struct whose fields all have defaults does not parse
- #730 #703 leftovers: accepted programs rustc still refuses
- #728 A float literal is never
f32: let y: f32 = 0.5 is NK1103
- #672 std::time has no calendar time: no "now", no date, no formatting
- #669 std has no access to environment variables (
std::env)
- #668 std has no HTTP/HTTPS client:
std::net::connect is blocking plain TCP
- #664 1BRC to the limit: no whole-file UTF-8 check, text checked only where it is new (measure first, incl. a type for unchecked text)
- #660 Decision: a
target-cpu key, so a build can use the instructions of the machine it runs on
- #658 The fast
nikaia run path ignores RUSTFLAGS, the Cargo path honours it
- #634 May the compiler run a call with constant arguments at build time as an optimisation, where no
comptime asks for it?
- #597 Decision basis: the text-tier walk cannot see that a pattern binding is a view, so a mixed
match asks for .clone() where EitherText would do
- #593 Decision: generic traits (
trait Map[K, V]), and a standard Map trait the ecosystem can build on
- #588 Decision:
fn longest(a: String, b: String) -> ref String is NK2302 since D25. Keep the refusal?
- #540 A benchmark table in the README, regenerated by a script, with build time beside run time
- #388 Two lists known to be as long as each other (
rv[i] beside rc[i])
- #386 Products and quotients of two unknowns are no facts of the walk (
i * i > n, xi * y[j], (n + 4) / 5)
- #385 Values in a list of lists that are computed from each other (edit-distance tables, ~28 sites)
- #381 Smaller inconsistencies found while consolidating the ADRs
Ready to build
- #1221 A detached task that opens a scope leaks the rustc warning "unused import: ProbePlain" into the program's output
- #1220
task::scope … catch in a fn main() without throws lowers to return Err(error) and fails in rustc
- #1219 Build: the JSON form of an enum variant that carries a payload (ADR-grammar-2 D13)
- #1218 Views-3: a struct field fed from a view of a local or a lent parameter reaches rustc or is refused as keeping
- #1217 Prover: an index computed by division keeps its bounds check although its bound is proved
- #1216 Grammars: uncaught entry reaches rustc, cut inside recover ends the parse, repeated dec[T] in a lowercase rule, left recursion unspecified
- #1215 Borrow checker: three wrong diagnostics found while writing the ownership guide
- #1213 Parameters say
keep, ref leaves the language, a result's source is inferred or written from (ADR-views-3)
- #1212 A
Shared/SharedMut handle used after it was handed by value reaches rustc ("Rc does not implement Copy")
- #1210 tiers: to_string() of a field of an unannotated list literal's element still lends a temporary (E0716)
- #1209 A changeable part of a list:
xs[a..<b] handed to a mut parameter and changed in place (sort, swap, fill), and fill on a list
- #1208 A part of
ref mut self, or an element of a mut list, handed to a keeper: NK1131 says "only borrows self", and on an element rustc refuses it (E0507)
- #1207 Lowering: the value
m.entry(k).or_insert(v) hands back stays a &mut into the map, so a later use of the map is refused by rustc
- #1206 Lowering: an argument that reads the list whose element is changed (
w[0].push(w[1][1])) is refused by rustc (E0502)
- #1204 A tuple match subject with a list element moves out of a reference
- #1200 Build format specs in f-strings (NK1332) and env::current_exe()
- #1199 Build ADR-389:
immutable (deep immutability, once-evaluated item level, NK1331)
- #1192 Check: a field of a
ref T? from another package, unwrapped past a jump, is NK1245
- #1187 pre-push: the version/badge check reads the shared working tree, not the staged copy
- #1179 lower-std: lowered/fold_bound.rs flips between
rule: &str and rule: String across runs
- #1177 std: process spawn, try_wait and lossy output text for tools
- #1175 Prover:
least = 0 - b in bounding_mixed_fits overflows when b is i64::MIN (wraps in release, panics in dev)
- #1173 Checker: an assignment to a field does not drive the type inference of
.collect() (NK1105)
- #1172 std: BTreeMap has no
extend (NK1171)
- #1170 std: lossy UTF-8 decode of bytes and a raw byte write to stdout
- #1169 Check: a sync function in tools/*.nika calling an async function is not refused, lowers to
.await in a non-async fn
- #1168 Lowering:
.map(fn((at, ty)) { (at, ty.clone()) }).collect() into Vec[(i64, String)] fails in rustc (EitherText vs String)
- #1167 Check:
.clone() of a Vec[String] from a map get/values or a for element is typed Vec[ref String] (NK1103)
- #1164 emit: a list literal of tuples with a nullable slot does not lower (rustc E0308)
- #1163 std: a JSON reader for tools (cargo JSON, comptime artifacts)
- #1162 std: append to a file (fs append) for tools
- #1159 lower: a lambda with both
return null and return (x, x) lowers to a tuple where an Option is wanted
- #1157 drive.nika: a restart of the container kills the driver and its builder without a trace
- #1156 drive.nika: check the batch names when it starts, not when it reaches the brief
- #1155 A struct holding a non-text view of a local, handed back, reaches rustc
- #1154 lower-std in the shared checkout lowers with other agents' uncommitted emitter work
- #1153 release.nika: the driver's version commit lists empty titles ("; ;")
- #1151 same_line in a par_fold grammar does not compile (ParseContext::<()> written in emit_core_leaves)
- #1150 Debug
cargo build -p nikaia hits the recursion limit in winnow-grammar rt.rs
- #1149 Grammar lowering: a choice whose alternatives yield different values, unbound, fails in rustc
- #1148 agent.nika resumes a brief whose first run is still alive (two processes, one session, one checkout)
- #1147 Test blocks in tools/*.nika, lowered into the std crate's tests (moves the compiler's Rust unit tests into Nikaia)
- #1146 commit.nika: a builder's commit can miss a file its code needs, hidden by the shared working tree
- #1145 A
while true left only by return in a throws function is warned "Unreachable call"
- #1139 A match over a place inside a mut parameter moves the part an arm changes in place (E0507)
- #1138 A drain /
for mut element match handed to a mut parameter gives partially moved
- #1137 A narrowed in-place
Block? arm binding lowers wrong
- #1136 A guarded taking arm lowers to a move out of &mut
- #1135 A generic struct literal with a text field is inferred as Wrap[ref String] (NK1106)
- #1132 An or-pattern binding of a variant text field filled from literals stays
&'static str (rustc: mismatched types on push into Vec[String])
- #1131 Checker: a branch ending in process::exit does not end the flow (NK2105 on a value moved there)
- #1128 nikaia run: parallel runs of the same script race on the shared run/rlib cache (Bus error in ld, missing file)
- #1125 Words borrowed from a String parameter, called with a temporary text.clone(): rustc "temporary value dropped while borrowed"
- #1124 A run throwing fn parameter beside an own throw: rustc finds no From<Box<dyn Error>> for Thrown<..>
- #1123 Decision: how the generic
proofs::in_function moves into Nikaia
- #1122 types: a generic method's type parameter is not filled in at the call (NK1103 through a bound, NK1245 on a struct)
- #1121 A function handed to a function-typed parameter for the call alone is lent, not allocated (follow-up of #1120)
- #1119 A struct named
Box with a function field fails in rustc: the lowered closure's Box::pin resolves to the program's Box
- #1118 A local bound from a
sync function field loses sync: let r = b.run; r(1) is refused with NK2202
- #1116 Build ADR-319 D9:
fs::Path orders, equates and hashes, so a path keys an ordered set or map (NK1247 today)
- #1114 A text literal where an
fs::Path? is asked: a struct field passes check and fails in rustc, a typed let is refused NK1103
- #1113 An optional narrowed by
if x == null { return null } is not narrowed in the final return of an optional result (rustc: no field on &Option<T>)
- #1111 release.nika: a lane without released.txt loses its changelog entries to an mtime guess
- #1110 A lower-case comptime in a function body prints rustc's non_upper_case_globals warning
- #1109 A pattern inside a boxed named field (E::Call { func: E::Num(k), .. }) does not compile in rustc; the tuple form works
- #1108 A sync function that may panic() is refused at build time (NK1152), though Part II 10.2 lets a build-time run stop with panic
- #1105 Bounds reasons: split the catch-all by the form that blocks a site, with an example per reason (proved.nika)
- #1104 Claim (b): the certificate checker (logic_lia, logic_alethe, logic_search) and the two tools panics at zero unproved checks
- #1103 Build ADR-385 D2: std sequences state their count (ensures_count on split, chars, bytes), and the panic count
- #1102 drive.nika: a rebase conflict confined to generated lowered files regenerates them with lower-std instead of escalating
- #1101 A tuple
match/if with a null end and a text-literal end is refused NK1104 when the same parameter also takes an owned text
- #1100
[1, 2, 3].iter().filter(fn(x) { x > 1 }) on a list literal of open numbers reaches rustc (no copied walk)
- #1098 Over
iter() of a copy list, a named function into map and a filter_map lambda with if/null pass check and fail in rustc (&i64)
- #1096 A comptime in a non-generic function that calls an own function is NK1127 (could not build)
- #1094 A call result built from a by-value view-holding argument is charged to a
ref argument beside it (NK2302 on a struct-literal store; rustc "missing lifetime" through a method)
- #1091 NK1111: the help drops a brace of every
}} in a plain string, and the headline names {{{{
- #1086 An attribute struct without fields is not found (NK1135 at @Skip)
- #1083 A bare variant name in a pattern,
Name(v), reaches rustc instead of NK1252
- #1081
let a = call().field lowers as a borrow of the temporary's field; the next owned use fails in rustc
- #1079 A nullable type in a call's type brackets does not parse:
f[i64?](x)
- #1075
for c in text over a String passes check and fails in rustc (no method iter for &str)
- #1074 Tools lowering:
opt ?? other with opt: ref T?, other: ref T writes index::or(opt, || other.into()), which rustc refuses
- #1073 Lowering: a kept-buffer local handed to
BTreeMap.contains_key gets one & too many (E0277 String: Borrow<&String>)
- #1068 Bogus "Unused import: ProbePlain" warning on
spawn fn { f(s) } where f throws and calls process::run
- #1067 NK1102: the result of
fn f() -> String { return "lit" } is taken for a view when an owning parameter keeps it
- #1066 A
std value without a text (time::Duration) passes check in an f-string hole; rustc refuses (NK1201 missing)
- #1065 A call through a struct field holding code passes its arguments unlent: a list to
ref Vec[i64] reaches rustc as Vec, an owned text is moved
- #1064 check: a let annotation Vec[(String, String)] is ignored for a tuple-of-literals vector (NK1106 at process::run env)
- #1062 NK1104: s.to_string() on a for element of a string-literal array is typed ref String
- #1060 emit: adding tools/grammar_run.nika makes project_members' fs::Path maps lose TrustedMap
- #1059 A warning about a project's library file is shown in each test program, at the test's own span
- #1058 A read ledger signature drops unbounded type parameters, so
path::f[A, B](…) cannot be filled
- #1057 A non-copy field of an element read,
let s = path.last() ?? return null; return s.inner, passes check and fails in rustc (E0507)
- #1053 Claim (b) to 100 %: every index and arithmetic step in tools/*.nika proved (prover lane epic)
- #1052 fmt breaks a long grammar rule inside a repetition bound
{2}
- #1051 fmt:
nikaia fmt breaks a long grammar rule line between an element and its postfix */+, and inside an if(..) condition before ==
- #1040 grammar: a return inside an action reaches rustc (decide what it means)
- #1038 A view field of a dependency's struct, returned beside an owned text, is refused (NK1104)
- #1028 Decision: does a method lend a by-value data parameter (ADR-277 D17), for trait methods only or for every method?
- #1022 Prover: what a match guard gives its arm (ADR-361 D9)
- #1020 Decision: how a typed grammar entry meets a type with a text form of its own (
json::Value as a field, time::Instant, @json::Rest)
- #1019 Build ADR-grammar-2: grammar rules that take a type,
members[S], and json::read[T] as a grammar entry
- #1016 Lowering: a
ref Vec[T] result pointing into a ref Vec[T] parameter lowers as &Vec<T> vs &[T] (rustc E0308)
- #1014 Lowering cache: the interface key leaves out an inferred
sync, so dependants stay stale
- #1011 examples/trend: a second
nikaia test --project run with nothing changed sometimes re-lowers one crate
- #1004 Grammar entry on a temporary
Bytes(..) with a text result: rustc "temporary value dropped while borrowed"
- #1001 Grammar: a group of alternatives whose branches yield different types reaches rustc
- #993 Two overlap branches that write the same literal file are accepted (NK2104 missing)
- #987 async (ADR-async-4, async-2): std and runtime - group runtime, handles, par_iter tasks, admission, task::OverBudget
- #985 Two overlap branches that update one SharedMut are accepted; Part II 12.2 says two writing doors on one lock collide (NK2104)
- #983 async: one concept, task; async is an expression prefix (ADR-async-1..4)
- #980 A nested list's element is not linked to the
mut parameter it is handed to (NK1102)
- #979 Save, replace and restore a field of a
mut parameter around a call, with no clone
- #978 A package published as a Rust library:
artifact = "rust-library" and [features] whose roots are modules or pub items (blocks #928)
- #973 A value moved into an
or_insert_with lambda is refused (NK2105), though the lambda runs at most once
- #972
nikaia check tests/X.nika inside a project prints another file's refusal
- #968
for mut x in grid[i] (an index place) is refused NK1139 "isn't supported yet"
- #958 A tuple with a text literal pushed into a
Vec[(i64, String)] local, then moved into a struct field, reaches rustc (E0308)
- #953 tools/*.nika: rewrite the P5 workarounds over forms that exist (zip, map iter, mutable map view)
- #950 BTreeMap::entry, extend on every set (ADR-collections-1): build, then rewrite the insert loops
- #947
(xs.get(k) ?? return false) == "a" over a list of literals reaches rustc (&&str vs &str)
- #935 Mutual recursion of pausing functions across two files of a project fails in rustc ("Recursion in an async fn requires boxing")
- #928 Official package
yaml, also a Rust crate: a serde_yaml 0.9 drop-in layer over a native API (zero-copy, spans, format-preserving edits, limits)
- #927 A list element moved out by index (
out.push(xs[i]), String) reaches rustc instead of a refusal naming the copy
- #926 nikaia test: a test program of several files (
tests/NAME/ with its own src/)
- #925 lowering: a String parameter returned unchanged on one path lowers the result to EitherText,
!= against String fails in rustc
- #924 std: Seq.chain and char is_ascii_alphabetic / is_ascii_alphanumeric (NK1171 today)
- #922 std entries the orchestrator's move needs: sha256, env, file locks, file times and identity
- #921 Relocate the compiler's Nikaia from crates/nikaia-std/src/tools to crates/nikaia-compiler (ADR-294 D21)
- #919 rustc's dead-code warnings reach the user in Rust's words; Nikaia has to give them itself
- #912 A catch block that begins with an arm is a match over error (ADR-catch-1)
- #907 Lowering:
[..].contains(s.trim()) on a list of literals is accepted by the checker, rustc refuses it (Mismatched types)
- #906 Specialising a function per build-time value: comptime?, @unroll, branches decided while building (ADR-specialization-1)
- #904 Consolidate the numbered ADRs into records named by topic (ADR-decision-records-1)
- #900
let mut c = a.clone() of a struct: assigning owned text to c.field is NK1105 (ref String)
- #899 Lowering: a
mut argument read by another argument of the same call; a String parameter of literals in a mixed struct field warns mismatched_lifetime_syntaxes
- #896 Lowering:
match (ref s.field, b) with slice patterns, and name.to_string() of a view parameter, fail in rustc
- #882 A String parameter read through ?? or match counts as kept, so NK1261's own advice (
String for ref String) breaks callers
- #876 Measure named wide operations (full multiply, carry chains, 128÷64, carry-less multiply) before deciding on them
- #870 Decision: the receiver follows the parameter rule -
mut self for ref mut self, self a view unless kept
- #868 benches/overlap/lowered.sh writes the manifest key
ordering, which the manifest refuses: the bench measures nothing
- #860 Hello World starts faster than Python's in every way a program is started
- #859 Build what ADR-329 and ADR-330 specify:
.ty, type parameters, T::kind, match on a kind
- #847 Orchestrator: scripts/orchestrate.nika runs architect and builders without the main session
- #821 All tests in Nikaia: build ADR-269 D22 (
tests/NAME.nika + .stdout/.stderr), then move the Rust suite leaves first
- #797 Facts about data, step 1: a named property (
assert(is_sorted(xs))) is proved by name, carried to callers, checked once (ADR-381)
- #789
nikaia describe: method paths, generic results and explicit type arguments for Rust crates
- #784 CI: extend the unsafe_crates job - Miri daily, Kani and fuzzing, failures reported and the checks documented
- #749
f64::checked_i32/i64/u8/u32/u64 are specified but not built
- #745 Sweep the accepted programs without
main through rustc too, as library crates
- #743 A text position is a
text::Pos: find gives a Match, cuts are before/after/between, moves name their unit (ADR-374)
- #741 Two tests fail now and then in CI: an idle pool's wake count, and node's c-library binding
- #729 u8 gets the wrapping_, saturating_, checked_ names and truncating_u8 / checked_u8 (ADR-285 D41)
- #727 Lowering a package does the same work three to five times: a tenth of today's cost
- #717 Parallel folding without a grammar: task::cores(), Par::fold, Bytes::par_pieces, pieces claimed while running, order: (ADR-372)
- #714 Build ADR-369: a type's invariant, written as an
assert after a struct's fields, and found where none is written
- #701 std performance:
Bytes::find is a byte loop, range indexes are not inlined, Bytes::from(Vec) copies
- #690 With
CARGO_TARGET_DIR set, nikaia build leaves no target/nikaia/bin/<name>
- #682 Part I does not say how integer
/ and % round, and does not list div_euclid/rem_euclid
- #677 NK2203: a lock taken inside a lock is specified as refused (Part III C.6, ADR-281) but builds today
- #673 std::regex: RE2 dialect; typed by its engine; a known pattern compiled while building and run by std's code specialised for it; run-time patterns on regex-automata
- #659 Decision: is a text position that only literals fill a view of static text, or text of its own?
- #654 ref String: build the NK1261 warning, close the
ref int gap in NK1257, migrate, then refuse
- #650 Prover and diagnostics: a guard does not prove a claim on an unannotated
len(); underline over comments; --asserts omits derived contracts
- #649 Standard input and files are untrusted unless marked
trusted: true (ADR-365)
- #646 Lower the toolchain's package at
user_parallelism = yes so the compiler may use par_iter (ADR-363 D1)
- #643
[v; n]: a list or an array of n copies of a value that copies (ADR-362 D1-D4)
- #642 The prover follows a
let mut through each assignment (ADR-361 D9)
- #641 Result summaries reach fewer bodies than ADR-359 D1 says: any loop, assignment, match or lambda stops them
- #640 The prover reads through a loop: Horn clauses in the logic layer, a portfolio of strategies, every invariant checked, proposers (an LLM among them) only checked (ADR-361)
- #635
main's parameters are the command line; its preconditions are checked where the words arrive, a breach exits with status 2
- #632 The prover: a quotient, and a function's computed result without a written postcondition (decision basis)
- #630
int: the values of an i64, its representation the compiler's choice; a fixed width is exact and is written where the representation shows
- #628
ref String largely disappears: String is a view unless a copy is cheaper; the ledger states the public interface; ref stays only at the C boundary
- #627 View structs: two programs Nikaia accepts and rustc refuses, left after ADR-353 (#614)
- #625 Error sets are closed at every catch, and a code parameter not kept fails per call (ADR-357, ADR-error-sets-1): build the rest
- #624 A catch over a method that calls stored code matches the boxed error by its types without opening the box: rustc refuses (C.1)
- #623 A parameter may take a tuple apart, in a function and a lambda (ADR-358)
- #620 A function value keeps the error set the compiler inferred for it, whether it is called at once or kept
- #609 Single-variant enum shorthand for enums from other modules and packages (ADR-347)
- #604
json as an official package: read[T]/write[T] by ADR-299's rules, a build-time schema, json::Value (ADR-344)
- #595 Build ADR-342: a chain over a list runs element by element; an overflow in it may stop it at the end; a filter without a branch
- #591 A
HashMap/HashSet key that cannot be hashed passes the checker and fails in rustc (the sibling of D15)
- #590 Two mismatches between the documents and the compiler: no
nikaia check subcommand, and s.len() against Part I 2.6
- #587 The parser takes exponential time on nested parentheses, ifs and blocks, and overflows the stack at about 900 nested calls
- #586 Lowering defects found while moving the compiler: D1-D3, D8, D14-D19 and four new ones
- #585 NK2302 follow-ups: over-refusals, the coarse binding of a local, one caret at a declaration
- #584 Self-hosting check: C-5h, the rest below the core, C-6 (U-c1 to U-c11) and C-7
- #583 Self-hosting emit: the rest of the core (E9 U9-U10, E10, E11)
- #581 One lowered type per map: the hasher is decided per package, and at a package's boundary it is a type parameter (ADR-010 D9)
- #557 Build ADR-339: the grammar language gets
span(p), here, same_line; then the compiler's own grammar (parser/mod.rs) moves to Nikaia
- #556 Spike: a workshop held in memory, so a check without one can still compute build-time code
- #553 A narrowing
as is written only where it is shown to fit: NK1241, with checked_<T>() / truncating_<T>() (ADR-285 D12)
- #552
f32 is a type of the language: literals typed by use, no mixing with f64, f64 as f32 aborts beyond range (ADR-285 D33)
- #551 Releases from 0.1: crates.io under the nikaia_ prefix, then GitHub releases with the binary and one container image (ADR-336 D2, D3)
- #550
build_time_dependencies can hang: two grammar-action tests wait on each other's cargo
- #541 Installing before 0.1:
cargo install from the repository, a missing sysroot said in Nikaia's words, the first std build announced (ADR-336 D1)
- #539 Formats and protocols are official packages (
json, toml, csv, html, http1), not std; listed in std and taken in by their first use (ADR-338)
- #538 A directory of a project is a package and a
mod of one crate: use a::b, cycles allowed, [directories] (ADR-286 D37-D40)
- #537
nikaia new, and a #! line so a .nika file runs as a script
- #535 A refusal is tested as
tests/NAME.nika with the compiler's message in NAME.stderr, blessed like output tests (ADR-269 D22)
- #525 Compiled build-time code: NK1244 for a run that stopped, NK1165 retired, NK1102 bounds, NK1127 without a workshop
- #518 A
dsl block names its entry (dsl Json::value { … }) unless the grammar marks one main entry rule (ADR-299 D21)
- #490 ADR-327 D4-D11: memory budgets per task and per shared value — measured, decided, to build
- #470 A written
usize, i16, u128 or str is NK1135 outside extern "C" (ADR-286 D36); f32 joins the language in #552
- #468 Build ADR-321: compile and run build-time code against the dependencies, with a step budget
- #453 What a program needs to tune a text loop by hand: a byte search from a position, and reading text a word at a time (decision basis owed)
- #449 Build ADR-319: a file name is
fs::Path, the platform's own bytes
- #432 The prover: a counter per consumed item cannot overflow, bounded by the input's size
- #390 The default of
--optimization, and whether its proofs belong in nikaia.proofs
- #384 The bounds walk keeps no facts about a field of
self (self.at + 1 < self.c.len(), ~12 sites)
- #121 The server takes many connections at once
- #120 Response bodies:
Bytes, a mapping, http::File, and the kept mappings (ADR-058)
- #118 TLS for the HTTP server (
rustls)
- #116
std::db: the protocol (traits, statement, row values, Connection)
- #115 Build-time arguments on a
dsl block (dsl sqlite(schema: app) { … } eod)
- #114
meta::column and the statement's row type
- #101
nikaia fmt: one style with no options, every comment kept, meaning unchanged (ADR-337)
- #99 A Nikaia package is found by version (registry, the
nikaia_NAME prefix through Cargo)
- #88 A library for other languages (
artifact = "c-library")
Blocked
- #992 async: guide, docs and ADR re-pointing
- #991 async: remove overlap, task::scope and spawn
- #990 async: migrate overlap, task::scope and spawn programs and tests
- #989 async (ADR-async-4): errors - failure order, started/arrived sites, trace stitching
- #988 async (ADR-async-4, async-2): lowering - tasks, wait points, handles, par_iter execution, –overlaps, measurements
- #986 async (ADR-async-4, async-2): checker - wait points, groups, touch sets, handles, par_iter lambdas
- #923 Move crates/orchestrator into Nikaia completely and delete the crate (O1 cache.rs, O2 project.rs)
- #850 std: no JSON reader (agent.nika searches the text for the first "key":)
- #751 No word is read past the end of a
Bytes; a program pads the end itself (ADR-320 D13)
- #674 Move scripts/site-issues.py to Nikaia (CLAUDE.md: helper tools are written in Nikaia)
- #605 Unjoined tasks: what happens to an error nobody waits for (fatal ones included)
- #520 Build ADR-296 D25:
pub grammar - a package offers its grammar's entries
- #505 The checker types a
dsl block's result
- #485 Decide: how a
dsl block names a grammar that comes from a package
- #478 ADR-270 D24-D26: the logic layer as a package any package may ask, also at build time
- #477
dsl … -> T { … } eod: a block's rows are a declared struct, matched by name, strictly, NULL only into T? (ADR-299 D15-D19)
- #452 A mapped file cannot be used as text: three spellings pass the checker and fail in rustc
- #276 WebAssembly: where a parser's hash keys come from (
getrandom on wasm32)
- #126 Stage 2: the lowered compiler lowers its own sources to byte-identical Rust
- #119 HTTP/2 for the HTTP server
- #117 The
sqlite driver: both grammars, the schema check, and the connection typed by its schema
- #112 A binding is a generated file over the C library (
nikaia bind python / js)
- #111 A WebAssembly library is the same entry point on another target
- #110 An async call can be cancelled, and a stream is a callback
- #109 The symbol prefix is one line in the build (
symbol-prefix)
- #108 A struct crosses the C boundary by value (
pub extern "C" struct)
- #105
fortunes.nika runs: the postgres block, route, and handlers that return a String
- #94 A target without an operating system (bare metal)
Notes
- #1133 ADR-views-2 §6, left for later:
mut on one name of a tuple pattern, and a map's values written in place (NK1307)
- #982 Defect triage 2026-10-29: fix in moved Nikaia, defer the rest to its move
- #647 Later: the toolchain's Nikaia gets a crate of its own, apart from
nikaia-std (ADR-363 D2)
- #644 Low priority: warn on a list literal of one range,
[0..181] (NK1281, ADR-362 D5)
- #599 Deliver a standalone, API-accessible general-purpose proof assistant
- #577 A tree rebuilt by value reuses the memory of the node it replaces (Lean 4 / Koka "functional but in place")
- #549 Doc tests built once: each block a package of its own, all of them modules of one crate - measure first
- #514 Use cases for
f[T](), a type named in brackets at a call (NK1233 asks for them)
- #497 Decide: the checker stays silent about a type it does not know (Part III C.4) - is that right? -> no
- #475 After the MVP: a query's rows without repeated values in memory (Shared fields, zero-copy rows, SQLite specifics)
- #423 Standard input as a full pipe pays the worker hand-off per 8 KiB chunk (ADR-263 §6: measure first)
- #393
Workers Builds: nikaia fails on every pull request
- #373 A
Shared a call hands back stays atomic at yes even where it never crosses a thread
- #125 Stage 1:
main's pipeline (read, check, lower) runs Nikaia end to end
- #100
nikaia describe for a crate declared by version, and the rustdoc-JSON reader
- #97 What is left of a type that holds itself (patterns through a box, guards,
null without allocation)
- #91 Self-hosting: Nikaia compiling Nikaia (Stage 1 and Stage 2)
- #90 The HTTP server, second half: TLS, HTTP/2, more bodies
- #89 A database is reachable:
std::db, and a driver that checks the SQL while the program is built
Without a status label