Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Experiment: a lint that marks nondeterminism like Rust's unsafe, measured on our consumers first (#1286)

Open
#1,287 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
45/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active
Tech stack
c
Domain
devtools

Research direction

The lint rule must identify calls to builtins hooked via TRACE_NONDET_RET/RECORD/TAKE macros (118 sites, 37 distinct builtins). Start by examining the macro definitions and the hook sites in the codebase to derive the class-1 set. Then identify concurrency builtins for class-2. Implement the lint to warn on unacknowledged calls, with within-file call-graph propagation. Run the lint on the listed consumer projects (liferaft, tidelog, etc.) and record warning counts and any real findings of undeclared nondeterminism.

Written by the indexing model from the issue text.

Description

area:lint-tooling area:trace-tape kind:decision

Part of #1286. Status: a measured experiment, not a commitment. Owner idea, 2026-09-23.

Idea. EigenScript's main claim is determinism, but nothing in a program's source says where determinism ends. Rust's unsafe is a required, greppable audit boundary. The EigenScript analogue marks where a program's output can depend on something outside its source and inputs, so that every nondeterministic point is either recorded on the tape or marked in the source.

Two classes, different weight:

  1. Captured: time, random, file/network/HTTP I/O, environment, audio/gfx input. The tape records these, so replay reproduces them. Milder.
  2. Uncaptured: thread scheduling (spawn, channels, tasks, shared state): which thread wins a lock is not on the tape, so replay cannot reproduce it. Tonight's race mutants in trace_mt live here. Louder.

Facts (main, 2026-09-23):

  • There is no central nondet table; builtins are hooked per site by TRACE_NONDET_RET/RECORD/TAKE("<name>", ...). 118 hook sites name 37 distinct builtins (args, clock_unix, env_get, file_exists, http_*, monotonic_*, net_*, random*, read_*, …). Derive the class-1 set from those sites (or have --api --json report a nondet flag) — never a hand-typed second list. Check that every hook passes a literal name; a variable name would hide a member.
  • Class 2 is not in that set; it needs its own derived list (the concurrency builtins).
  • The acknowledgment already exists: # lint: allow W0NN (and allow-file). No new syntax for the experiment.

Experiment:

  1. One new lint rule: a nondet call outside an acknowledged region warns; class 2 gets a stronger diagnostic. Within-file call-graph propagation only, stated as a limit.
  2. Run it over the consumers: liferaft, tidelog, DMG, Tidepool, dynamics, EigenMiniSat, iLambdaAi.
  3. Bar (Go vet's criteria, cmd/vet/README): frequency (does it surface REAL undeclared nondeterminism, e.g. in liferaft/tidelog's determinism tests?) and precision (is nearly every warning worth examining?). Record the counts and each real finding here.

Decision after measurement:

  • It finds real problems → keep the lint, and consider a nondet marker syntax and a --deterministic strict mode, each justified by the measured findings.
  • Noise or nothing → close with the numbers; it did not earn its place.

Out of scope for the experiment: new syntax, runtime strict mode, full effect typing (Koka/Unison-style).

Dominant language
C
Stars
3
Forks
7
Avg merge
4h 15m
Merged PRs (30d)
106

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from InauguralSystems/EigenScript

All issues in InauguralSystems/EigenScript

Similar issues

More C issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.