| bug-a-riscv32-and-xtensa-have-no-atomic-codegen |
S |
45 |
bug |
riscv32 (and xtensa) reject every _pxxatomic* op — 'unsupported node in IR codegen: atomic' — so any unit touching an atomic cannot be compiled for them at all, on the two targets whose OS gives real concurrent tasks |
— |
| bug-a-write-fixed-fraction-digits-past-16-are-invented |
A |
35 |
bug |
SILENT: write(v:w:d) gets the INTEGER part exactly now, but the fraction is still scaled through a Double — 1/3 at :0:30 prints ...333312 where the double's exact tail is ...333314829616256247, so digits 17-18 are wrong and 19+ are zeros presented as digits |
— |
| bug-b-crtl-esp-close-cannot-dispatch-socket-vs-file |
S |
30 |
bug |
On ESP-IDF, close() cannot serve both file and socket fds — PalClose is fclose(ptr), PalSocketClose is lwip_close. crtl now has one close() (the file one), so socket close is wrong there |
— |
| bug-b-futex-helpers-are-trapped-behind-pxxclone |
B |
35 |
bug |
PalFutexWait/Wake live in palthread next to __pxxclone, so any unit wanting a blocking lock inherits the --threadsafe compile gate; that forced syncobjs' TCriticalSection to be a spinlock and palatomic to be a separate unit |
— |
| bug-c-header-with-a-body-compiles-twice-across-the-macro-reset |
C |
35 |
bug |
A crtl header that carries a BODY (stdarg.h's static _pxx_va* helpers) is compiled twice — its include guard is invisible to the late crtl pull because a THIRD CPreprocess invocation in between clears the macro table |
— |
| bug-c-static-functions-in-different-crtl-modules-collide |
C |
50 |
bug |
static functions with the same name in two crtl .c files (or a static in a header) share one unit identity, so the duplicate-definition warning false-fires — legal C flagged as a redefinition. Blocks promoting that warning to an error |
— |
| bug-nilpy-augmented-subscript-evaluates-its-index-twice |
N |
30 |
bug |
NilPy: d[key()] += 1 calls key() TWICE — the augmented-subscript desugar re-evaluates the base and index. CPython evaluates each once. The stored value is correct; only a side-effecting index is observable. |
— |
| bug-nilpy-container-membership-ignores-the-eq-dunder |
N |
35 |
bug |
x in [a, b] compares boxed handles, so a class's eq is ignored and membership is False for an equal-but-distinct object — the same runtime-dispatch gap as list.sort() ignoring lt |
— |
| bug-nilpy-def-returning-a-precreated-global-has-no-return-type |
N |
35 |
bug |
rd().field does not PARSE when rd() returns a module global that was pre-created because a def above reads it — 'unexpected token'. Binding the call result to a name first works, so only the direct selector-off-call-result form fails |
— |
| bug-nilpy-del-on-a-plain-variable-silently-does-nothing |
N |
30 |
bug |
NilPy: del x on a plain variable is accepted and does nothing — the name stays bound, so reading it afterwards returns the old value where CPython raises NameError. del lst[i] and del d[k] are correct. |
— |
| bug-nilpy-dynamic-receiver-callable-field-casts-to-the-wrong-class |
N |
40 |
bug |
SILENT->CRASH: with two classes declaring the same field name, a call through a dynamically-typed receiver hard-casts to whichever class the scan found FIRST — the field offset is read from the wrong layout, no diagnostic |
— |
| bug-nilpy-encode-ignores-the-codec |
N |
30 |
bug |
NilPy: str.encode / bytes.decode ignore the codec argument |
— |
| bug-nilpy-list-of-custom-objects-loses-repr-str |
N |
40 |
bug |
A user class instance boxed in a list/dict prints as empty, losing __repr__/__str__ |
— |
| bug-nilpy-list-sort-ignores-lt-dunder-on-objects |
N |
35 |
bug |
list.sort() on user objects with __lt__ raises a runtime TypeError instead of using it |
— |
| bug-nilpy-list-sort-method-missing |
N |
35 |
bug |
list.sort(key=...) (the in-place METHOD) is missing — sorted() works fine |
— |
| bug-nilpy-module-global-rebound-scalar-then-class-loses-dispatch |
N |
45 |
bug |
NilPy: operator dunders NEVER dispatch on a VARIANT operand holding a user class — dispatch is compile-time only. Scalar-then-class rebinding is just one way to get a variant. |
feature-nilpy-runtime-dunder-dispatch-on-variants |
| bug-nilpy-multiple-inheritance-does-not-parse |
N |
40 |
bug |
class D(B, C): does not parse — a second base is an 'unexpected token' at the comma, so multiple inheritance and every mixin idiom is unavailable |
— |
| bug-nilpy-non-ascii-string-surface-measured |
N |
35→40 |
bug |
The measured non-ASCII surface: len, upper, chr, ord all diverge |
— |
| bug-nilpy-plain-class-callable-field-unreachable-through-a-dynamic-receiver |
N |
35 |
bug |
A plain class's Callable field records no signature, so def run(o): o.native(x) on a dynamically-typed receiver is a COMPILE ERROR ("no class declares a method or callable field") — only a @dataclass field is reachable that way |
— |
| bug-nilpy-pyeval-fallback-still-binds-host-kwargs-by-position |
N |
45 |
bug |
The pyeval fallback still binds a host method's kwargs by POSITION |
— |
| bug-nilpy-reversed-list-repeat-returned-from-a-def-infers-int |
N |
30 |
bug |
SILENT WRONG VALUE: def f(u): return u * [7] returns the list HANDLE as an integer — the reversed LIST repeat is built correctly but the def's inferred return type is Integer. u * bytes(...) and [7] * u are both fine. |
— |
| bug-nilpy-same-kind-undefined-operators-still-compute |
N |
60 |
bug |
Same-kind undefined operators still compute silently ("ab" - "ab" → 0) |
decide-nilpy-set-as-a-distinct-type-or-a-list |
| bug-nilpy-set-is-a-list-not-a-set |
N |
55 |
bug |
set() returns a TPyList: elements are NOT deduplicated and it prints with list syntax, so set([1,2,2,3]) gives [1, 2, 2, 3] instead of {1, 2, 3} — silently wrong |
decide-nilpy-set-as-a-distinct-type-or-a-list |
| bug-nilpy-uforth-dot-paren-prints-nothing |
N |
40 |
bug |
ROOT CAUSE FOUND: .( prints nothing because NilPy strings are BYTE strings — uforth slices a str by a byte offset and the em-dashes in .UFO sources push it past the end. Not a new bug: it is the known, deliberate model (bug-nilpy-non-ascii-string-surface-measured). 8/11 of the suite is identical. |
bug-nilpy-non-ascii-string-surface-measured |
| bug-nilpy-unsupported-protocols-repr-iter-getattr-delitem-hash |
N |
35 |
bug |
NilPy survey: repr(), iter/next, getattr, delitem and a custom hash are unsupported — all fail LOUDLY (compile error or raise), measured vs CPython |
— |
| bug-p-uses-order-does-not-decide-which-unit-wins |
P |
60 |
bug |
Two units exporting the same routine: FPC takes the LAST in the uses clause, pxx takes the first. The naive fix (last declaring scope wins in FindProc) was measured to break the NilPy stdlib and the compiler's own self-compile — FindProc's return value is an overload-set REPRESENTATIVE that other code reads types off |
— |
| bug-t-a-self-healed-red-leaves-a-permanent-prio-70-stub-at-the-head-of-the-queue |
T |
60 |
bug |
twatch files a prio-70 stub on NEW-RED but never closes or annotates it when a later report moves the same job to FIXED, so a self-healing red outranks all real work indefinitely. |
— |
| bug-t-bench-slowdowns-are-quantized-by-cpu-p-state |
T |
55 |
bug |
The bench series' slow rows on xeon/plexus are not a contention continuum — they are QUANTIZED at 1.238x, the E5-2620 v2's 2.6/2.1 GHz boost-to-base ratio, which makes a void row detectable from the number alone |
— |
| bug-t-check-does-not-notice-a-status-line-that-contradicts-the-folder |
T |
40 |
bug |
A ticket's - **Status:** working body line drifts from the folder that actually holds it, and progress.sh check --strict says nothing. Twenty tickets had claimed working while working/ was empty — nine of them in backlog/unfinished, where it falsely signals a live lock. |
— |
| bug-t-empty-range-regression-cannot-be-bisected |
T |
55 |
bug |
When a run's parent_tested IS the tested sha, the regression's range is empty and idle bisect can never narrow it — so those tickets sit until a human bisects by hand |
— |
| bug-t-gate-quick-fixedpoint-goes-red-on-any-builtin-addition |
T |
55 |
bug |
tools/gate.sh's fixedpoint seeds from PINNED and demands A==B==C, so it goes RED for every agent after any new builtin lands and stays red until re-pin — indistinguishable from the agent's own breakage |
— |
| bug-t-gate-sh-fixedpoint-does-not-iterate |
T |
60 |
bug |
gate.sh's inline fixedpoint() demands convergence in ONE pass from pinned, so it reports RED for every change that alters the compiler's own emitted code — the exact mistake the Makefile documents as wrong |
— |
| bug-t-pydiff-cpython-arm-fails-on-a-relative-path |
T |
45 |
bug |
pydiff.py reports a bogus DIFF for any file given as a relative path: run_cpython passes the full relative path while setting cwd to that path's dirname, so CPython exits 2 and every line reads 'cpython: <no line>' |
— |
| bug-t-three-network-tests-flake-and-cost-real-debugging-time |
T |
45 |
bug |
lib_net_v6only, lib_sockets and lib_platform_esp each pass or fail run-to-run with the SAME compiler, so a gate.sh lib RED and two cross-sweep A/B deltas in one night were all noise that had to be disproved by hand |
— |
| bug-t-tstate-launders-skip-into-pass |
T |
50 |
bug |
tstate records a SKIPPED job as "pass", so a green published state cannot be distinguished from one that actually ran — cross-host coverage differences are invisible exactly when they matter |
— |
| chore-makefile-testtmp-parameterize |
A |
45 |
chore |
Makefile: parameterize hardcoded /tmp test paths ($(TESTTMP)) — concurrent gates corrupt each other |
— |
| chore-web-secrets-sops-age |
A |
45 |
chore |
Website secrets: SOPS + age, encrypted-in-git, paper-backed key |
feature-web-track-w-bootstrap |
| compat-pascal-binop-operand-eval-order |
A |
15 |
compat |
pxx evaluates binary-operator operands left-to-right; FPC evaluates right-to-left |
— |
| compat-pascal-calling-convention-directives-uneven |
P |
35 |
compat |
stdcall/safecall/pascal/mwpascal are accepted on a class METHOD declaration but are a parse ERROR on a plain routine, an external, or a procedural type — so FPC sources that spell a convention on a routine do not compile, and which spelling works depends on where it is written. |
— |
| compat-pascal-class-helpers |
P |
25 |
compat |
pxx rejects FPC's class helper for T at parse time — TFooHelper = class helper for TFoo is error: unexpected token |
— |
| compat-pascal-directive-in-comment-ignores-nested-comments-off |
P |
25 |
compat |
With nested comments OFF (delphi mode), a {$...} sequence inside a brace comment does not end the comment in pxx, but does in FPC. Lax direction — pxx accepts sources FPC rejects |
— |
| compat-pascal-index-a-function-call-result |
P |
40 |
compat |
Indexing a function call's result — Copy(s,2,3)[1], Make[0], b.ArrP(3)[0] — either fails to parse or reaches IR lowering as an un-lowerable AN_CALL; FPC accepts all three |
— |
| compat-pascal-inline-generic-specialization |
P |
35 |
compat |
pxx accepts only the declaration form specialize Max<Integer> as MaxInt; — FPC's inline specialize Max<Integer>(a, b) in an expression or statement is rejected with 'undefined variable' |
— |
| compat-pascal-method-impl-without-declaration |
P |
20 |
compat |
TC.Foo implementation for a method the class never DECLARED compiles (FPC rejects) |
— |
| compat-pascal-supports-three-arg-out-form |
P |
30 |
compat |
Supports(obj, IFoo) works but FPC's three-argument Supports(obj, IFoo, out Ref) — the form that both tests AND retrieves the interface — is a parse error |
— |
| compat-pascal-thread-api-surface-differs-from-fpc |
B |
35 |
compat |
Threaded FPC code does not compile as-is: TThread lives in palthreadobj rather than Classes, there is no cthreads shim, WaitFor is a procedure where FPC's returns LongWord, and BeginThread/TThreadID do not exist |
— |
| compat-pascal-unit-deprecated-hint-directive |
P |
25 |
compat |
unit X deprecated 'msg'; — a unit hint directive is a parse error |
— |
| decide-nilpy-parallel-capture-semantics |
A |
5 |
decide |
DECIDE: NilPy parallel for-in capture model — what's private, what's shared, how reductions read |
— |
| docs-canonical-domain |
D |
45 |
docs |
Canonical domain in the docs |
— |
| docs-devnotes-ai-assisted-build |
D |
50 |
docs |
Developer notes: how this was actually built (AI-assisted, and honest about it) |
— |
| feature-a-abi-oracle |
A |
60 |
feature |
ABI oracle: backends consult it, and stop reading Syms[] |
— |
| feature-a-declaration-phase |
A |
55 |
feature |
A real declaration phase: all decls before any body is typed |
— |
| feature-a-promoint-variant-esp-targets |
S |
40 |
feature |
Promotable int in a Variant: riscv32 / xtensa |
— |
| feature-a-shrink-managed-header-on-32-bit |
A |
25 |
feature |
On ILP32 the managed-block header wastes 12 of its 24 bytes: three 8-byte slots each carrying a 4-byte value. Packing to 4-byte slots halves it — and the DEADLINE is phase 2, because it caps the meta word at 32 usable bits |
— |
| feature-a-why-threadsafe-needs-45pct-more-global-fixups |
A |
35 |
feature |
--threadsafe self-compile emits 45% more global fixups than the normal one (65657 vs 45326). Raising the cap unblocked it; nobody has explained the +45%, and it may be one fixup per TLS access that dedupes away |
— |
| feature-b-crtl-last-seven-unimplemented-declarations |
B |
40 |
feature |
The crtl declarations still without bodies — now 2: atexit and poll (chmod, umask, msync, mremap and ioctl landed 2026-08-05). Each is declared, so a caller binds silently to libc.so.6 and the 'self-contained' binary grows a DT_NEEDED |
— |
| feature-b-rtl-missing-fpc-surface-2026-08 |
B |
35 |
feature |
Missing FPC surface found by the differential probe (Eoln, TSeekOrigin, Sorted, IncMonth) |
— |
| feature-b-textreadchar-with-pushback |
B |
50 |
feature |
lib/rtl/textfile.pas needs TextReadChar(var f; var c) with one-character pushback, so read(f, c) can consume ONE character like FPC instead of a whole line |
— |
| feature-b-tstrings-commatext |
B |
30 |
feature |
TStrings.CommaText / DelimitedText are missing |
— |
| feature-c-csmith-differential-fuzzing |
C |
60 |
feature |
C differential fuzzing (csmith vs gcc) — campaign, PAUSED with the harness live |
— |
| feature-c-esp-conformance-coverage |
S |
35 |
feature |
C conformance / feature coverage on ESP (xtensa + ESP32-C3 riscv32 bare) |
— |
| feature-c-gtk3-header-final-wiring |
C |
45 |
feature |
GTK3 header import final wiring |
— |
| feature-c-package-namespace-decision |
A |
40 |
feature |
Decide the Pascal-import namespace for C packages (uses zlib collision) |
— |
| feature-c-vla-via-alloca |
C |
50 |
feature |
C variable-length arrays, lowered through alloca |
— |
| feature-cdecl-bodied-sysv-prologue |
A |
40 |
feature |
Bodied Pascal cdecl procs: genuine SysV prologue (float params, >6 args) |
— |
| feature-cli-widgetset-flag |
A |
20 |
feature |
CLI: --widgetset=<name> as sugar for -dWIDGETSET_<NAME>, so the flag reads like Lazarus' -ws |
— |
| feature-cross-frontend-interop-contract |
A |
45 |
feature |
Cross-frontend interop contract — umbrella |
— |
| feature-crtl-implement-libc-assumptions |
B |
10 |
feature |
crtl: implement the libc assumptions real-world C leans on |
— |
| feature-demo-nilpy-ide |
E |
40 |
feature |
Landmark demo: a minimal IDE in Nil-Python via import tk — max functionality, minimal code |
feature-nilpy-break-continue, feature-nilpy-tk-binding |
| feature-demo-portable-userland |
E |
55 |
feature |
PXX portable userland (mini OS-personality) — one shell, any kernel |
— |
| feature-demo-songformatter-pxx-target |
E |
50 |
feature |
songformatter as a pxx compile target (nilpy) — GUI editor + live preview |
feature-lib-pxxpdf-reportlab-compat, feature-nilpy-re-module, feature-nilpy-tkinter-facade |
| feature-dns-esp-backend |
S |
35 |
feature |
DNS on ESP — bind lwIP's getaddrinfo, do NOT build a separate backend |
— |
| feature-dynamic-compiler-tables |
A |
45 |
feature |
Dynamic compiler tables — kill the fixed array[0..MAX_*] ceilings (+ dynarray dogfood) |
— |
| feature-dynamic-include-paths-config |
A |
45 |
feature |
Dynamic Include Paths, Configuration Files, and System Scanner |
— |
| feature-dynamic-soname-discovery |
A |
45 |
feature |
Dynamic soname discovery (no execve) |
— |
| feature-dynarray-copy-nested-element-type |
A |
45 |
feature |
Copy() on a NESTED dynamic array (array of array of T) is refused. It used to segfault: the raw byte copy moved sub-array handles using the DEEPEST element's size. FPC supports it. |
— |
| feature-dynarray-insert-delete-managed-elements |
A |
45 |
feature |
Dynarray Insert/Delete: managed elements, record/set Insert, field/element targets |
— |
| feature-embed-dwscript-rtti |
P |
45 |
feature |
DWScript — compile under pxx + RTTI auto-bind (scripting stress test) |
— |
| feature-embed-pascal-script |
P |
45 |
feature |
RemObjects Pascal Script — compile under pxx (embeddable scripting) |
— |
| feature-emission-size-dce |
A |
45 |
feature |
Emission size — reachability-gated dead-code elimination (umbrella) |
— |
| feature-esp-hardware-flash-validation |
S |
45 |
feature |
ESP32 real-hardware flash + boot validation (S2/S3, C3) |
— |
| feature-esp-peripheral-callback-api |
S |
53 |
feature |
ESP32 peripheral callback API (timer / GPIO / ADC) — the user-facing "interrupt" |
— |
| feature-float-exception-mask-control |
A |
60 |
feature |
Float exception mask control (SetExceptionMask-style, FPC emulation opt-in) |
— |
| feature-inline-asm-xmm-operands |
A |
55 |
feature |
Inline asm cannot express float or vector code (no xmm operands, no packed SSE, no VEX, no cpuid) |
— |
| feature-inline-asm-xtensa |
A |
60 |
feature |
Inline asm blocks on xtensa (last leg of the multi-arch rollout) |
— |
| feature-inline-nonleaf-and-branch-locals |
O |
45 |
feature |
Inline expansion — remaining slices (branch-with-locals + non-leaf) |
— |
| feature-lib-reportlab-fidelity-vs-oracle |
B |
45 |
feature |
The reportlab mimic produces a VALID PDF, never one shown to agree with real reportlab. Differential-test lib/pcl/mimic_reportlab_* against CPython+reportlab on the same script |
— |
| feature-mimic-fpc-compiler-define-profile |
A |
50 |
feature |
FPC-compiler define profile (fpcdefs.inc build-config gates) |
— |
| feature-move-fillchar-intrinsics |
A |
45 |
feature |
Move / FillChar as compiler intrinsics (future optimization) |
— |
| feature-n-nilpy-ast-typing-module-scope |
N |
55 |
feature |
NilPy: type MODULE locals from the AST too |
— |
| feature-nested-routine-fixed-array-capture |
A |
35 |
feature |
Nested routines: capture of fixed-size array locals not supported |
— |
| feature-networking |
B |
20 |
feature |
Networking runtime |
— |
| feature-nilpy-arc-cross-parity |
A |
35 |
feature |
NilPy object-ARC cross-target parity (aarch64 inline arms + scope-exit) |
— |
| feature-nilpy-arithmetic-dunders-full-protocol |
N |
40 |
feature |
Arithmetic dunders (__add__, __sub__, …) — full protocol |
— |
| feature-nilpy-arithmetic-ordering-dunders |
N |
60 |
feature |
NilPy arithmetic/ordering dunders — umbrella |
— |
| feature-nilpy-break-continue |
A |
40 |
feature |
NilPy: support break / continue in while (and for) loops — v1 subset lacks them |
— |
| feature-nilpy-collections-and-string-methods |
A |
50 |
feature |
NilPy: list / dict + string methods (split/join/strip) |
— |
| feature-nilpy-corpus-uforth |
N |
55 |
feature |
NilPy corpus: uforth — a real Python Forth system as Track N's forcing target |
— |
| feature-nilpy-cpyext-c-api-from-source |
N |
65 |
feature |
cpyext: compile a CPython C extension's SOURCE against our own Python.h |
— |
| feature-nilpy-dataclass-expression-field-default |
N |
40 |
feature |
A @dataclass field default may only be a scalar literal, field(default_factory=list/dict) or a zero-arg lambda. An expression (x: int = 2 + 3) is refused; a plain class attribute with the same initialiser is evaluated |
— |
| feature-nilpy-for-loop-getitem-protocol-fallback |
N |
25 |
feature |
for x in obj: doesn't fall back to __getitem__/__len__ for a custom container |
— |
| feature-nilpy-hasattr-per-instance-assigned-tracking |
N |
40 |
feature |
hasattr reports True for a field the instance never assigned — if flag: self.m = 1 then hasattr(a,"m") on a False path answers True where CPython answers False. The remaining half of the DECIDED decide-nilpy-hasattr-per-instance-semantics: the per-instance assigned bit. |
— |
| feature-nilpy-hoist-constant-container-literals-out-of-a-loop-condition |
N |
30 |
feature |
NilPy: while x in (\"a\",\"b\") now rebuilds the constant tuple on every test. A provably-constant container build is loop-invariant and should be hoisted to a variable once — what a person would write by hand — while everything else keeps being folded into the condition. |
— |
| feature-nilpy-idf-import |
A |
45 |
feature |
nilpy includes anything from ESP-IDF and it just works |
feature-c-source-frontend, feature-esp32-idf-xtensa |
| feature-nilpy-lambda-compiled-closure |
N |
45 |
feature |
nilpy: lambdas are interpreted by pyeval — compile them like nested defs (perf + one semantics) |
— |
| feature-nilpy-list-sort-inplace-key-reverse |
N |
30 |
feature |
xs.sort(key=..., reverse=...) — only the free function sorted() supports key/reverse |
— |
| feature-nilpy-map-and-filter-over-a-lambda |
N |
40 |
feature |
map(lambda ...) is unimplemented and filter does not exist |
— |
| feature-nilpy-multi-arg-callback-bridges |
N |
35→40 |
feature |
nilpy runtime: pycallback_call2/3 and a multi-parameter bound-fn call, so a callable can receive more than one own argument |
— |
| feature-nilpy-nested-def-as-value |
N |
15 |
feature |
SUPERSEDED: nested def as a VALUE (stored, passed, returned) |
— |
| feature-nilpy-parallel-for-in |
A |
5 |
feature |
NilPy parallel for-in — lower a marked for-loop to the shared PXXParallelFor runtime |
decide-nilpy-parallel-capture-semantics |
| feature-nilpy-process-exec-binding |
N |
45 |
feature |
nilpy: os.system / subprocess-shaped process spawning over the RTL's libc-free execve |
— |
| feature-nilpy-runtime-method-dispatch-on-variant |
N |
50 |
feature |
NilPy: dispatch a method call on a VARIANT receiver at RUNTIME |
— |
| feature-nilpy-set-needs-runtime-tag-for-display-and-equality |
N |
40 |
feature |
A set needs its own runtime tag — two divergences from list share this root cause |
— |
| feature-nilpy-small-syntax-gaps-found-by-the-2026-08-06-sweep |
N |
30 |
feature |
Ordinary Python forms NilPy diagnoses cleanly but does not accept. print(sep=) and str.format() with 3+ (and 0) placeholders are DONE (2026-08-08); ten rows remain: enumerate(str), type(x) other than .name, a non-name lambda default, dict(x=1), .update(b=2), extended-slice assign, self.class.name, nested unpacking, bare tuple, two-for comprehension |
— |
| feature-nilpy-starred-and-nested-unpacking |
N |
50 |
feature |
Starred and NESTED unpacking targets |
— |
| feature-nilpy-staticmethod-and-classmethod |
N |
35 |
feature |
@staticmethod and @classmethod are rejected |
— |
| feature-nilpy-stdlib-coverage-gaps-measured |
N |
30 |
feature |
Measured stdlib coverage: json and re are solid; os, time and math.fabs are absent |
— |
| feature-nilpy-str-format-named-keyword-fields |
N |
25 |
feature |
"{name} is {age}".format(name=..., age=...) — named fields not supported |
— |
| feature-nilpy-thirdparty-libraries-as-targets |
N |
60 |
feature |
META: third-party Python libraries as pxx targets — classify, then compile |
— |
| feature-nilpy-tkinter-facade |
N |
50 |
feature |
nilpy: tkinter-shaped façade over lib/pcl/tk.pas — widget objects, kwargs, command callbacks |
feature-nilpy-star-args-kwargs |
| feature-nilpy-yield-outside-a-for-loop |
N |
35 |
feature |
yield only works inside a for — a while-loop generator does not compile |
— |
| feature-opt-accumulator-value-tracker |
O |
58→60 |
feature |
The register-value scaffold two -O passes are blocked on: a single choke point for every write to the accumulator, so a 'rax currently holds symbol S' fact can be maintained without a silent-miscompile risk. Today rax is written from hundreds of scattered raw EmitB sites. |
— |
| feature-opt-alloc-intent-hint |
O |
25 |
feature |
Allocation-intent hint: tell the RTL growth policy how a buffer will be used |
— |
| feature-opt-bulk-copy-is-byte-at-a-time |
O |
45 |
feature |
The runtime's bulk-copy primitives move ONE BYTE per iteration. Copy() on a 64-element array is ~23x slower than FPC's (2.54s vs 0.11s over 3M copies). A word-at-a-time loop -- ~10 lines, portable, no backend work -- was prototyped and measured at 3.3x of that back. |
— |
| feature-opt-complex-packed-double |
O |
35 |
feature |
Complex as a packed-double XMM value (SSE2/SSE3) |
— |
| feature-opt-float-register-temporaries |
O |
20 |
feature |
float kernels: -O3 now 1.97x vs FPC (was 4.2x); residual = the rax value model — multi-session xmm-resident rewrite |
— |
| feature-opt-heap-per-thread-cache |
O |
55 |
feature |
Heap allocator serializes under threads — parallel alloc is 3x SLOWER than serial |
— |
| feature-opt-o3-register-pressure |
O |
58 |
feature |
-O3 register-pressure tier: operand scheduler + liveness-scaffold register allocator |
— |
| feature-opt-rtti-emit-on-use |
O |
40 |
feature |
RTTI is emitted unconditionally (every class, even a classless program) — dead weight on ESP32/embedded |
— |
| feature-p-assertions-directive-and-position |
P |
40 |
feature |
Implement FPC assertion parity: {$ASSERTIONS ON/OFF} and -Sa gating (Assert compiled OUT when off, so its side effects do not run), plus the '(file, line N)' suffix FPC appends to the message |
— |
| feature-pal-esp-posix-fd-semantics |
S |
30 |
feature |
ESP PAL: exact POSIX fd semantics over ESP-IDF VFS |
— |
| feature-parallel-load-sampler-refine |
B |
20 |
feature |
Parallel load sampler — refinements (ramp/EMA, BSD/cgroup) |
feature-os-targets-bsd-mac |
| feature-pascal-asmmode-directive-tolerance |
A |
50 |
feature |
Accept {$asmMode default} (and other non-intel asmmode values) |
— |
| feature-pascal-builtin-tobject-class |
A |
42 |
feature |
Builtin TObject class — var o: TObject + TObject.Create + root methods |
— |
| feature-pascal-class-management-operators |
P |
48 |
feature |
class operator + named operators (Initialize/Finalize/Explicit/...) |
— |
| feature-pascal-corpus-expansion |
P |
15 |
feature |
Pascal real-world corpus expansion — the ladder Track P never had |
— |
| feature-pascal-corpus-fpc-testsuite |
P |
60 |
feature |
Pascal corpus rung 1 — FPC test-suite subset (conformance) |
— |
| feature-pascal-corpus-oop |
P |
60 |
feature |
Pascal OOP corpus — real libraries that hammer classes/interfaces/generics |
— |
| feature-pascal-corpus-passrc |
P |
45 |
feature |
Pascal corpus: fcl-passrc — ENDGAME. Deep class hierarchy + resolver (60k src, 40k tests) |
feature-pascal-corpus-fpcunit, feature-pascal-corpus-fpjson |
| feature-pascal-exitcode-finalization-halt |
A |
45 |
feature |
ExitCode global + unit finalization execution + FPC Halt semantics (Halt sets ExitCode, runs finalizations, exits with ExitCode) |
— |
| feature-pascal-initialize-finalize-intrinsics |
A |
50 |
feature |
Initialize() / Finalize() standard procedures (managed-type intrinsics) |
— |
| feature-pascal-type-helpers |
A |
55 |
feature |
record helper for T / type helper for T — type helpers |
— |
| feature-pasmith-divergence-signature-granularity |
T |
35 |
feature |
pasmith divergence signatures are too coarse: end-of-program divergences all collapse to pxx-vs-fpc_trace-length, so distinct bugs can over-dedup and hide each other |
— |
| feature-pasmith-multi-unit-programs |
T |
55 |
feature |
pasmith: generate multi-UNIT programs — the last structurally unreachable bug class |
— |
| feature-pasmith-qplus-rplus-rungs |
T |
30 |
feature |
pasmith rungs for {$Q+}/{$R+}: generate checked regions + try/except EIntOverflow/ERangeError harnesses, differential vs FPC |
— |
| feature-pcl-cross-platform-gui |
B |
30 |
feature |
UMBRELLA: cross-platform GUI — copy the LCL widgetset model; PCL = TComponent tree behind a TWidgetSet seam; compile-time widgetset select; sparse widgetset×OS matrix, hard-fail the rest |
feature-pcl-seam-seal, feature-pcl-widgetset-select, feature-pcl-win32-widgetset |
| feature-pcl-tk-windows-compat |
B |
25 |
feature |
NilPy tk on Windows — quarantine the Tcl/Tk-DLL-swarm problem behind a {$ifdef WINDOWS} include in tk.pas; emulate/wrap, stub now fill later. Linux keeps the real embed |
feature-port-windows-pe |
| feature-pcl-win32-widgetset |
B |
25→30 |
feature |
PCL: native Win32 widgetset — a 2nd TWidgetSet subclass over user32/gdi32, zero-dep (no GTK bundle). Best-effort, UN-GATED (no Windows box, Wine-smoke only) |
feature-pcl-seam-seal, feature-port-windows-pe |
| feature-port-freebsd-native |
A |
55 |
feature |
FreeBSD/amd64 native target — raw-syscall ELF, own syscall table, carry-flag error convention, ELF brand |
— |
| feature-port-multi-os-abstraction |
A |
55 |
feature |
UMBRELLA: abstract the target-OS axis — FreeBSD (native) + Windows (PE, Wine-tested), phased |
feature-port-freebsd-native, feature-port-rtl-over-libc, feature-port-windows-pe |
| feature-port-openbsd-libc |
A |
50 |
feature |
OpenBSD/amd64 target — route RTL through libc.so; pinsyscalls satisfied by construction |
feature-port-rtl-over-libc |
| feature-port-rtl-over-libc |
A |
55 |
feature |
RTL-over-libc lowering mode — route runtime primitives through a system C library instead of raw syscalls |
— |
| feature-port-windows-pe |
A |
25→55 |
feature |
Windows/x64 target — PE/COFF writer, MS x64 ABI, IAT imports; testable via Wine |
feature-port-rtl-over-libc |
| feature-promo-launch-plan |
A |
25 |
feature |
Promo & launch plan — visibility now, 0.1 beta next, the loud moment last |
— |
| feature-pyeval-closure-as-native-word |
N |
50 |
feature |
pyeval: a nested def passed to a host method, called back later (closure-as-native-word) |
— |
| feature-random-library |
B |
45 |
feature |
Random library — HW/OS/software tiered RNG (cross-target capability test) |
feature-inline-asm-xmm-operands |
| feature-real-dynlib-loader |
B |
45 |
feature |
Real dynamic-library loader (dlopen) — PAL primitives + libc policy |
bug-pascal-procvar-in-value-context-takes-address-instead-of-calling |
| feature-release-checksums-repro |
A |
50 |
feature |
Verifiable releases: checksums + signatures + the reproducible-build claim |
— |
| feature-signal-siginfo-ucontext |
A |
55 |
feature |
Signal handlers, phase 2: SA_SIGINFO + ucontext, threadsafe masks, sigaltstack, FPC-compat surface |
— |
| feature-t-est-mem-from-measurement |
T |
55 |
feature |
testmgr estimates the selfhost job at 1200 MB; measured peak RSS is 156 MB. An 8x error in one class means none of them were measured — it both under-packs big boxes and will exclude small ones |
— |
| feature-t-fpc-seed-canary-closer-to-the-dev-loop |
T |
55 |
feature |
The FPC seed build breaks every couple of days, always the same way, and only the watcher ever notices — yet it costs 10.7s. Put it where the person who broke it will see it. |
— |
| feature-t-nilpy-cpython-differential-fuzzer |
T |
20 |
feature |
NilPy differential fuzzer — generate NilPy programs, diff pxx output against CPython as oracle |
— |
| feature-t-per-invocation-tmp-namespace-for-make-recipes |
T |
55 |
feature |
The Makefile's ~3700 fixed /tmp/test_* output paths make two concurrent make test* runs on one box clobber each other; route them through a per-invocation temp dir |
— |
| feature-t-testmgr-owns-pinning-interruptible |
T |
60 |
feature |
Move the pin gate into testmgr so pinning is scheduled, resource-aware and INTERRUPTIBLE, instead of a long foreground gate.sh run a dev agent has to babysit |
— |
| feature-t-uforth-benchmark-harness |
T |
45 |
feature |
Track T: uforth benchmark harness — pxx-compiled vs interpreted Python baselines |
— |
| feature-t-windows-wine-harness |
T |
25 |
feature |
Windows/Wine test bed — scratch-prefix wine runner + mingw-w64 differential oracle, hello-world gate |
— |
| feature-threadsafe-heap-optimize |
A |
53 |
feature |
Threadsafe heap — optimize + cross-target (M5) |
— |
| feature-tls-provider-abstraction |
B |
53 |
feature |
TLS provider abstraction — pluggable backends (OpenSSL + handrolled) |
feature-tls13-from-scratch |
| feature-toolchain-cli-ux |
A |
45 |
feature |
Toolchain CLI / user tooling (install, config, discovery, doctor, selfcheck) |
— |
| feature-twatch-full-tier-coverage-age |
T |
40 |
feature |
No signal distinguishes "full tier is lagging" from "full tier never completes" |
— |
| feature-typeinfo-all-types |
A |
50 |
feature |
TypeInfo(T) for every type, not just enums |
— |
| feature-typinfo-facade-unit |
B |
50 |
feature |
typinfo facade unit: FPC's RTTI API shapes over OUR blobs |
feature-typeinfo-all-types |
| feature-unicodestring-model |
A |
40 |
feature |
A real UnicodeString / WideChar model (UTF-16), or an honest refusal |
— |
| feature-web-track-w-bootstrap |
A |
40→45 |
feature |
Track W (website) — bootstrap the lane: two repos, one board |
— |
| feature-web-tracker-and-host-portability |
A |
45 |
feature |
Public tracker on GitHub + host-portability rule (nothing lives only in a service) |
feature-web-track-w-bootstrap |
| feature-writeln-as-library |
A |
45 |
feature |
write/writeln as a library function (via array of const + variadic sugar) |
— |
| idea-adaptive-heap-growth |
A |
10 |
idea |
Adaptive heap growth policy (research / north-star — not scheduled) |
— |
| idea-c-realworld-test-targets |
C |
25 |
idea |
Real-world C programs as compiler stress tests (brainstorm) |
— |
| idea-cross-namespace-ambiguity-warning |
A |
10 |
idea |
Warn when a call name matches in BOTH the Pascal and C namespaces |
— |
| idea-public-status-page |
D |
30 |
idea |
Publish a live compatibility/corpus status report on the website — the static docs/reference/status.md page exists; wire it to the already-generated tstate reports (twatch_web conformance.html/bench.html/dashboard.html) so public numbers stay current instead of hand-maintained |
— |
| meta-constant-normalisation |
A |
45 |
meta |
Standing index: stop writing compiler code that branches on constant-vs-variable. Each constant expression becomes its own uniquely-named read-only variable, so downstream has ONE shape to handle. Goal is less double work on future fixes, not speed. |
— |
| meta-dialect-extensions-and-fpc-strict |
A |
60 |
meta |
Meta: pxx dialect extensions ⟷ FPC compatibility (two aims, switch-guarded) |
— |
| meta-t-dev-throughput-and-track-a-t-integration |
T |
40 |
meta |
META: development is wait-limited, not token-limited. Dev tracks stop running suites; T owns breadth and its report LATENCY becomes the product. Coordinates the tooling tickets that get us there. |
— |
| perf-c-parse-codegen-large-file-superlinear |
A |
30 |
perf |
perf: C parse+codegen shows mild superlinear scaling on very large amalgamations |
— |
| perf-nilpy-remaining-perbyte-string-builders |
N |
30 |
perf |
NilPy: remaining pylib string builders still append per-byte (O(n²)) |
— |
| refactor-a-variant-object-tag-list-lives-in-four-places |
A |
45 |
refactor |
The set of variant tags whose payload is a refcounted object is written out in FOUR independent places; a tag added to some and not others leaks silently, with RSS as the only symptom. One of them also just zeroes object payloads outright. |
— |
| refactor-centralize-managed-string-pchar-conversion |
A |
45 |
refactor |
Populate pointer-element-type metadata consistently (additive, fallback-preserving) — kill the recurring silent PChar/WideChar-conversion class at its source |
— |
| regression-test-i386-test-dynarray-field |
T |
70 |
regression |
regression: test-i386#src:test/test_dynarray_field.pas red at 899e51cda3ba (auto-filed by twatch) |
— |
| regression-test-nilpy-test-nilpy-for-two-names-over-a-variant |
T |
70 |
regression |
regression: test-nilpy#src:test/test_nilpy_for_two_names_over_a_variant.npy red at b51f4eeffbf9 (auto-filed by twatch) |
— |
| regression-test-nilpy-test-nilpy-function-values |
T |
70 |
regression |
regression: test-nilpy#src:test/test_nilpy_function_values.npy red at 082e5175beba (auto-filed by twatch) |
— |
| task-b-revert-pxxcio-clock-int64-cast-workaround |
B |
45 |
task |
Revert the __pxx_clock workaround in lib/rtl/pxxcio.pas — its blocker (the explicit Int64() cast of a NativeInt on 32-bit) is fixed, and the idiomatic one-liner is verified correct on x86-64, i386 and arm32 |
— |
| task-d-document-warn-ignored-directives |
D |
30 |
task |
New --warn-ignored-directives flag needs a row in docs/reference/cli.md, and the routine-directive table in docs/language/dialect.md should point at it as the way to find out which markers are inert |
— |
| task-pascal-conformance-long-tail |
P |
12 |
task |
FPC-conformance long tail: RTL gaps, runtime faults, small parser holes |
— |
| task-t-drop-stale-known-tags-on-string-h-probes |
T |
50 |
task |
Four gcc_diff_probe cases are still tagged known but no longer diverge — the compiler bug behind them is fixed, so the tag now hides future regressions in str-chr-nul / str-str-empty / mem-chr-miss |
— |
| task-t-enroll-libtest-demos-watcher |
T |
45 |
task |
Enroll make lib-test + make demos in testmgr tiers — Track B's gate is invisible to tstate |
— |
| task-t-enroll-pascal-conformance-tier |
T |
45 |
task |
Enroll test-pascal-conformance in testmgr tiers (sharded, like the C battery) |
— |
| task-t-xeon-host-local-health-alerting |
T |
50 |
task |
The health VERDICT landed (trackt health, e6ee21fcc) but nothing on xeon delivers it — no timer, no toast. The watcher can go wedged with nobody told. |
— |