Bit 0.37.0
Bit 0.37.0
Breaking changes
- A fallible function returns its error as its last return word on aarch64-macos, aarch64-linux and x86_64-linux (
runtime/ABI.mdsection 13). On the arm64 probe a!call costs 53.2 instructions and 7.8 cycles, from 134.3 and 19.2. std/smtp:Client.authPlainandClient.authLoginare removed; callClient.auth(Auth.Plain(user, pass))orAuth.Login. Every fallible call fails with a typedSmtpErrorthat carries the reply code, the enhanced status andtransient().Client.sendtakes aSendableand returns aDelivery, and a partly refused recipient list still delivers to the accepted ones.std/jwt:signtakes optionaltypandkid.std/http:requestWithStreamingBodytakes a typedStreamBody.std/xml:XmlErrorKindgainsNameTooLongandBadEncoding.- The checker refuses
catchon a non-fallible operand (E0188). - An import of a
std/or package module no longer loads that module's.test.bitfiles; they load for the module under test and its./imports.
Highlights
- Interfaces may require fields, satisfied by a class's own field.
string(rune),string([]rune)and[]rune(s)convert between UTF-8 text and runes.- Payload-free enums get
__variantName(),__variants()and__variantAt(i). - A
Where<T>literal is checked againstT: operators,and/or/notandrelated(...).std/whereholdsOp,JoinandClause. - A slice, map or
[]T(n)literal of constants is a legal class field default. std/cbor: an RFC 8949 decoder and a deterministic encoder.std/crypto: COSE_Key parsing and verification (ES256, ES384, EdDSA, RS256, PS256) and PKCS#8 Ed25519 private keys.std/xml: an element tree with namespaces, Exclusive XML Canonicalization 1.0 and XML-DSig verification.std/strings:normalizeandisNormalizedfor NFC, NFD, NFKC and NFKD (20034 of 20034 UCD 17.0.0 NormalizationTest rows pass) and Punycode.std/net:idnaToAscii,idnaToUnicodeandlookupTxt.std/hash:xxhash64,xxh3,xxh3x128and their streaming hashers; CRC-32C and CRC-32 by CPU instruction on arm64 and CRC-32C on x86-64.std/smtp: typedAuthwith XOAUTH2 and OAUTHBEARER, inline and alternative parts, RFC 2231 and RFC 2047 encoding,Options.timeout, and the RFC 9422LIMITSextension.std/http: package-level calls share one process-wide connection pool;Server.shutdowncloses idle keep-alive connections.- A spawn reuses a retired task block and its stack: 0.005 memory syscalls per spawn on aarch64-linux, from 7.0.
- Interface calls carry a per-site inline cache.
Compiler
- Return a fallible enum ok value in words so for x of it? does not box next()'s Option (de352fa)
- compiler: move lowerArgs, methodParamTypes, lowerArgsRest, lowerArgsFor from lower.bit to lowercall.bit (5ec7d3c)
- compiler: BIT_ERR_REG, plain free fallible functions return the error as the last ret word (d2158ed)
- compiler: split the trampoline's result words out of fnValueTrampoline; lint the errword case (ed49822)
- compiler: a ret-less body is unknown to the result-word check; a fall-off ret carries zero ok words (a251abe)
- x64: bind an Op.CallValue's CallWord run in one parallel move (xEmitCallValueWords) (5f160da)
- x64: move the CallValue dispatch decision into xEmitCallValueInst (keeps xEmitInstOps6 at complexity 10) (63324e0)
- compiler: BIT_ERR_REG, startup init bodies, the fallible main wrapper and the fn-value trampoline take the error word (c6c2736)
- compiler: BIT_ERR_REG, every declared fallible function (methods, generic instances) returns the error word and the static, generic and interface call producers bind it (4275045)
- codegen: write a multi-word ret's constant words straight into their return registers (3b0fc7c)
- regalloc: a constant every use folds takes no register (6f412a1)
- x64: zero a multi-word ret word with xor r32 instead of mov r64, 0 (ec5efab)
- compiler: BIT_ERR_REG, closures, Op.CallValue and both func-value trampolines carry the error word (cf261eb)
- BIT_ERR_REG: drop the dual publish and the err_get fallback, forward the flag through x64gate.sh (8b21bb3)
- project: load a std/ or package import without its .test.bit files; test files stay only for the module under test and its ./ imports (f618622)
- Flip BIT_ERR_REG on by default, pin it off for the IR differentials, document the error word in ABI.md section 13 (eb2e934)
- bit test: keep the keepalive edges on test declaration bodies (9e5a404)
- compiler: a fallible function's error path returns nil for a boxed-enum or array ok value instead of allocating its zero (ceadec7)
- compiler: emit __variantName/__variants only when a call reaches them (fad39ec)
- compiler: hide __-prefixed synthesized members from bit doc and member completion (a2361a7)
- lsp: member completion skips __-prefixed synthesized members (6452b9a)
- lsp: replay the loader's own file stage when judging a cached project fresh (b701729)
- compiler: build every IrFunc through irFuncFromBuilder/irFuncRebuilt/irFuncRenamed so keepAlive cannot be dropped (534191c)
- compiler: check Where literal operator objects, and/or/not keys and related(...) values (caa4735)
- compiler: interfaces may require fields, satisfied structurally by a class's own field (4af3d0c)
- enumvariants: type the __variantAt result with the enum name, keep synthesized calls out of --dump-types (4a6a19e)
- compiler: split lowerConvert's value-changing arms into lowerConvertValue (complexity 11 -> under 10 after ) (e5e0dd2)
- WIP: LICM refuses a wide const only inside an inner loop range, not the whole nest (f654533)
- arm64 hoists a nest's outer-body wide constant; a spilled threaded-constant parameter is recomputed, not reloaded (1305be3)
- x64: encode group-1 ALU immediates as 83 /digit ib when they fit a signed byte (15a7bba)
- Implement the UTF-8 rune conversions string(rune), string([]rune), []rune(s) (879105c)
- arm64: move compileFunction's remat marking into markArm64Remat (94fce18)
- LICM: licmPlanFor takes the LicmCtx, built by licmCtxFor (d6c88a0)
- regalloc: split widenRoot out of mergeAliases (6e6c62d)
- call_iface: per-site monomorphic inline cache (cc4a3b8)
- Split call_iface emission into arm64calliface.bit; fix a drifted ABI.md citation (b12a0a2)
- call_iface emitters take the IrInstr, not its four fields (d3d5323)
- x64callcheck: pin the cell loads' disp32 form (3a1411c)
- compiler: thread a fallible enum's ok words through
?andcatch(19bbaa6) - compiler: return a generic instance's result in words (1f56346)
- Synthesize __field(name): Option for interface-demanded by-name field reads; pkg/authz attributeOf uses it (1363944)
- x64: encode rsp add/sub as 83 /digit ib when the immediate fits a signed byte (7184ee0)
- Renumber blocks into emission order under --no-optimize; gate bench/cases with it (222cb86)
- LICM: keep a constant divisor in the loop body on every target (a0e60d2)
- call_iface: a bound cell's miss calls bit_rt_iface_lookup from the site (bd4d308)
- compiler: move cachedModuleTree out of project.bit into projectparsecache.bit (9e019e8)
- lsp: reuse the parsed tree of a module synthesis rewrote (6f07936)
- Order std/json ahead of __field class modules by renumbering after one load, not a second project load (b8b74ea)
Runtime
- std/hash: CRC-32C and CRC-32 by CPU instruction on arm64, CRC-32C on x86-64 SSE4.2 (3d59a87)
- runtime/sched: retake a worker blocked in a syscall bracket via the monitor thread (23af4e0)
- runtime: reuse retired task blocks and their guarded stacks (ace55ee)
- runtime: refuse out-of-range BIT_* env knobs at boot instead of clamping or looping (d0cf087)
- runtime/darwin: move guarded-stack mapping and the task-block cache to taskstack.bit; split trimStackSlop out of mapGuardedStack (dc2f3a8)
- runtime/gc: keep the alloc-cache home hit at the length; walk past a held home out of line (2b12d1b)
- runtime/gc: emit the alloc-cache walk last in its module so it moves no gc function (7bd8d64)
- std/net: lookupTxt(name) through the runtime resolver (11bcdbe)
Standard library
- std/http: parse [v6]:port hosts in URLs and write the brackets in Host (6dc5474)
- std/hash: add xxHash64 one-shot and streaming Xxhash64 (9b93628)
- std/hash: add xxh3_64 for inputs up to 240 bytes (1fea054)
- std/os homeDir, std/net isIpv4Literal/isIpv6Literal (632e423)
- std/hash: xxh3 long-input path and streaming Xxh3 (f14fa96)
- std/http: package-level calls share one process-wide pool, keyed by TLS config (daa05b4)
- std/http tests: refuse the over-budget post on its own connection (aa7fa11)
- std/http: format tlsScope (d2e2ea8)
- std/hash: xxh3x128 and streaming Xxh3x128, sharing the XXH3-64 long path (7cc0fe8)
- std/http: tlsScope hashes the client TlsConfig fields that exist after ; streamed requests key the pool with their extras (4691b0f)
- std/xml: name length limit, UTF-8 and Char validation (52ea4a2)
- std/hash: read 8-byte lanes with loadU64 in xxhash64, crc64nvme and XXH3 (0a90b91)
- std/xml: element tree (parse, Element, Node, child/children/text/attr) with namespaces (5993f5c)
- http: Server.shutdown closes keep-alive connections idling between requests (51eddd8)
- std/hash: crc64nvme lookups from eight [256]u64 tables, no bounds checks (3eade62)
- std/hash: xxhash64 tail reads its 8-byte lanes off one checked base pointer (4e0dd33)
- std/hash: XXH3 stripe kernel takes the core, five parameters (11d3640)
- net test: bound deadline-armed exchanges by a same-run no-deadline control, not 250 ms of wall clock (b1350a1)
- std/hash: slicing-by-8 with one 8-byte load per block for CRC-32C and CRC-32 (f786a8b)
- std/hash, runtime/cryptohw: bit fmt the CRC files (f012102)
- std/http: find the header terminator with a Horspool skip loop (7369e84)
- std/hash: three interleaved CRC streams joined by carry-less multiply, PCLMULQDQ folding for CRC-32 on x86-64 (580239d)
- std/hash: keep crc32ieeeSoft's slicing step written out; the inliner leaves crc32ieeeWord a call (72a6467)
- std/hash: crc32 split-length list as a function, not a module value that every importer initializes (6851e39)
- idleshutdown.test: drop a catch on the non-fallible Conn.read (c8e0812)
- std/hash: fold CRC-32 x86-64 blocks xor-then-fold and finish with pmovzxdq, under the 80-line function limit; gate on SSE4.1 (f479da1)
- smtp: encode attachment file names per RFC 2231 and escape quotes (989571c)
- Add std/cbor: RFC 8949 decoder and deterministic encoder (8d26fab)
- smtp: emit Date and Message-ID on every rendered message, add Message.setMessageId (1847018)
- std/crypto: COSE_Key parsing and verification (ES256, ES384, EdDSA, RS256, PS256) (536b989)
- std/cbor tests: own hex helpers, std/crypto now imports std/cbor (6fe15d4)
- std/crypto cose tests: split the vector tables under the function length limit (246900d)
- std/smtp: fail with a typed SmtpError carrying reply code, enhanced status and transient() (1eb26d5)
- std/tls: client handshake failures carry a typed kind (verification, negotiation, I/O) (1d5dc54)
- std/smtp: a TLS verification or negotiation failure is permanent, an I/O failure transient (56065c9)
- std/smtp: Message.addBcc (envelope-only) and addReplyTo (5067230)
- std/xml: Exclusive XML Canonicalization 1.0 (canonicalizeExclusive) (800ceb1)
- docs/stdlib/xml: canonicalizeExclusive and C14nOptions; test the worked example (0eb51ea)
- std/xml: XML-DSig verification with signature wrapping defenses (verifySignature, DsigKey, DsigOptions, SignedElement) (f15fddd)
- stdlib: add std/where with Op, Join, Clause and phantom Where (39a6508)
- std/smtp: Message.setHeader for custom headers, refusing structural names and invalid field names (496ac93)
- std/smtp: quoted-printable text parts when no larger than base64 (aa1acc1)
- std/smtp: Envelope, Raw and one Client.send over a Sendable; encode a text part once (a5990a2)
- std/smtp: Message.addAlternative for extra multipart/alternative parts such as text/calendar (cb7e397)
- std/smtp: inline parts via Message.addInline, rendered as multipart/related (998ef5a)
- std/jwt: signTyped writes a caller-chosen typ and kid into the JWS header (6cda503)
- stdlib/http: bodyreaderpool timeout asserts keep an exact lower bound, upper bound is a hang guard (46b893a)
- std/smtp: bound the connect and every command by Options.timeout (ede1da5)
- stdlib/net: test that tasks spawned before a deadline-armed read start while the spawner is parked (2d06e59)
- std/http: chunked request bodies with optional trailers for unknown-length sources (135ab89)
- std/http: fold chunked bodies into requestWithStreamingBody via a typed StreamBody (d2cdeaf)
- std/smtp: replace authPlain/authLogin with Client.auth(a: Auth) (ccd7dda)
- std/smtp: Auth.Xoauth2 and Auth.OauthBearer for Gmail and Microsoft 365 (c2a7663)
- std/smtp: send returns a Delivery; a partly refused recipient list still delivers (12ca233)
- std/crypto: ed25519ParsePrivateKey reads PKCS#8 Ed25519 keys (RFC 8410) (bba02a0)
- std/strings: Punycode encode and decode per RFC 3492 (a724a13)
- std/strings: normalize and isNormalized for NFC, NFD, NFKC, NFKD (375da0c)
- stdlib/net: bind the truncation fake's TCP listener first and retry the UDP bind on a collision (01b3a84)
- std/strings normalize: quick check and a two-stage table, no hex parsing or per-hit allocation (cdb1459)
- std/net: idnaToAscii and idnaToUnicode, UTS non-transitional processing (f0263ac)
- std/strings normalize: grow the output and the expansion through a returned slice, not a returned append (85cd0e4)
- std/smtp: Client.reset() and Client.noop() for pooled sessions (c0dc6d8)
- std/smtp: render a message in one pass into one Builder (1d07357)
- std/smtp: fold and encode header values into a Builder (8ff607b)
- stdlib tests: find the Unicode conformance files from BIT_REPO, not the cwd (a13bb64)
- std/strings normalize: keep the open segment's length in NormState instead of reslicing it (6123498)
- smtp: encode a long display name as space-joined RFC 2047 words, not a CRLF fold the header check refuses (9845d24)
- std/strings normalize: decode two- and three-byte sequences and read the record inline (2cbca42)
- smtp: parse the RFC 9422 LIMITS extension into Client.limits() (27918e9)
Tests
- selfhost-ir-signatures: retire 6679, 6570 and 6564 at the 0.36.0 pin (48925a1)
- Move the oracle-lag fixtures back to tests/cases and retire their gates (b44383d)
- releasesurface: allow std/xml XmlErrorKind's two new kinds (30246a7)
- compiler: BIT_ERR_REG, the for-of iterator next() call binds the error word of a fallible next (945a671)
- constimmfold: re-pin the x86-64 twoFolds atom at 42 bytes of code after freed a callee-saved register (c0c1908)
- optbce: a header testing i + k < len(s) proves s[i + j] for 0 <= j <= k (2a45aba)
- golden census: count the window cases (b92daaf)
- Checker: reject catch on a non-fallible operand (E0188) (4e59ddd)
- s3live: lock pkg/aws as a path entry in the RSS probe project (fae1602)
- releasesurface: allowlist the std/smtp error type change (ed6ae58)
- compiler: synthesize __variantName() and static __variants() on payload-free enums (0158fb9)
- compiler: lower a contiguous multi-label switch case to one range test (dcd8459)
- golden: census for the two cases (run 635, ir 18) (ccb5535)
- golden census: dRun 635 -> 636 (re-derived off disk, ) (3cd6195)
- rootabi: read call_word, re-derive minRtSymbols 84 -> 82 (3a2fa6c)
- compiler: check an object literal against Where, unknown field and wrong value type are compile errors (fba3a15)
- tests: re-point three SPEC.md:4633 citations to 4649 after the 12.3 condition-literal paragraph (fe2ea39)
- tests: where_ops_* golden cases for Where operators, combinators and related (901f3ae)
- spec, docs: Where operators, combinators and related in SPEC 12.3 and std/where; re-point SPEC.md:4649 citations to 4679 (724af52)
- lintself: refuse irFuncOf( and IrFunc{ outside compiler/ir.bit and check.bit files (cff4983)
- spec: Appendix A field_sig, re-pin SPEC.md line citations after the section 10.6 and 14.3 edit (327e014)
- lintself: irfuncctor exempts check.bit fixtures but not the compiler/check*.bit type checker (49787f8)
- tests: bit fmt the 21 iface-field and where-literal cases (eac3b6d)
- orm: synthesize static __className() on
@tableclasses and add it to Tabled (cd98acc) - Lower string(b[lo:hi]) to one string_from_byte_range call, no slice header (e57e0af)
- compiler: a class name passed to a Class parameter infers T and lowers to Class{} (2ae4ba5)
- Synthesize static __variantAt(i: int): E on payload-free enums (c6f20ed)
- tests: re-pin SPEC.md citations shifted by and (4705 -> 4709, 3663 -> 3667) (b3dc303)
- releasesurface: allowlist std/jwt sign's defaulted typ/kid parameters (eb992e6)
- compiler: slice, map and []T(n) literals of constants are legal class field defaults, rebuilt at every construction site (785a605)
- Repoint test citations after the SPEC and lowerlit edits (4d587df)
- checker: Repo.update accepts a composite-key class, E0180 stays for find/delete and for update with no key (5080e63)
- constimmfold: accept the 4-byte REX.W 83 /0 ib add fold and re-pin twoFolds at 36 code bytes after (7e80c1a)
- runtime/gc: find a thread's alloc-cache entry without a call when another thread holds its home (8074a41)
- tests: drop a private host name from the alloccollide comment (91cebc8)
- baselinesmacostail: cite BIT_GC_MIN_KB's default by ABI.md section (57828e4)
- docs private-name scan: match a name as a whole token, not a substring (5129acd)
- lspcache gate: an edit in a project whose class module precedes the __field interface re-parses only the edited module (57e84c8)
- lspcache gate: compare the __field project's edit cost against the same project without the interface (d3a7028)
- spawnjoinregionslinux: hold each batch's tasks alive and warm up before the baseline (90ec6da)
- optstrbox: admit a ret that forwards a call's string words (2f26b6a)
Documentation
- docs/stdlib/hash: document xxhash64 and the Xxhash64 streaming hasher (0e1c0f4)
- pkg/s3: credentials type, environment provider, single-flight expiring cache (a761759)
- docs/stdlib/hash: document xxh3_64 (30bfc5a)
- tools/gens3: emit shapes (classes, enums with Unknown, unions) to pkg/s3/gen_shapes_*.bit (8ba5c46)
- docs/stdlib/hash: document xxh3 and the Xxh3 streaming hasher (dbe065e)
- pkg/s3: shared AWS config and credentials file parser; Credentials.Profile for static-key profiles (0aa43d2)
- docs/stdlib/hash: document xxh3x128, Hash128 and Xxh3x128 (91b5701)
- pkg/s3: SigV4 query signing for presign with header hoisting, streaming payload markers (9d13574)
- pkg/s3: STS client, AssumeRole and AssumeRoleWithWebIdentity over awsQuery (d5e8ca3)
- pkg/s3: S3Error, error-body parsing and the 2xx-with-Error rule (9c76819)
- pkg/s3: Smithy rules-engine standard library for endpoint resolution (6a08d3b)
- tools/gens3: emit response deserializers (headers, prefix headers, status, payload, metadata) to pkg/s3/gen_resp_*.bit (74e103d)
- pkg/s3: pin aws.parseArn to the JS SDK parseArn vectors (aws-sdk-js-v3 054298b1520f) (4cb4b44)
- pkg/s3: standard retry strategy: classification, full-jitter backoff, retry quota, invocation headers (91badfa)
- tools/gens3: emit XML response deserializers to pkg/s3/gen_xmlde_*.bit on the std/xml tree (fde3032)
- tools/gens3: generate the S3 endpoint decision diagram walker, partitions and the 393 test cases (381e0e0)
- pkg/s3: guide section for the retry strategy, every exported symbol in an example (9fe0ee0)
- pkg/s3: restXml response body vectors (smithy bd0ed9e, 48 of 67) and the S3 API reference samples run through the XML deserializers (81b9f06)
- s3: compare the 393 endpoint model cases exactly, pin the 27 where the SDK adds a root slash (a7c6309)
- s3: resolve the endpoint of an operation from client config and operation input (21dadac)
- pkg/s3: adaptive retry mode: CUBIC client-side rate limiter (e9064c0)
- pkg/s3: guide: the adaptive retry mode and its rate limiter (db7b664)
- tools/gens3, pkg/s3: generate the request serializers (method, URI labels, query, headers, prefix headers, payload) and test them against the restXml request vectors (b64bae8)
- pkg/s3: adaptive retry takes a caller-supplied rate limiter (SendLimiter), shared across strategies (ec15519)
- pkg/s3: request checksums, ten algorithms, WhenSupported/WhenRequired, header or trailer placement (f57160b)
- pkg/s3: guide: propagate the strategy error in the watched-limiter example (890e0d9)
- tools/gens3, pkg/s3: generate the XML request body serializers (5c43cf0)
- pkg/auth: one OidcStrategy(provider, ..., opts) constructor with Provider and OidcOptions; drop google/microsoft/genericOidcStrategy, withScopes, OidcSource (7b59c00)
- pkg/auth docs and Inkwell guide: use OidcStrategy(Provider, ..., OidcOptions) (0092513)
- pkg/auth: LoginThrottle core: per-account and per-IP failure counters, backoff, lockout, reset on success (1f088ad)
- pkg/auth: fix a stale scope comment (8d26697)
- docs: add std/cbor page and stdlib index entry (8415dc3)
- docs: std/cbor examples pass fmt and typecheck (7f10370)
- pkg/auth: document LoginThrottle (brute-force chapter, security model note) (3188c38)
- pkg/aws: move SigV4 signing, credentials, shared config profiles, STS and the partition table out of pkg/s3 (c10487b)
- pkg/auth: validate Microsoft multi-tenant issuer from the id_token tid claim (7b380e0)
- pkg/auth: wire LoginThrottle and an audit hook into PasswordStrategy through PasswordOptions (d41806c)
- docs: std/crypto COSE keys guide and reference (36bb89c)
- pkg/auth docs: Microsoft multi-tenant sign-in and allowedTenants (8877e3c)
- pkg/auth: document PasswordOptions in the brute-force chapter and the exported surface (7ac4881)
- ABI.md: keep section 1.2.2's rewrite line-neutral so the line citations into it stay exact (04716cd)
- ABI.md: make section 1.2.2's rewrite exactly line-neutral (e36865a)
- pkg/auth: one-time token primitive with SHA-256 at rest, single use and a memory store (4c1d8ed)
- pkg/auth: TOTP recovery codes: generate N, salted hashes, single use, regenerate by replacing the list (3756151)
- pkg/mail: new package with Address, parseAddress and parseAddressList (RFC 5322 mailbox, RFC 2047 names, UTF-8) (ec4fc36)
- pkg/mail docs: print the round-trip check as a string (47d5127)
- pkg/auth: MemoryOneTimeStore panics on a bad capacity so its constructor is infallible; docs for one-time tokens (4e4c392)
- pkg/auth: recovery codes hashed with Argon2id, one hash per redemption via a lookup id, optional LoginThrottle (98c9102)
- pkg/s3: aws-chunked encoder (STREAMING-UNSIGNED-PAYLOAD-TRAILER) with exact 8 KiB chunks (91d32fb)
- pkg/auth: email verification on one-time tokens (5dadf4f)
- pkg/authz: scaffold, bit.work member and error classes (Denied, NotFound, StoreUnavailable, InvalidPolicy, NotFilterable) (0b61e4b)
- docs: enum __variantName/__variants in the types reference and SPEC 14.7; enumcol header (8fd9199)
- pkg/auth: atomic OneTimeStore.replace and issue(live = Live.One); verify-email send leaves one live link (3f2c599)
- docs/stdlib/xml: verifying a signed assertion, verifySignature and its types (1e6140a)
- pkg/s3 chunked.test.bit: run the looping tests on the full 66560-byte fixture (71bfd50)
- pkg/auth: magic-link login Strategy on one-time tokens (f729c42)
- auth: merge provisioningUri and provisioningUriWith into one provisioningUri taking ProvisioningOptions (b1601fc)
- pkg/auth: magic-link tests for requireAuth and docs chapter (ccc4f62)
- docs/stdlib/smtp: document Raw.render and Raw.envelope (test-stdlib-docs was red from ) (ec8599a)
- pkg/auth: magic-link test: a browser holding another binding value is refused (de385df)
- pkg/authz: ActionEnum bound, Authz constructor with the openStore seam, actionName, Manage wildcard, CRUD variants record (87a2769)
- pkg/mail: Message and renderMessage to std/smtp bytes and envelope (5450873)
- pkg/auth: JWT bearer access tokens, BearerStrategy and the RFC 6750 401 (9ffbbf1)
- std/jwt: fold signTyped into sign(key, payload, typ = "JWT", kid = "") (b6c0139)
- pkg/auth: the race test pins its own worker count instead of failing on the ambient one (93f4a80)
- pkg/mail: generate the text/plain alternative from html when Message.text is empty (e1de43c)
- pkg/kv: the race test pins its own worker count instead of failing on the ambient one (277914a)
- pkg/mail: DKIM relaxed header and body canonicalization (RFC 6376 3.4) and splitMessage (7d22156)
- pkg/authz: Subject interface (id, roles), attributeOf for $user.x placeholders, guest as the absent subject (d005647)
- docs/stdlib/smtp: propagate the dial error in the timeout example (8fbd1ab)
- pkg/auth: API keys with prefix and CRC-32 checksum, SHA-256 at rest, scopes, last-used, revoke, bearer strategy (ca71827)
- pkg/auth: API keys guide, docs index row and README symbols (ccbc593)
- pkg/authz: CEL subset lexer lexCel with byte spans, 4096-byte and 512-token limits (b09fb78)
- orm: add Repo.save(v), insert when the
@idis zero else update (c00011d) - pkg/aws: signV4 drops a caller Date header and lets a caller x-amz-content-sha256 win, as
@smithy/signature-v4 sign() does (3e7820e) - pkg/toml: decode a decimal from locals, not a DecimalShape object per number (8343faf)
- pkg/mail, pkg/auth: declare the empty and scope defaults on the fields (cbd861d)
- pkg/redis: every set command through Cmd, SetBatch, SSCAN iterator, live tests, sets.md (e4f9750)
- runtime/ABI.md: BIT_WORKERS bounds running workers; document the blocked-worker retake (ce060b3)
- pkg/redis: SCAN-family iterators return a failed page fetch as an error, not a panic (c4857ea)
- pkg/authz: parseAction(s): A! on ActionEnum.__variantAt, documented in actions.md (8822b80)
- pkg/redis: ZsetScan.next() returns a failed page fetch as an error, like the other SCAN iterators (09e2fc8)
- pkg/authz: cite the CEL language definition without a dangling .md name (28eb2d8)
- pkg/mail: Mailer(transport, Options), Transport, Receipt, MailError variants and the Outbox test transport (1bb7507)
- pkg/redis: list.bit, every list command incl. BLPOP/BRPOP/BLMOVE/BLMPOP on a dedicated connection (ed79a0c)
- pkg/redis/docs: lists.md and its README row (9bd8147)
- docs/stdlib/strings: Comparing text that looks the same, with Form, normalize and isNormalized (3835ed9)
- pkg/redis: zset blocking pops run on runBlocking, positions refuses a negative count (17bd733)
- pkg/redis: ListBatch.positions with a negative count returns an already-failed Future (b9226cf)
- pkg/mail: Attachment, Attachment.file, inline images by cid, render checks and the 25 MiB limit (10b59cd)
- pkg/mail: DKIM signer (rsa-sha256, ed25519-sha256), oversigned headers, RFC 8463 vectors (7e61aa4)
- pkg/mail docs: Attachments chapter on Inkwell's publish mail (f06ad4c)
- pkg/auth: opt-in PasswordPolicy after NIST SP 800-63B (9cc2638)
- pkg/auth docs: Check a new password (PasswordPolicy guide, README, security model) (952173b)
- pkg/auth: record NFKC normalization in the stored hash (n=nfkc) and verify exactly what it says (3f98c1b)
- docs: add the Limits section for std/smtp (54bbf8e)
Build and tooling
- tools/gens3: model loader for shapes, members and the Smithy traits the generator reads (bbd9385)
- Repin stage0 to v0.36.0 (4100133)
- stage0 pin header: record the v0.36.0 reproducibility run (2a73991)
- selfhost-ir-signatures: declare 6730-fallible-enum-words against the 0.36.0 oracle (8fee722)
- tools/gens3: emit the ErrorKind table (21 modeled errors, 124 unmodeled reference codes, client kinds) to pkg/s3/gen_errors.bit (6b0e257)
- tools/gens3: restXml response header vectors (smithy bd0ed9e) run through the generated deserializers, 9 of 28 apply (eae170f)
- tools/gens3: dispatch subcommands from one function to keep main under complexity 10 (756f06b)
- tools/gens3: test the endpoint emitter: counts, determinism, freshness, failure paths (3b32e94)
- tools/gens3: tests for the XML deserializer emitter and the body vectors: counts, freshness, spellings, failure paths (0d9cc91)
- tools/gens3: generate pkg/s3 endpointOperations from the model (fea0c04)
- tools/gens3: emit the httpChecksum operation table to pkg/s3/gen_checksum_ops.bit (3e5e317)
- tools/gens3: pack vector files by stem and flag every XML item shape, not only enums (d100436)
- selfhost-ir-signatures: declare the and divergences against the 0.36.0 oracle (35f2399)
- selfhost-ir-signatures-selfcheck: mutate a 6840 near miss by opcode, not by an id the signature erases (eeb7fe7)
- scripts: types differential skips a file the oracle's own check declines (44829b2)
- scripts: declare 6982-error-path-nil and 7058-switch-case-range against the 0.36.0 oracle (b1787e8)
- scripts: put the ptrs lists back after the 6982/7058 walks so the 6730 combination still sees boxes (9f6f350)
- scripts: make ir-signatures-walk.sh a function-only sourced library (db816ef)
- scripts: declare 6990-interface-field-presyntax and 6997-where-in-key-presyntax against the 0.36.0 oracle (f95ee4f)
- scripts: declare 6558-string-from-byte-range and 6988-table-class-name-synth-shift against the 0.36.0 oracle (4900f2f)
- scripts: explainMismatch's awk under LC_ALL=C too (093c91e)
- selfhost-diffcheck: declare the two intended check-time rejections against the 0.36.0 oracle (236689a)
- selfhost-diffverdict: declare the string(rune) as an explained MISSING cell until the next stage0 repin (e19f024)
- scripts: declare 5786-licm-wide-const-placement against the 0.36.0 oracle on arm64 hosts (df0c087)
- tools/genunicode: emit Unicode normalization tables into stdlib/strings (d85c4fd)
- tools/genunicode: emit Unicode normalization tables into stdlib/strings (332a6d9)
- abiarity: both iface lookups are emitted directly again (621c211)
- tools/genunicode: emit the UTS IDNA mapping table into stdlib/net (3055640)
- tools/genunicode: idnaemit writes its hex tables through its own writeHexConst (4c6e8a2)
Benchmarks
Artifacts
Published for aarch64-linux, aarch64-macos, x86_64-linux and x86_64-windows.
See dist/README.md for the full target table, the archive layout,
the required BIT_STDLIB/BIT_LIBBITRT environment, and the
SHA256SUMS format.
Verify a download before running it:
sha256sum --check --ignore-missing SHA256SUMS # shasum -a 256 on macOSFull commit log: v0.36.0..HEAD