TESTING / DEVELOPMENTruntime-capability-matrix.md
Status dokumen bukan klaim bahwa fiturnya sudah tersedia.

RFC dan proposal mencatat rancangan. Untuk kemampuan yang benar-benar dapat dipakai, lihat matriks kapabilitas runtime dan catatan rilis.

Runtime capability matrix

Language-core progress estimate — 2026-10-27: about 35%. This is a manual estimate against the accepted general-purpose language design, not a percentage of source files or tests. The self-hosted compiler and core control-flow, type, shape, variant, option/result, and match features exist. General ownership and memory-safety guarantees, general generics/traits, a complete collection and text/byte model, source-level asynchronous tasks, and broader target/release evidence remain open. Internal scheduler capabilities are tracked separately and do not count as source-language async/await support.

This is a code-backed snapshot of the native YAZA runtime and compiler source. “Implemented” means the feature exists in source; it does not mean the feature has production-release guarantees. Recent compiler changes passed YAZA source checking and native compilation. Offline checks accepted a matching format-2 snapshot, rejected an unsupported format, rejected a stale migration fingerprint, accepted the matching fingerprint during project compilation, and rejected it after a migration file changed. The full YAZA suite most recently passed 45/45 on 2026-10-28, including the process-local TTL cache, PostgreSQL API-record and structured-query adapters, SQLSTATE classification, database value contracts, secure rooted filesystem capabilities, bounded HTML escaping, the HTTP/HTTPS URL parser, Argon2id password hashing, typed lists, and process environment isolation. The TTL-cache runtime harness passed normally and under ASan/UBSan, including expiry, capacity eviction, and concurrent access. The macOS bootstrap passed its 10,000-case fallback parser mutation run, API layer conformance checks, and local PostgreSQL/API-record protocol fixtures in normal and ASan/UBSan builds. This bootstrap also passed the API fixture's normal and ASan/UBSan HTTP smokes with typed List[Shape] request-body arrays, followed by the OpenAPI/Postman generation smoke. The filesystem C harness passed normally and under ASan/UBSan, including symlink-swap race checks. A separate test-runner fixture verified timeout reporting, child process-group termination, and continuation to a later passing test. Crypto and SCRAM tests passed under ASan/UBSan in earlier runs. Earlier checks cover nested product shape declarations, tagged variants with unit and typed payload cases, checked construction, exhaustive variant matching, shape/variant payloads in Option[T] and Result[T, E], same-type and explicit From error propagation through ?, module imports, function parameter/return use, checked Int32, Float64 scientific notation, nested elif, TextList and numeric-range loops, OS-backed secure randomness, bounded TCP/TLS transport and PostgreSQL SSLRequest negotiation, typed HTTP path/query/body accessors, and nested shape-based JSON request bodies. Negative checks reject duplicate conversions, missing conversions, non-exhaustive and duplicate variant matches, unknown cases, constructor arity errors, and payload type mismatches. Existing checks cover shape field/type/arity errors, cyclic by-value layouts, incompatible field updates, updates through immutable values, malformed Float64 exponents, out-of-range Int32 conversions, Int32 overflow, invalid secure-random inputs, and invalid loop control. Allocator, JSON, secure-random, and filesystem boundary harnesses pass normally and under ASan/UBSan; the 10,000-case parser mutation run and full CRUD/slow-client/timeout smoke pass under ASan/UBSan. Typed HTTP path/query/body, nested-shape, and nested typed-array smoke passes normally and under ASan/UBSan. The latest 100,000-request run retained its in-memory CRUD record; sampled RSS grew 0 KiB at 1 KiB ps resolution (10,800 KiB baseline and peak). The macOS package remains provisional because the managed host adds AppleDouble provenance records to its payload. Security design requirements are tracked in Appendix H, layered application requirements are tracked in Appendix G, and accepted design RFCs are indexed in docs/rfcs. RFC acceptance does not change implementation status.

Latest API array slice (2026-10-27): API request shapes decode bounded List[Number], List[Int32], List[Float64], List[Boolean], and List[Text], plus nullable Option[List[T]]. Shape response serializers preserve those values; OpenAPI and Postman include typed item schemas, bounds, examples, and absolute URLs. The fixture passed normal and ASan/UBSan HTTP smoke, generation smoke, and the macOS bootstrap's 42/42 YAZA tests.

Latest pure-language collection slice (2026-10-27): list_try_get now returns Option[T] for typed lists, including TextList, primitives, shapes, variants, and nested supported values; negative and out-of-range positions return none. for item in values now iterates List[T] as well as TextList, captures the initial length once, and does not visit items appended mid-loop. The typed-list loop test and example pass, and bootstrap stages two and three emitted identical compiler C. Slicing and generic functions remain open.

Latest URL and safe-link slice (2026-10-28): std/url.yz provides a typed, bounded parser for an ASCII HTTP/HTTPS subset. std/html.yz reuses it for absolute HTTPS hrefs while checking relative links with a separate policy. URL and HTML tests pass normally and under ASan/UBSan. This is not a general URI parser, does not resolve or authorize destinations, and does not prevent server-side request forgery.

Later update (2026-10-25): The macOS bootstrap passed 29/29 language tests. The PostgreSQL URI suite covers percent-decoded credentials/options, IPv4 and bracketed IPv6 hosts, database path rules, invalid ports/escapes/options, and environment configuration. std/pg/uri.yz serves both the database CLI and generated Product repository. The repository uses std/pg/api_records.yz for configured Product CRUD; native libpq remains for API startup/schema checks and readiness. A local PostgreSQL 17.6 migration and end-to-end API CRUD/restart-persistence smoke passed; remote TLS, broader versions, and CI automation remain unverified.

Later update (2026-10-26): The macOS bootstrap completed three self-host compiler stages with identical generated C and passed all 29 language tests. tests/api-layer-conformance-smoke.sh now also verifies that an explicit source path checked from outside its project root still loads that project's architecture policy and rejects a forbidden controllers -> repositories import.

Previous update (2026-10-26): HTTP request reads now run as one bounded scheduler task per connection and suspend on the readiness bridge. At that milestone the macOS bootstrap passed 29/29 tests and the HTTP smoke, including a partial pipelined request that waits while an unrelated health request succeeds, then resumes after the remaining request bytes arrive; only macOS kqueue was exercised.

Later update (2026-10-26): HTTP responses are copied into capped per-connection buffers and flushed on writable readiness, at most 64 KiB per connection per event-loop turn. Each response is limited to 16 MiB, total queued response memory to 64 MiB, and send time to five seconds. The full macOS bootstrap passed three self-hosted stages with identical generated C, 34/34 YAZA tests, and normal plus ASan/UBSan HTTP smokes. The socketpair harness checks slow-client isolation, write resumption, per-turn fairness, memory-budget release, and shutdown drain. Route handlers and PostgreSQL calls remain synchronous; Linux epoll remains unverified.

Later update (2026-10-26): API request shapes can declare validate email email on Text or optional Text fields. Runtime validation accepts a conservative ASCII dot-atom/DNS-label form, returns the safe invalid_email field error, and OpenAPI marks the field as format: email. Normal bootstrap HTTP smoke, a dedicated ASan/UBSan HTTP smoke, the generated OpenAPI checks, and the compiler's incompatible-field rejection passed. This is syntax validation only; it does not verify that an address exists or supports quoted and internationalized addresses.

Current PostgreSQL API update (2026-10-26): Generated API builds compile without defining YAZA_WITH_POSTGRES or linking libpq; otool -L and undefined-symbol inspection show no libpq dependency. The API's declared startup/readyz hooks call YAZA functions that perform PostgreSQL setup and readiness through std/pg. Migration plus the full database-configured API HTTP smoke passed against disposable PostgreSQL 18.6 after the lifecycle-hook change, covering startup seeding, /readyz pause/resume, CRUD, restart persistence, live SQLSTATE-to-HTTP mappings, and safe 503 unavailable handling when PostgreSQL is stopped during a create. The smoke keeps the published loopback host port fixed across the PostgreSQL container restart and verifies /readyz recovers in the same API process. The test script installs all fault fixtures only in its disposable, loopback-only container. This is one local major version and plaintext loopback transport; remote TLS, more versions, and automated live-DB CI remain open. An interrupted create is returned as 503 and is not retried automatically.

Current structured-query update (2026-10-26): tests/db_postgres_live_smoke.yz now exercises db_postgres_select against a disposable PostgreSQL 18 container. It inserts two fixture rows using bound parameters, runs a validated filter/order/page descriptor, checks the returned column and values, then confirms an SQL-injection-shaped filter string returns no rows. tests/api-postgres-container-smoke.sh runs this before the HTTP/API lifecycle smoke, and the complete script passed. This verifies the current single-filter SELECT path against PostgreSQL; joins, schema-aware types, typed shape mapping, and broader database versions remain open.

Current compiler memory update (2026-10-26): API module expansion and zero-argument return-type indexing are reused across route parsing, API code generation, OpenAPI generation, and layer conformance checks. The API project now passes compiler checking and build through the self-hosted CLI within its bounded compiler arena; the full macOS bootstrap and database-backed API smoke passed after the change. This avoids repeated full-source expansion in the API path, but is not a general incremental compiler or a bound on every possible project.

Later update (2026-10-25): The API now supports an opt-in per-client IPv4 token-bucket limiter. Full macOS bootstrap and HTTP smoke pass, including normal and ASan/UBSan bucket tests, configuration validation, calculated Retry-After, operational-route bypass, capacity saturation, and recovery. The limiter is process-local and global across application routes; it is not distributed or route-policy middleware.

Later update (2026-10-25): Logical std/... imports resolve from the project, YAZA_STDLIB_DIR, or the installed macOS standard-library roots. Runtime lookup honors the same source root before older global runtime copies and supports YAZA_RUNTIME_DIR. An external-working-directory PostgreSQL URI test and the API HTTP smoke passed with the project standard library selected explicitly.

Verification update (2026-10-26): The latest macOS bootstrap passed three self-host compiler stages with identical generated C, all 33/33 language tests, HTTP/API smokes, and normal plus ASan/UBSan checks for SecretText. The compiler rejected the negative fixture that tries to print a secret implicitly.

Control-flow update (2026-10-27): YAZA supports block-form and one-line if/elif/else, mutable var plus set, and sequential early returns. Numeric guarded match supports return match, typed let/var initializers, and set existing_var = match for Number, Int32, and Float64; exhaustive variant/Option/Result matches support those same result contexts with -> arms. set updates an existing mutable var. A typed match initializer becomes visible only after its exhaustive arms close, so arm payload bindings cannot read an uninitialized destination. Match values are not yet general nested expressions or direct arguments. The three-stage macOS bootstrap passed with byte-identical final C and all 39/39 language tests; API, negative compiler, and normal plus ASan/UBSan HTTP fixtures passed. examples/match-forms.yz and tests/elif.test.yz demonstrate and exercise the supported styles.

API validation update (2026-10-27): Nested request shapes accept validate <field> integer for Float64 values; the decoder inspects the exact JSON decimal spelling and accepts only whole values within [-9007199254740991, 9007199254740991], avoiding fractional values that round to integers in Float64. OpenAPI emits the same nullable/required integer schema and bounds. The API HTTP smoke verifies whole values, exponent notation, fractions, values near precision boundaries, and both range boundaries in normal and ASan/UBSan builds. The compiler also rejects applying this rule to Text fields.

OpenAPI numeric contract update (2026-10-27): Generated schemas now match runtime numeric representations throughout typed path/query parameters, scalar request bodies, nested request shapes, and shape responses. Number is emitted as a signed 64-bit integer with bounds [-9223372036854775808, 9223372036854775807]; Int32 is emitted as a signed 32-bit integer; Float64 remains number. Explicit Float64 integer validation uses its narrower IEEE-754 safe-integer bounds. Numeric runtime bounds and user validation limits are composed with allOf, avoiding duplicate JSON Schema keywords. Generation smoke checks these types and boundaries, and the full three-stage macOS bootstrap passed.

API deadline update (2026-10-27): YAZA_HTTP_REQUEST_TIMEOUT_MS now sets the bounded request deadline (1,000–300,000 ms; default 5,000 ms), and YAZA_HTTP_KEEP_ALIVE_TIMEOUT_MS sets the bounded idle keep-alive deadline (1,000–60,000 ms; default 5,000 ms). The full API smoke passed normally and under ASan/UBSan with invalid-bound rejection, effective startup reporting, header rounding, and a live one-second incomplete-request timeout. YAZA_HTTP_RESPONSE_WRITE_TIMEOUT_MS sets response-write deadlines from 1,000 to 300,000 ms (default 5,000 ms); YAZA_HTTP_MAX_CONNECTIONS sets the active-connection capacity from 1 to 127 (default 64), bounded by the event buffer; YAZA_HTTP_SHUTDOWN_GRACE_MS sets response-drain grace from 1,000 to 120,000 ms (default 5,000 ms).

CORS preflight update (2026-10-27): preflight header names are validated as HTTP tokens and are allowed only when common or declared by the matched route controller. The response reflects the validated requested list and includes Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers; an undeclared custom header is rejected. The full API smoke passes normally and under ASan/UBSan. The origin policy remains a single exact configured origin for the server.

HTTP OPTIONS update (2026-10-28): Ordinary OPTIONS requests now return a bodyless 204 with path-specific Allow; OPTIONS * returns the server-wide method set; unknown paths remain 404. Allow includes implicit HEAD for GET and OPTIONS itself. The most restrictive route-auth policy applies to path discovery, including JWT-only routes. CORS preflight remains a separate method/header-validated path. The complete API HTTP smoke passes normally, and route-auth smoke passes normally and under ASan/UBSan; Linux behavior remains unverified.

HTTP capacity and descriptor-pressure update (2026-10-28): With every configured connection slot occupied, the event loop closes excess accepted clients without parsing or responding and increments yaza_http_connections_rejected_total at /metrics. The loopback test fills a one-connection table, verifies the extra client is closed, confirms the existing connection can still serve metrics, then frees the slot and verifies health requests are accepted again. A second loopback integration lowers macOS RLIMIT_NOFILE, forces accept() to return EMFILE, verifies yaza_http_accept_backoffs_total, releases descriptors, and confirms listener recovery after the one-second backoff. The same test confirms a queued peer that closes before sending bytes does not create a false HTTP 400 metric. The API concurrency harness passes normally, under ASan/UBSan, and under ThreadSanitizer on macOS. System-wide ENFILE and Linux epoll behavior remain unverified.

HTTP EOF framing update (2026-10-28): Raw loopback TCP tests confirm that a complete GET followed by shutdown(SHUT_WR) receives its normal 200 response; EOF in an incomplete header or declared request body receives 400. The checks assert two 400 response metrics, two matching access-log records, and return of active connections to the baseline after clients close. The concurrency harness passes normal, ASan/UBSan, and ThreadSanitizer runs on macOS. Linux behavior remains unverified.

Capability Status Current evidence or remaining work
Product request DTO flow Implemented slice The controller assembles validated path/body values into ProductInput; create/replace/patch/find/delete pass it explicitly through service and repository functions, while list takes explicit pagination. The repository no longer reads ambient HTTP request/response state, and DELETE 204 is route metadata. Compiler layer conformance checks the shared DTO signature. The 2026-10-27 three-stage macOS bootstrap passed with identical generated C, 41/41 language tests, API generation/layer checks, and normal plus ASan/UBSan HTTP smoke. General DTO generation, typed Product result models, and runtime-polymorphic dispatch remain incomplete.
Process-local TTL cache Implemented slice std/cache/ttl.yz offers Option[Text] get, bounded set with a caller-supplied TTL, remove, and clear. Runtime storage is fixed at 128 entries (255-byte keys, 4095-byte values), uses monotonic expiry and mutex protection, evicts the least recently used live entry at capacity, and wipes entry buffers on eviction/removal/expiry/clear/shutdown. Language and C harnesses pass normally; the C harness also passes ASan/UBSan and exercises concurrent callers. Cache is volatile and per-process, with no distributed invalidation; do not store secrets or authorization decisions.
API completion profile Incomplete All six Product routes execute YAZA controller → service → repository functions; create/replace/patch/find return Result[ProductRecord, ApiError], list returns Result[List[ProductRecord], ApiError], and delete returns Result[ProductDeleteOutcome, ApiError] behind its bodyless 204 route. Strict JSON-to-shape/list decoding validates repository output; typed list results serialize as JSON arrays and OpenAPI derives their item schema. Configured CRUD uses the pure-YAZA PostgreSQL client and bounded pool; without DATABASE_URL, CRUD uses the bounded in-memory adapter. Startup/schema/readiness hooks, safe SQLSTATE mapping, pagination, and invalid-boundary consistency have PostgreSQL 18.6 and no-database smoke evidence. Repository bindings validate exact signatures but remain static. PostgreSQL calls remain blocking within bounded worker threads; remote TLS/version coverage, live-DB CI and load/saturation evidence, language-level async tasks, runtime-polymorphic dispatch, unified typed response/error conversion, and additional database providers remain open. The macOS loopback concurrency harness verifies two simultaneous blocked handlers, one bounded queued job, active/queued/in-flight metrics, health/readiness isolation, HTTP 504 timeout accounting, and shutdown under normal, ASan/UBSan, and ThreadSanitizer runs. The PostgreSQL pool harness also verifies cancellation of a waiting API worker normally and under ASan/UBSan and ThreadSanitizer; it does not prove interruption of an active query. See the API completion plan. Web, monolith, and mobile follow its release gates.
YAZA UI web starter Partial templates/web ships a YAZA-authored responsive dashboard and component studio with CSS design tokens, inline SVG charts, semantic controls, and page-local browser interactions for theme switching, chart range display, sample data search/filter/pagination, in-memory project creation, CSV download, dialogs, and toast feedback. It is a static template demonstration: the JavaScript is not YAZA, sample state resets on reload, and no backend is connected. There is no YAZA UI DSL, compiler-integrated browser renderer, reusable package API, token validation or visual regression system, production accessibility audit, or native mobile renderer. See the YAZA UI proposal.
Standard-library and runtime source resolution Partial Logical std/... imports are constrained against traversal and resolve through the project, YAZA_STDLIB_DIR, /usr/local/share/yaza, or /opt/homebrew/share/yaza. Runtime-source lookup checks the source tree, YAZA_STDLIB_DIR/runtime, YAZA_RUNTIME_DIR, then those installation roots. The macOS package stages std/ and the combined runtime source beside the CLI. External-working-directory module compilation and API HTTP smoke pass when YAZA_STDLIB_DIR points to the repository. Complete package resolution/versioning, target-specific install verification, and independently linkable runtime modules remain absent.
API bind and authentication Partial Non-loopback IPv4 binds require a shared YAZA_API_TOKEN, or JWT-only mode with at least one auth jwt route and an explicit auth policy on every declared route. Route/group policies support auth required, auth public, and auth jwt; JWT accepts compact HS256 only, requires typ: JWT, an exact configured issuer, an aud string or non-empty string array containing the configured audience, and integer exp with optional integer nbf/iat. http_auth_claim_text(name) -> Option[Text] exposes bounded top-level string claims only inside the matched verified JWT handler; public and shared-Bearer routes receive none, and the payload buffer is wiped after dispatch. The route smoke checks valid, expired, forged, missing-expiry, duplicate-claim, padded-signature, wrong-algorithm/type, issuer, string and array audience matching/rejection, malformed audience arrays, missing configuration, claim decoding, spoofed-identity rejection, and JWT-only/no-static-token behavior. OpenAPI/Postman preserve bearer security and OpenAPI adds a YAZA authentication extension. Shared Bearer tokens and fixed-length JWT signatures use constant-time comparison; duplicate Authorization headers fail closed. Login/token issuance, typed principals, centralized roles/permissions/ownership, revocation/key rotation, asymmetric/JWKS/OIDC, TLS, and general user-defined middleware remain incomplete.
API request rate limiting Partial Optional YAZA_RATE_LIMIT_REQUESTS/YAZA_RATE_LIMIT_WINDOW_MS config enables a fixed-memory 1,024-entry IPv4 token-bucket table before API authentication. It returns a safe 429 envelope and refill-derived Retry-After; health, readiness, metrics, and CORS preflight are exempt. Unit tests cover client isolation, refill, bounded table saturation/recovery in normal and ASan/UBSan builds; HTTP smoke covers startup config and behavior. Route-level and inherited group limits also use this bounded table, independent by policy scope; all policies remain process-local, IPv4-only, and non-distributed.
Database providers beyond PostgreSQL Not implemented No SQLite, MySQL/MariaDB, SQL Server, Redis, Oracle, or document database driver/engine is shipped. Provider-specific implementation and conformance are planned in the database driver architecture.
Structured YAZA database queries Partial std/db/query.yz represents a projection, up to 16 typed AND predicates, one ordering column, and bounded pagination without application-authored SQL. Identifiers are validated ASCII names; comparison operators come from a closed enum; values use separate PostgreSQL bind parameters. SQL NULL uses IS NULL/IS NOT NULL and consumes no placeholder. The PostgreSQL adapter converts server errors to fixed DbError categories with validated SQLSTATEs only. tests/database_query.test.yz covers placeholder order, multi-filter composition, the 16-filter bound, NULL combinations, injection-shaped values, parameter OIDs, query limits, and error redaction; the focused test passes normally and under ASan/UBSan, and the full language suite passes 44/44. The updated two-filter tests/db_postgres_live_smoke.yz passes compiler checking, but its new two-filter path has not yet been run against a live database. The native db.read ...: grammar, schema-snapshot name/type resolution, OR/grouped predicates, joins, and generated typed row mapping remain unimplemented.
Checked arithmetic and index bounds Partial Numeric overflow checks and bounded TextList/List[T] operations exist. list_try_get returns Option[T] for negative and out-of-range indexes; list_get remains a checked, fail-fast access. List[T] is a concrete built-in collection subset, not general generic-function support; slicing remains open.
Control flow Partial Block and one-line if/elif/else bodies, mutable var plus set label = value, nested conditionals, while, and early returns inside branches are supported. set assigns to an existing mutable var; var label is its declaration. Non-void functions require a return on every path through supported conditional chains; complete nested and inline if/elif/else chains, plus exhaustive statement-form match blocks whose arms all return, can replace an unreachable fallback return. Sequential early returns followed by a fallback are supported. Loops do not prove a return. tests/return_flow.test.yz covers complete and incomplete chains, sequential early returns, nested branches, statement-form match returns, and a return match nested under an if; negative fixtures reject fallthrough and nested-match false positives. Exhaustive numeric match (Number, Int32, Float64) and sum-type match (variant, Option, Result) can return a value, initialize a typed let/var, or assign to an existing mutable variable with set existing_var = match ...; numeric matches require a final else, and sum-type matches require each declared case. Arms use ->, evaluate the subject once, scope payload bindings to the arm, and check every result against the destination type. for supports TextList, supported concrete List[T] collections, and ascending half-open Number ranges (start..end). Collection expressions are evaluated once and their initial length is captured; range bounds are evaluated once. break/continue require an enclosing loop. Match values nested in a call/calculation or passed directly to say, labeled break/continue, generic collection functions, and slicing are not implemented. tests/elif.test.yz, tests/numeric_match.test.yz, tests/value_match.test.yz, tests/return_flow.test.yz, and tests/typed_list.test.yz cover these paths; negative fixtures reject incomplete and type-invalid matches and missing return paths. The 2026-10-28 macOS bootstrap passed three self-hosted compiler stages and the latest full language suite passes 44/44; the earlier return-flow milestone also passed under ASan/UBSan.
Strict HTTP and JSON parsing Partial Strict HTTP/1 framing and JSON parsing validate UTF-8 and surrogate pairs, decode escaped object keys before checking duplicates, cap objects at 64 fields, and reject values at or beyond the configured 128-level recursion boundary. tests/json_depth.c checks nested values, duplicate keys with alternate escapes, Unicode decoding, surrogate errors, and field limits normally and under ASan/UBSan. scripts/fuzz-runtime.sh provides deterministic ASan/UBSan mutations; a GitHub Actions workflow is configured for 50,000 coverage-guided libFuzzer iterations on pushes, pull requests, and weekly, starting from six built-in seeds plus any committed regressions in tests/fuzz-corpus/. scripts/promote-http-fuzz-crash.sh records reviewed minimized findings, and both fuzz engines replay saved regressions. tests/fuzz-regression-pipeline.sh covers promotion idempotence, invalid inputs, seed assembly, and replay using a temporary synthetic regression; no real crash regression is committed yet. The workflow has not yet been observed on a hosted runner; human review and promotion are still required.
CSV parsing and record encoding Partial YAZA-authored std/csv.yz reads and writes bounded CSV records over Bytes: quoted fields, doubled quotes, commas, embedded CRLF, UTF-8 validation, and empty/trailing fields. It caps input and output at 16 MiB, fields at 1 MiB decoded, and records at 256 fields; tests/csv.test.yz covers round trips, Unicode, malformed quoting, invalid UTF-8, and line-ending rules. Streaming file/socket adapters, dialect configuration, schema inference, formula-injection-safe spreadsheet export, and spreadsheet modules remain unimplemented.
PDF generation Partial YAZA-authored std/pdf.yz generates a deterministic PDF 1.7 document with one page and one printable-ASCII text line (maximum 80 bytes), escaping PDF literal-string delimiters and calculating object offsets and cross-reference entries. tests/pdf.test.yz checks the generated structure and rejected inputs. PDF reading, Unicode/font embedding, multiple pages, vector/table layout, PDF/A, signatures, and broad ISO 32000-2 conformance remain unimplemented.
HTML and href escaping Partial YAZA-authored std/html.yz exposes html_escape_bytes(Bytes), Text wrappers, and html_escape_href(Text). Text/quoted-attribute escaping covers &, <, >, single quotes, and double quotes; UTF-8 is validated; chunks are capped at 64 KiB with escaped output capped at 384 KiB. The href helper allows HTTPS and relative URLs, rejects other schemes, protocol-relative URLs, raw controls/whitespace/backslashes, malformed percent escapes, and percent-encoded controls/backslashes; hrefs are capped at 2 KiB. tests/html.test.yz covers injection-shaped text, quoted values, Unicode, empty input, malformed UTF-8, NUL bytes, HTTPS/relative links, rejected schemes, and malformed escapes. Rich-HTML sanitization, complete URL parsing, JavaScript/CSS encoding, and typed safe-HTML values remain absent.
HTTP/HTTPS URL parsing Partial std/url.yz exposes url_parse_http(Text) -> Result[WebUrl, Text] for bounded absolute HTTP/HTTPS ASCII URLs, with typed scheme, host kind, optional port, path, query, and fragment. It validates percent-escape syntax and conservative DNS, canonical IPv4, bracketed IPv6, and decimal port syntax. URL and integrated HTML tests pass normally and under ASan/UBSan. It does not implement IDN, raw non-ASCII, IPv4-mapped/zone IPv6, relative-URL parsing, path normalization, DNS resolution, or destination authorization; it is not a general URI parser or SSRF defense.
JSON logs, metrics, health/readiness Partial API access logs omit query strings; /metrics, /healthz, and database-aware /readyz are available. /metrics also exposes bounded PostgreSQL pool connection-state gauges when DATABASE_URL is configured; no-database and PostgreSQL 18.6 HTTP smoke profiles verify the gauge values and the configured pool cap. Every HTTP response includes a 128-bit OS-random X-Request-ID, and the same ID is recorded in the http_request access event; CORS exposes the header to browser clients. The HTTP smoke verifies ID syntax, distinctness across requests, log correlation, and CORS exposure. log_event(level, event, fields) emits bounded JSON lines and redacts common sensitive field names. There is no level filtering/configuration, trace/span propagation, or asynchronous sink.
Memory manager / ownership model Partial The C runtime routes its allocations through bounded arenas: a 512 MiB program arena and a 64 MiB scratch arena per serial HTTP request. Successful CRUD records are explicitly transferred to the program arena; request scratch is reset on handled success, parser, auth, CORS, and shutdown paths. Unit checks and a 100,000-GET RSS run pass. There is no source-level move/borrow checker, reference counting, destructor system, escape analysis, or end-to-end memory-safety guarantee.
Safe rooted filesystem access Partial std/fsroot.yz provides opaque generation-checked root handles, recursive rooted directory creation, bytewise-sorted bounded directory listings, typed FsMetadata for regular files/directories, bounded Bytes reads, and atomic same-directory replacements. Relative paths reject traversal, malformed UTF-8, controls, backslashes, and symlinks at every traversed component; reads accept only regular files and enforce a caller cap up to 64 MiB; metadata uses AT_SYMLINK_NOFOLLOW and exposes file size, low-nine permission bits, and modification time; listings fail closed on invalid names and cap output at 4,096 entries/512 KiB without truncation. New directories use owner-only mode subject to umask. tests/fsroot.c and tests/fsroot-language-smoke.sh cover creation/listing/metadata, file reads/writes, byte preservation, limits, traversal, symlinks, stale handles, and symlink replacement; normal and ASan/UBSan checks pass on macOS. Permission-changing APIs, other metadata, streams, and cross-platform conformance remain open; this is not a complete filesystem API or OS sandbox.
Internal cooperative scheduler core Partial runtime/yaza_runtime.c.inc contains YAZA-owned native runtime code for a deterministic FIFO scheduler with a bounded 256-task table, O(1) generational-handle lookup, O(1) free-slot reuse, a bounded 256-entry monotonic deadline min-heap with indexed O(log n) removal, per-task 64 KiB arenas retained across yields and reset on reap, explicit wake, structured child join/auto-join, failure/cancellation propagation, and task reaping. tests/scheduler.c covers fairness, timer ordering/removal, task-memory lifetime, external wake, joins, parent auto-join, child failure propagation, cancellation cleanup, capacity bounds, and stale-handle rejection; normal and ASan/UBSan runs pass. benchmarks/scheduler_core.c measures FIFO dispatch, spawn/complete/reap churn, timer wakeups, and external wakeups. The bounded readiness bridge now backs HTTP request-reader tasks; the normal HTTP smoke exercises accept, nonblocking request reads, keep-alive, pipelining, and shutdown through this path. The scheduler is still not wired into generated YAZA programs or language syntax. The first five-sample macOS microbenchmark exceeded 5% variation and does not establish superiority over other runtimes.
Event loop / asynchronous HTTP / multi-threaded server Partial YAZA-owned readiness code drives accept/read events through kqueue on macOS and level-triggered epoll in Linux source; only the macOS backend has been compiled and exercised. The event loop owns sockets with a configurable 1–127 connection cap (default 64) and schedules one reader task per connection. Generated controller handlers and database-backed readiness probes run on a fixed worker pool (1–32 threads, default 4), with admission bounded by connection capacity and optionally lowered by YAZA_API_MAX_IN_FLIGHT, copied request snapshots, deadlines/cancellation flags, bounded result handoff, and event-loop-only socket writes. PostgreSQL pool acquisition and native TCP/TLS readiness waits observe request cancellation in slices of at most 50 ms; active protocol calls remain blocking and use configured timeouts. Incomplete requests wait for readiness and use a configurable absolute deadline (default 5,000 ms; YAZA_HTTP_REQUEST_TIMEOUT_MS accepts 1,000 to 300,000 ms); response output is queued within 16 MiB per response and 64 MiB aggregate pending memory, then flushed on writable readiness with a maximum 64 KiB per event-loop turn and a configurable total deadline (default 5,000 ms; YAZA_HTTP_RESPONSE_WRITE_TIMEOUT_MS accepts 1,000 to 300,000 ms). The response-drain grace after SIGINT/SIGTERM is configurable from 1,000 to 120,000 ms (default 5,000 ms). Health, metrics, and lightweight route dispatch stay on the event loop. Controller and readiness callbacks run on workers, so blocking handler or PostgreSQL operations no longer stall unrelated health requests. http_request_cancelled() -> Boolean exposes cooperative request cancellation to API handler loops, but user code must poll it; synchronous DNS resolution, source-level async/await, automatic cancellation safepoints, and multi-worker scheduler work remain absent. HTTP integration passed normally, under ASan/UBSan, and under ThreadSanitizer for blocked handlers/readiness, one queued job, timeout accounting, and an uncooperative worker-stop deadline; the PostgreSQL pool and socket cancellation harnesses also passed in all three build profiles. Concurrent Product CRUD and worker metrics pass in the starter smoke. Only macOS kqueue has been exercised.
Real-time sessions and durable pub/sub broker Not implemented The accepted YAZA Pulse design specifies typed sessions, WebTransport/WebSocket/SSE adapters, and a partitioned durable log with consumer groups, acknowledgement, retention, replay, and later replication. The current runtime has no WebSocket, SSE, WebTransport, HTTP/3, durable event broker, or consumer-group implementation.
Geospatial data, mapping, and routing Not implemented The YAZA Atlas proposal describes a YAZA-owned geo kernel, spatial indexes, map renderer, tile pipeline, and later search/routing. There are no geospatial types, map renderer, tile engine, geocoder, or route engine in the runtime today.
Keep-alive, chunked requests, HTTP/2, TLS Partial HTTP/1.1 supports bounded sequential reuse and ordered pipelining, with a configurable idle timeout (default 5,000 ms; YAZA_HTTP_KEEP_ALIVE_TIMEOUT_MS accepts 1,000 to 60,000 ms) and at most 100 requests per connection. Strict chunked request bodies are decoded with bounded chunk lines and trailers; ambiguous Content-Length plus Transfer-Encoding, malformed chunk sizes, and framing headers in trailers are rejected. A loopback harness verifies chunked JSON CRUD, trailers, sequential reuse, pipelined ordering, malformed framing rejection, and HTTP/1.0 close behavior. The outbound socket API now has a TLS 1.2+ client-upgrade path configured for system trust and hostname checks; only macOS compile and invalid-handle behavior have been exercised so far. macOS uses deprecated Secure Transport APIs, successful handshake testing and Linux verification remain, and successful use by the API runtime is not tested; the pure-YAZA PostgreSQL transport has not been validated against a server. HTTP/2 remains absent.
Percent-decoding Implemented for current HTTP routing Path/query components are decoded once; encoded path separators, control bytes, malformed escapes, and NUL are rejected.
Length-carrying text and binary byte buffers Partial Bytes is an immutable pointer-plus-length value with a 64 MiB per-value limit and bounded binary file/stdin APIs. Text remains a C string; ownership, deterministic destruction, and automatic reclamation are not implemented.
PostgreSQL client protocol Partial std/pg/protocol.yz implements pure-YAZA PostgreSQL v3 startup, simple/extended query framing, SSL/GSSENC negotiation, cancel, bounded backend frames, RowDescription, ErrorResponse, DataRow, and authentication classification. std/pg/transport.yz provides pg_query for one trusted static SQL command, pg_execute_command_script for trusted command-only scripts, pg_query_params for separately bound text values/SQL-NULL flags, pg_query_params_typed for Parse parameter OIDs, and pg_query_with_parameters for the PgParameters builder. Constructors encode Text, Number/int8, Int32/int4, Float64/float8, Boolean, Bytes/hex bytea, and explicit SQL NULL with a chosen OID, validating OID/count ranges and the 1 MiB aggregate text-value bound. Bind values still use PostgreSQL text format; binary Bind encoding is absent; pg_parameters_add_text_as supports caller-supplied PostgreSQL text values for other OIDs, but does not add native YAZA conversions. Results pass through ReadyForQuery; PgQueryResult preserves SQL NULL and column metadata, while pg_query_value decodes text-format int2/int4/int8/OID, Boolean, UTF-8 text, and hex bytea. pg_query_number, pg_query_boolean, pg_query_text, and pg_query_bytes return nullable typed values and reject mismatched result types. std/pg/errors.yz validates and classifies known SQLSTATEs for API mapping without returning PostgreSQL server messages. Response data is capped at 16 MiB/10,000 cells; command-script response acceptance is capped at 10,000 completions after the script has already been sent and executed, and row-returning/multiple-result scripts are rejected. yaza db migrate/status/snapshot is wired to this client: verified TLS is the default and is required for remote peers; PGSSLMODE=disable permits plaintext only for loopback hosts after the actual socket peer is verified with getpeername; migrations use managed transactions and bound ledger writes; snapshot generation reads system catalogs, verifies the applied ledger against the local migration set, and writes version-2 deterministic JSON with a migration fingerprint and migration data via atomic same-directory replacement. yaza db validate-snapshot checks JSON structure and migration freshness offline, and project check/build/run rejects a stale default snapshot when present. Live PostgreSQL 17.6 migration/API CRUD/restart persistence, snapshot/catalog/fingerprint validation, transaction commit/rollback, savepoints, nested-BEGIN rejection, and failed-statement recovery now pass through tests/postgresql-live-smoke.sh. std/pg/transaction.yz provides an explicit lexical defer pg_scope_cleanup(scope) rollback guard; failure or timeout closes the handle and attempts to emit a fixed cleanup-failure log event, while uncertain commit is not retried. A strict local protocol peer exercises the guard normally and with ASan/UBSan; live PostgreSQL coverage of the guard/migration integration remains pending. Remote TLS, broader versions, network failure/timeout paths, and repeatable CI remain unverified. The fingerprint does not detect out-of-band DDL and snapshots do not feed typed query compilation; shape mapping and Unicode SASLprep remain absent; pool lifecycle is supplied separately by the runtime and is not part of the wire protocol module.
Numeric/date types Partial Number remains signed 64-bit; explicit Int32 has checked conversion, arithmetic, formatting, and Option/Result payload support. Float64 supports decimal/scientific literals, checked finite arithmetic, parsing/formatting, and explicit exact-only conversions. Int64, unsigned types, Decimal, Money, dates, and instants are absent.
Map, struct, Option, Result, and tagged variants Partial shape supports nested product structs with built-in, shape, or variant fields, forward declarations, dependency-ordered layouts, positional construction, checked field reads, typed field updates through mutable var values, imports, and function parameter/return use. User-defined tagged variant declarations support unit and named typed payload cases, checked Type::Case(...) constructors, exhaustive block matching, scoped multi-field bindings, and use as function/shape/Option/Result payloads. Option[T] and Result[T, E] support nested built-in, shape, and variant payloads up to 16 levels, with context-checked none, inferred ok/err, checked accessors, and postfix ? in let/var/set/return when error types match or one explicit direct From[Source] for Target implementation exists. Numeric and sum-type matches can return a value or assign it to an existing mutable variable, evaluate the subject once, enforce exhaustive cases (else for numeric guards), scope payload bindings, and type-check every result arm. Duplicate conversion pairs fail compilation. Tagged payload copies consume the bounded active arena. Match values usable in arbitrary expression positions, generic traits/types/functions, arbitrary nested ? expressions, maps, conversion chaining, and general error conversion remain absent; Product API model/interface files remain metadata, while explicit static GET handlers can execute imported zero-argument YAZA functions returning Text.
Stdin, append/seek file APIs, regex Partial stdin_read() reads at most 1 MiB of text and rejects NUL; stdin_read_bytes() reads at most 1 MiB of arbitrary bytes. Text and binary append/write APIs exist, and file_read_bytes()/file_read_bytes_range() provide bounded whole-file and range reads. std/regex.yz provides an anchored ASCII subset with a 128-byte pattern cap, 64 atoms, 1023-byte input cap, and bounded non-backtracking matching. Stateful file handles, general seek/write-at-offset, and regex features beyond this subset remain absent.
Secure randomness, cryptography, outbound HTTP Partial secure_random_bytes(Number) reads bounded OS random bytes. crypto_sha256, crypto_hmac_sha256, and crypto_pbkdf2_sha256 call CommonCrypto on macOS or OpenSSL on Linux; PBKDF2 bounds rounds, salt, and output length. std/crypto/password.yz wraps the external Argon2 provider for bounded Argon2id PHC hashing, verification, and rehash detection with fixed parameters and random salts; the macOS installer payload includes the static provider. bytes_equal_constant_time compares equal-length values without data-dependent early exit, and bytes_zeroize explicitly wipes a byte buffer. PostgreSQL SCRAM uses these primitives. TCP streams have a 128-handle cap, 1 MiB read cap, 64 MiB write cap, and per-operation deadlines; DNS lookup itself is synchronous and outside the connect timeout. net_tls_client configures TLS 1.2+, system trust, and hostname checking through Secure Transport on macOS and OpenSSL on Linux, but successful handshakes are not yet integration-tested and the macOS provider is deprecated. Published SHA-256, RFC 4231 HMAC, PBKDF2, and RFC 7677 SCRAM vectors pass normally and under ASan/UBSan; the password-hash test passes normally and under ASan/UBSan. The loopback plain-transport and PostgreSQL local startup/SELECT 1/Terminate fixtures pass normally and under ASan/UBSan. Automatic secret ownership/zeroization, Unicode SASLprep, authenticated encryption, signatures, key types, independent cryptographic review, an audited current macOS TLS provider, and outbound HTTP remain absent. Linux OpenSSL/Argon2 linking is configured but has not yet been verified on a Linux host.
Process timeout/output capture/environment Partial process_timeout bounds execution, and process_capture captures stdout/stderr with a shared output cap. process_env, process_timeout_env, and process_capture_env launch with exactly their supplied child-environment list and reject dynamic-loader variables (LD_*, DYLD_*, GCONV_PATH, and GLIBC_TUNABLES); an explicitly supplied PATH must use absolute directories without . or .. segments. Process lists cap arguments and environment entries at 256 each, each entry at 8 KiB, and each list's aggregate bytes at 128 KiB. Tests check exact capture contents, no ambient secret leakage, rejected loader variables, empty/relative/traversal PATH entries, oversized argument/environment lists, ordinary explicit launch, and timeout termination. The native build passes Clang only PATH and selected toolchain settings. Ordinary process, process_capture, and timeout variants still inherit the parent environment. General cancellation, OS sandboxing, and executable command allowlists are missing.
Opaque secret values Partial std/security/secret.yz provides a distinct SecretText type with a 64 KiB input cap, environment loading, constant <redacted> output, explicit Option[Text] reveal, and explicit zeroization shared by aliases. The compiler rejects implicit printing, and API JSON serialization has no SecretText encoder. Normal and ASan/UBSan tests cover construction, reveal, redaction, alias invalidation, and bounds. The original immutable Text and process environment are not erased; zeroization is not synchronized for concurrent access, automatic lifetime cleanup, PII tracking, and complete data-flow redaction are absent.
Bearer token parsing Partial API startup accepts only bounded 32–1024 byte Bearer tokens with RFC token characters and never logs the configured value; short configured tokens are rejected. yaza secret token emits 32 operating-system CSPRNG bytes as 64 lowercase hex characters; CLI smoke checks length, alphabet, uniqueness, and usage errors. The minimum is a length floor, not an entropy test for manually chosen values. Authentication accepts the case-insensitive Bearer scheme and scans each configured credential in a fixed 1024-byte padded comparison; when the optional secondary slot is set, both are checked on every request. Duplicate Authorization headers fail closed. The route-auth smoke covers primary and secondary acceptance, invalid secondary configuration, and overlap startup in normal and ASan/UBSan builds. Token issuance, central revocation, per-user credentials, users/roles, and actor-aware authorization remain absent.
Debug/release and sanitizer builds Partial `YAZA_BUILD_MODE=debug
Machine-readable security audit Partial yaza audit --security --format json emits the YAZA versioned report; --format sarif emits SARIF 2.1.0 with four stable rule descriptors, rule indexes, warning-level results, percent-encoded relative artifact URIs, line regions where available, and redacted severity/confidence metadata. tests/audit-sarif.sh checks empty and finding reports, URI encoding, line-less scan-depth findings, rule-index consistency, rejected formats, and secret redaction; the macOS bootstrap runs this smoke. Findings return status 1, and clean scans return 0. The underlying audit remains heuristic: it does not scan dependency advisories, perform taint analysis, or verify runtime behavior.
Executable layered API handlers Partial Greeting and typed handlers execute imported YAZA functions through controller → service → repository layers. Outcomes support Text, Option[Text], Shape, Option[Shape], List[Shape]/Option[List[Shape]], Result[Text, E], Result[Shape, E], and Result[List[T], E]/Option[List[T]] for scalar elements Number, Int32, Float64, Boolean, and Text. Scalar lists use bounded, type-checked JSON serialization and OpenAPI derives array item schemas from declared element types. Shape fields serialize TextList, primitive typed arrays, and List[Shape]; request decoding accepts those primitive arrays and optional Option[List[T]], bounded to 64 values. Product list returns Result[List[ProductRecord], ApiError]; native serialization produces a JSON array and OpenAPI derives its item schema. All Product CRUD operations return typed results, with DELETE 204 suppressing its body. Route declarations support 200, 201, 202, and 204. Static layer binding, PostgreSQL/in-memory CRUD, and API generation have normal and ASan/UBSan smoke coverage. Arbitrary nested collection codecs, runtime-polymorphic interface dispatch, complete typed response/error conversion, and non-PostgreSQL drivers remain incomplete.
Runtime module separation Not implemented The generated program currently includes the combined runtime source; core, os, http, and pg are not independently linkable modules.
Linux, WASI, browser, and edge targets Not implemented RFC 0008 selects WASI 0.3 components first, then a separate browser core-Wasm target and edge host adapter. The compiler has no Linux release, WASI, browser-Wasm, or Cloudflare target. WASI 0.3 is an experimental, version-pinned target direction, not a shipped compatibility promise.
Native mobile compiler and YAZA UI rendering Not implemented The compiler currently emits C for the native macOS profile. RFC 0008 selects Android arm64-v8a first, Android x86_64 for emulator/CI, then iOS arm64; bindings are to be generated from reviewed .yabi declarations into narrow C/JNI/Kotlin or C/Objective-C/Swift shims. There is no iOS/Android target, YAZA UI DSL, YAZA Frame Engine, GPU backend, or native mobile host adapter. The static web CSS starter does not change mobile status. The proposed rendering architecture is in the YAZA UI proposal; proposal acceptance is not implementation evidence.
Compiler source locations and editor format Partial yaza check --format json [file.yz] emits schema-versioned yaza.diagnostics JSON, percent-encoded file URIs, coarse codes (YZA1000 for compiler errors with a mapped line; YZA0001 for CLI/input failures and unmapped errors), severity, message, related/notes arrays, and line-level fallback or statement-level UTF-8 byte ranges. tests/check-diagnostics.sh checks valid source, a type error, missing input, path escaping, project entrypoint selection, and exit status; the VS Code extension test verifies UTF-8-byte to UTF-16 range mapping on an unsaved Unicode buffer. For import-free, non-API files up to 96 KiB, 4,096 lines, and 32 functions with supported return stubs, JSON mode aggregates up to three errors per function/start: scope using isolated subprocesses under a shared 128-probe cap. Up to two repair rounds handle typed initializer, supported return-type, or non-Boolean assert errors; API/import/global recovery remains incomplete, and parser failures can fall back to line 1. Statement spans cover non-indentation bytes and are not token-exact. Other same-scope and imported-module error recovery, token-exact spans, imported-module source mapping, and finer codes are missing.
Manifest architecture policies Partial yaza arch check and compiler commands enforce single-line or multi-line layer/allowed-edge arrays against relative use imports under src. Compiler commands discover the nearest project root from an explicit source path, and the macOS bootstrap regression verifies rejection of a forbidden edge from an external working directory. Package-root imports, aliases, and symlink-aware canonical resolution remain unimplemented.
Test runner: isolation, timeouts, and structured results Partial Directory discovery is sorted. Each test is built from the project root and executed from a private /tmp/yaza-run.XXXXXX/work directory; relative files do not leak between tests. Cleanup rejects paths outside the owned mode-0700 temp root, does not follow symlinks, and is bounded to 64 directory levels and 100,000 entries. This is working-directory isolation, not an OS sandbox. A 30-second compile-plus-run budget defaults per test; --timeout <ms> or YAZA_TEST_TIMEOUT_MS overrides it from 1 to 3,600,000 ms. Timeout kills the process group and discovery continues. yaza test --format json reports each test's path, status, compile/run/cleanup phase, exit code, and timeout flag in one JSON document; child output goes to stderr. tests/test-runner-resilience.sh verifies JSON validity/fields for pass, compile failure, runtime failure, and timeout, along with later-test continuation, relative-file isolation, external-path rejection, and symlink-safe cleanup. The latest full language suite passed 41/41 on 2026-10-27. Database-container fixtures and a general fixture framework remain absent.
Cross-runtime HTTP benchmark Not implemented No fair YAZA/Go/Node/Rust benchmark harness or throughput, p99, RSS, startup, and binary-size report exists.
Slow-client and long-run memory tests Partial tests/fixtures/api-complete/tests/http-smoke.sh verifies a stalled header does not block /healthz, the 5-second deadline closes an incomplete request, and a created in-memory record survives request-arena resets. tests/http-memory-arena-smoke.sh runs 100,000 sequential GETs and samples RSS; latest run measured 10,800 KiB baseline and peak (0 KiB sampled growth at 1 KiB resolution). The C pool harness covers connection saturation, acquisition timeout, and waiter wakeup; integrated concurrent API pool-throughput, slow response-reader fairness, precise timeout-boundary, and longer-soak evidence remain.

API security progress — 2026-10-25

The runtime now refuses a non-loopback IPv4 listener without a configured YAZA_API_TOKEN; the policy runs before opening the listening socket. The normal and ASan/UBSan API smoke checks verify the refusal, missing and incorrect credentials, duplicate Authorization rejection, and the ordinary authenticated loopback API path. This is a safer bind default, not a substitute for TLS, role-based authorization, token lifecycle management, or a completed API security profile.

API graceful shutdown update — 2026-10-26

SIGINT/SIGTERM now stops further accepts and performs a zero-time readiness collection after an interrupted event wait. Requests already readable on accepted sockets are completed with Connection: close; incomplete and idle sockets are then closed. tests/fixtures/api-complete/tests/http_shutdown.c verifies a fragmented request completed at shutdown, the closing response, EOF, and clean server exit in normal and ASan/UBSan HTTP smokes. This does not drain background jobs or introduce a configurable grace period.

Provider-neutral database values update — 2026-10-26

std/db/core.yz defines tagged SQL values for NULL, Boolean, Int32, Int64, Float64, Text, and Bytes, with checked accessors and explicit driver capability flags. std/db/postgres.yz maps them to PostgreSQL Bind parameters, including OID-typed NULL and bytea, and decodes known integer, Boolean, finite Float64, text, and bytea result columns into the shared contract. Adapter errors use fixed DbError categories/messages. tests/database_core.test.yz passes normally and as an ASan/UBSan native executable. Schema-to-shape mapping and a working second provider are still absent.

Work completed in the current runtime-hardening milestone

  • Validated HTTP Host syntax and enforced an exact YAZA_ALLOWED_HOSTS list. Loopback defaults to 127.0.0.1, localhost, and the configured loopback address; non-loopback binds require an explicit list of up to 32 host names without wildcards or ports. Host matching is case-insensitive and ignores the request port. The API HTTP smoke rejects wildcard configuration and an unlisted hostname and accepts an explicitly allowed mixed-case hostname on macOS. Browser DNS-rebinding and Linux behavior remain unverified. Non-empty request bodies require application/json; path and query values use bounded percent-decoding.
  • Added PostgreSQL statement, lock, and idle-transaction timeouts on the API connection.
  • On shutdown, stop accepting, collect queued socket readiness without blocking, complete requests already readable on accepted sockets, and close remaining connections before cleanup; the fragmented-request shutdown smoke covers this path.
  • Added sanitizer builds, a libFuzzer-compatible parser harness with a deterministic sanitizer fallback, and test-runner isolation after compile errors.
  • Added a bounded child-process timeout that terminates the child process group and reaps the child.
  • Added source file and line locations to errors in the main native compilation path.
  • Added bounded program/request arenas, explicit promotion of persisted in-memory CRUD records, allocator accounting checks, and a 100,000-request RSS smoke test.

The remaining rows are real compiler/runtime work; documentation or a template does not count as implementing them.