ARE WE NATIVE YET?
Live compatibility status of pyscriptc: which builtins, standard-library modules and PyPI packages compile to native code today, and which run on the island tier instead.
Two planes
A package can lower to machine code with no interpreter inside it, or it can run on the island tier, where an embedded CPython executes the code the subset cannot lower. The native column is the fence ratio over the package's own definitions. The island column is a run receipt: the package was compiled with the island fallback and its output was compared against CPython.
18 of 18pinned packages were measured to run on the island tieron 2026-11-14(18 of 18 receipts matched CPython).The probe is benchmarks/compat/top100/island_probe.py.
Builtins
3 full ·14 partial ·1 none
18 probed
Standard library
0 full ·68 partial ·0 none
68 probed
Pinned packages
2 full ·8 partial ·8 none
18 probed
Support at a glance
One square per probed item. Green is full, amber partial, red none. Hover for details; click a square to jump to its table row.
Adoption ladder
How far a script gets: compiles, and compiles plus passes its output checks. Lanes say where each import lands in the compiled tree.
| Rung | Corpus | Scripts | Compiled | Passed |
|---|---|---|---|---|
| R1 — Single-file script | benchmarks/scripts_corpus/scripts | 45 | 22 | 19 |
| R2 — Multi-module tree | benchmarks/scripts_corpus/trees | 5 | 4 | 4 |
| R0 — Vendored real script | benchmarks/real_scripts/scripts | 39 | 2 | 2 of 39 (5%) |
| Date | Passed | Corpus | Rate |
|---|---|---|---|
| 2026-11-09 | 2 | 39 | 5% |
| 2026-11-10 | 2 | 39 | 5% |
| 2026-11-13 | 2 | 39 | 5% |
Builtins
| Item | Status | Count | Unsupported | Fences |
|---|---|---|---|---|
abs, all, any, bin, chr, divmod, enumerate, getattr, hasattr, hex, iter, len, map, next, oct, ord, pow, range, repr, reversed, round, sum, bool, set | full | 24 | — | — |
print | partial | 1 | file= other than sys.stdout or sys.stderr | PS2002 |
input | partial | 1 | prompt argument | PS2003 |
int | partial | 1 | unknown keyword, int(bool) | PS2003 |
float | partial | 1 | float(bool) | PS2003 |
str | partial | 1 | str of a user class | PS2003 |
list | partial | 1 | list(str) | PS2002 |
min, max | partial | 2 | key= a function name | PS2003 |
sorted | partial | 1 | key= a function name, sorted(dict) | PS2003 |
zip | full | 1 | — | — |
filter | full | 1 | — | — |
isinstance | partial | 1 | tuple of types | PS2001 |
open | partial | 1 | keywords other than encoding= | PS2003 |
id | partial | 1 | id of int | PS2003 |
frozenset | partial | 1 | non-constant argument | PS2002 |
eval | partial | 1 | anything but a constant expression | PS2002 |
BaseException and subclasses | partial | 7 | ExceptionGroup | PS2003 |
bytes, bytearray, memoryview, callable, complex, dict, format, tuple, type, object, super, vars, dir, globals, locals, exec, issubclass, ascii, setattr, delattr, slice, hash, __import__ | none | 23 | all (`dict` displays and `{}` work; `dict(...)` does not) | PS2002 |
Standard library
| Item | Status | Count | Unsupported | Fences |
|---|---|---|---|---|
math | partial | 1 | fsum, comb, perm, isqrt, copysign, cbrt, prod, erf, erfc, lgamma, gamma, log with a base | PS2001, PS2003 |
re | partial | 1 | finditer, 5+ groups, sub with a function | PS1001, PS2001, PS2002 |
json | partial | 1 | ensure_ascii=False, JSONDecodeError | PS1106, PS2003 |
tomllib | partial | 1 | load (file object), keyword arguments | PS2001, PS2003 |
dotenv | partial | 1 | stream, verbose, interpolate, override, encoding arguments, other dotenv members (find_dotenv, set_key, DotEnv), interpolation ($VAR stays literal) | PS2001, PS2003 |
yaml | partial | 1 | load, dump, safe_dump, keyword arguments | PS2001, PS2003 |
jwt | partial | 1 | RS256 and other asymmetric algorithms, non-literal algorithm, other jwt members (get_unverified_header, PyJWTError), claims beyond str values (exp, aud), options dict, headers argument | PS1003, PS2001, PS2003 |
orjson | partial | 1 | default callable, other OPT_ flags, other orjson members (Fragment, JSONDecodeError) | PS2001, PS2003 |
pyscriptc_ndarray, numpy | partial | 2 | other module members (dot, linalg, random, fft, einsum), other methods (argsort, clip, cumsum, fill), dtype outside the four, negative slice step | PS2001, PS2003 |
urllib.request, urllib.error | partial | 2 | urlopen header keyword, other urllib.request members (build_opener, install_opener, urlretrieve), HTTPError attribute reads | PS2001, PS2003 |
urllib.parse | partial | 1 | urlparse, urljoin, urlunsplit, parse_qsl | PS2001 |
base64 | partial | 1 | b32, b16, a85, encodebytes | PS2001 |
hashlib | partial | 1 | blake2, sha3, sha224, new, pbkdf2_hmac, incremental update (no-argument constructor) | PS2001, PS2003 |
struct | partial | 1 | non-literal format, native-alignment format (no byte-order prefix), pack_into, iter_unpack, Struct | PS2001 |
datetime | partial | 1 | timezone and tzinfo, utcnow, datetime.strftime | PS2001 |
time | partial | 1 | time_ns, ctime, process_time | PS2001 |
collections | partial | 1 | ChainMap | PS1106 |
functools | partial | 1 | reduce with a lambda, reduce with an initializer, partial, wraps, lru_cache, cmp_to_key, cache, total_ordering | PS2001, PS2002 |
itertools | partial | 1 | count, cycle (infinite), tee (returns a pair, not an iterator), permutations without a count | PS2001, PS2002, PS2003 |
operator | partial | 1 | itemgetter, attrgetter, methodcaller, and_, not_, getitem | PS2001 |
contextlib | partial | 1 | closing, redirect_stdout, ExitStack, contextmanager | PS2001 |
os | partial | 1 | scandir, system, urandom, cpu_count, kill, rmdir, getuid, keyword arguments (makedirs exist_ok) | PS2001, PS2003 |
posixpath | partial | 1 | commonpath, ismount, lexists | PS2001 |
pathlib | partial | 1 | rglob, absolute, rmdir, with_suffix, relative_to, resolve to str, PurePath | PS2001 |
stat | partial | 1 | S_IMODE, S_ISFIFO, S_ISSOCK, filemode | PS2001 |
fnmatch | partial | 1 | fnmatchcase, translate | PS2001 |
warnings | partial | 1 | warn with a category, simplefilter | PS2001 |
io | partial | 1 | TextIOWrapper, BufferedReader, io.open | PS1106 |
sys | partial | 1 | stdin, path, modules, getsizeof, getrecursionlimit, stdout.flush | PS2001 |
importlib | partial | 1 | import_module, reload | PS2001 |
inspect | partial | 1 | getsource, isclass, signature, iscoroutinefunction | PS2001 |
threading | partial | 1 | main_thread, Thread target is a callable, Timer, Lock in `with` | PS1003, PS1106, PS2001, PS2002 |
queue | partial | 1 | PriorityQueue, a queue without an element annotation, an unknown queue method, a bool element type | PS1001, PS1106, PS2001, PS2002 |
logging | partial | 1 | basicConfig(level=...), format args (`logging.info(fmt, a)`), exception, handlers (StreamHandler) | PS2001, PS2003 |
asyncio | partial | 1 | bare Queue annotation (element type needed), get_event_loop, sleep outside a coroutine | PS1001, PS2001, PS2002 |
subprocess | partial | 1 | Popen, getoutput | PS2001 |
socket | partial | 1 | socket(), gethostbyname | PS2001 |
ssl | partial | 1 | contexts (create_default_context) | PS2001 |
ctypes | partial | 1 | CDLL, c_int(...), sizeof of other types | PS2001 |
string | partial | 1 | capwords, Template | PS2001 |
bisect | partial | 1 | key=, lo=, hi= | PS2001 |
heapq | partial | 1 | merge, heapreplace, heappushpop, the *_max family, key= | PS2001 |
statistics | partial | 1 | multimode, median_grouped, correlation, linear_regression, mode over float data, quantiles n= outside 2, 4, 8 | PS1003, PS2001, PS2003 |
errno | partial | 1 | errorcode | PS2001 |
importlib.resources | partial | 1 | read_text, is_resource | PS2001 |
hmac | partial | 1 | hexdigest, digestmod= | PS2001 |
unicodedata | partial | 1 | ucd_3_2_0 (also: Latin-1 only) | PS2001 |
tempfile | partial | 1 | TemporaryDirectory, mkstemp with suffix/prefix/dir/text | PS2003 |
uuid | partial | 1 | .int, .urn, .bytes and other names, names outside the subset | PS2001 |
binascii | partial | 1 | hexlify of str, names outside the subset | PS1003, PS2001 |
shlex | partial | 1 | comments as a variable, the shlex class and modes | PS1003, PS2001 |
secrets | partial | 1 | the count as a variable, names outside the subset | PS1003, PS2001 |
atexit | partial | 1 | register of a function with arguments, unregister | PS2001 |
shutil | partial | 1 | make_archive, disk_usage, chown | PS2001 |
enum | partial | 1 | Flag, str-valued members, methods on the enum | PS2002 |
dataclasses | partial | 1 | field(), asdict, order= and other options | PS1201, PS2001 |
random | partial | 1 | Random, vonmisesvariate, paretovariate, choices(cum_weights=) | PS2001, PS2003 |
csv | partial | 1 | restkey, restval, Sniffer, Sniffer, Dialect | PS2001, PS2003 |
textwrap | partial | 1 | TextWrapper | PS2001 |
copy | partial | 1 | copy of a user class | PS2001 |
argparse | partial | 1 | subparsers, nargs=, choices= | PS2003 |
platform | partial | 1 | processor | PS2001 |
calendar | partial | 1 | monthcalendar | PS2001 |
zipfile | partial | 1 | ZipFile | PS2001 |
tarfile | partial | 1 | TarFile | PS2001 |
selectors | partial | 1 | a fileobj argument (the typed socket handle is #229), other selector classes (EpollSelector, PollSelector, KqueueSelector, DevpollSelector, BaseSelector), get_map, the key's fileobj and data (they ride the #229 handle) | PS1003, PS1106, PS2001 |
typing, typing_extensions | partial | 2 | Any annotation, bare Callable, multi-arm union, optional of a multi-arm union, Literal annotation, Self return, TypeAlias declaration, PEP 695 type alias, PEP 695 TypeVar parameter, forward reference string, TypedDict class base, NamedTuple class base, NewType value, ParamSpec value, cast value, get_type_hints reflection, isinstance with a generic, __annotations__ read | PS1101, PS1102, PS1103, PS1104, PS1105, PS1106, PS2001, PS2002 |
collections.abc | partial | 1 | name as a value, isinstance with an abstract base | PS2001, PS2002 |
Pinned packages
The pinned corpus of PyPI packages, one consumer program each. The native column is the fence ratio over the package's own definitions: how much of it lowers to machine code without an interpreter. The island column is the run receipt: the package compiled with the island fallback and its output was compared against CPython.
| Package | Version | Native | Island | Plane split | Definitions | Fenced | Top fences |
|---|---|---|---|---|---|---|---|
| certifi | 2026.7.22 | full | runs | 100% native · 0% island · 0% blocked | 5 | 0 | — |
| colorama | 0.4.6 | none | runs | 40% native · 0% island · 60% blocked | 77 | 42 | PS2002 (42), PS1001 (36), PS2003 (3) |
| python-dotenv | 1.2.4 | none | runs | 39% native · 0% island · 61% blocked | 75 | 42 | PS2002 (81), PS1106 (16), PS1001 (8) |
| filelock | 4.1.1 | partial | runs | 58% native · 1% island · 41% blocked | 641 | 246 | PS2002 (433), PS2001 (101), PS1103 (49) |
| h11 | 0.16.0 | none | runs | 38% native · 13% island · 50% blocked | 133 | 74 | PS2002 (107), PS1106 (17), PS1203 (15) |
| idna | 3.20 | none | runs | 32% native · 0% island · 68% blocked | 56 | 37 | PS2002 (48), PS2003 (29), PS1101 (7) |
| iniconfig | 2.3.1 | partial | runs | 56% native · 0% island · 44% blocked | 34 | 13 | PS2002 (8), PS1003 (5), PS1101 (4) |
| jmespath | 1.1.0 | none | runs | 42% native · 1% island · 58% blocked | 200 | 109 | PS1001 (101), PS2002 (16), PS2001 (1) |
| pyjwt | 2.15.1 | partial | runs | 66% native · 0% island · 34% blocked | 171 | 51 | PS2002 (51), PS1101 (14), PS2001 (13) |
| mdurl | 0.1.2 | partial | runs | 42% native · 0% island · 58% blocked | 12 | 6 | PS2002 (15), PS2003 (2), PS2001 (1) |
| packaging | 26.3 | partial | runs | 49% native · 0% island · 51% blocked | 558 | 271 | PS2002 (222), PS1106 (90), PS1103 (53) |
| pathspec | 1.1.1 | none | runs | 36% native · 0% island · 64% blocked | 132 | 76 | PS2002 (107), PS1106 (19), PS1003 (19) |
| platformdirs | 4.13.0 | partial | runs | 58% native · 0% island · 42% blocked | 388 | 155 | PS2002 (145), PS1102 (33), PS2001 (23) |
| pytz | 2026.5 | partial | runs | 69% native · 0% island · 31% blocked | 102 | 32 | PS2002 (31), PS1001 (18), PS2001 (3) |
| shellingham | 1.5.4 | none | runs | 24% native · 0% island · 76% blocked | 25 | 19 | PS2002 (27), PS1001 (18), PS2001 (1) |
| trove-classifiers | 2026.9.21.13 | partial | runs | — | 0 | 0 | PS2002 (1) |
| tzdata | 2026.5 | full | runs | — | 0 | 0 | — |
| zipp | 4.1.1 | none | runs | 21% native · 0% island · 79% blocked | 75 | 57 | PS1001 (52), PS2002 (15), PS2001 (3) |
Fence census
Fence diagnostics across the pinned PyPI corpus, by code. A fence is a reported, numbered divergence — never a silent miscompile.
| Code | Title | Count | Packages |
|---|---|---|---|
PS2002 | construct not supported | 1349 | 16 |
PS1001 | annotation missing or not supported | 331 | 13 |
PS2001 | stdlib name not supported | 222 | 14 |
PS1106 | annotation names a type the compiler does not take | 209 | 9 |
PS1103 | generic alias annotation | 133 | 9 |
PS1101 | union annotation | 99 | 9 |
PS2003 | call arguments not supported | 93 | 10 |
PS1003 | type mismatch | 57 | 8 |
PS1104 | dynamic or structural annotation | 52 | 6 |
PS1102 | Optional annotation | 44 | 6 |
PS1201 | decorator | 31 | 4 |
PS1203 | class header form | 25 | 5 |
PS1105 | forward reference annotation | 14 | 6 |
PS2004 | operator or operand not supported | 12 | 5 |
PS2006 | decorator expression is not a typed callable | 6 | 2 |
PS1204 | class body statement | 4 | 2 |
PS4203 | finalizer refused | 1 | 1 |
PS4201 | dynamic attribute protocol refused | 1 | 1 |
History
| Date | Commit | Packages full | Partial | None | Fences |
|---|---|---|---|---|---|
| 2026-11-13 | 91ef7017c7c6 | 2 | 8 | 8 | 2585 |
| 2026-11-14 | 5ed5eb14d0d4 | 2 | 8 | 8 | 2683 |