v0.13.1
Three parts of the host were declared to the core as absent and could not be configured otherwise, so three product-facing features were dead on arrival in 0.13.0. Each is now wired, and each has a test that fails without it.
All three surfaced when a real product suite migrated to 0.13.0. They shipped because account.getUserId() and preimage.submit() had no coverage here.
Fixed
account.getUserId() failed for every product with Unknown: No primary username for this session. The session was minted with both username fields empty, on the assumption that the core resolves them itself. It does — but only from the dotNS contracts on Asset Hub, and it gives up at once when the host declares no Asset Hub, which this one did. Sessions now carry "<name>.01" for the active account (alice.01, bob.01), following switchAccount.
A chain: 'Bulletin' network never reached the core, so preimage.submit() could not work at all — the core asked to connect to the all-zero genesis and got bulletin chain unavailable: … no chain configured for genesis 0x0000…. The core routes its own Bulletin and Asset Hub traffic by the genesis hashes handed to it at boot, not by anything supportedChains() reports, and both were hard-coded to all-zero. They now come from whichever configured network declares that chain role. Preimage lookup was unaffected.
The product's dotNS identifier was fixed at test-product.dot. The core refuses any call acting as a product account whose dotNsIdentifier is not the id the host declared the product under — signRaw, signPayload and createTransaction with PermissionDenied, statementStore.createProofAuthorized with UnknownAccount. A product signing under its own name got a blanket PermissionDenied with nothing in any log to explain it, and no option existed to change the id.
Added
productId on createTestHostServer and the Playwright fixture (default 'test-product.dot') — the dotNS identifier the host declares the product under, and the namespace the core scopes product storage and permissions to.
createTestHostFixture({
productUrl: "http://localhost:3000",
productId: "myapp.dot",
});It is not what productAccounts is keyed by — that is the dotNsIdentifier in the request, which the gate normally forces to the same value. Note that 'localhost' and 'localhost:<port>' are development wildcards the core admits for any dotNsIdentifier, so setting one turns the gate off entirely.
accounts[].username, overriding the derived "<name>.01":
accounts: [{ name: "Alice", uri: "//Alice", username: "zaphod.07" }]Changed
A network with chain: 'AssetHub' now has an effect on the core, where before it was declared absent. The core reads dotNS from it — product manifests, and the trustedProducts grants carrying cross-product access — so a grant that was refused instantly now costs a real round trip to that network's rpcUrl. Unchanged for a network with no chain role. Signing is untouched: still the in-page People loopback, still no network.
Upgrading
Nothing to change. Set productId if your product signs under its own dotNS name, and add a chain: 'Bulletin' network if you test preimage submission.
Full notes: CHANGELOG.md · README