Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1260 commits
Select commit Hold shift + click to select a range
d417a66
Merge pull request #358 from unicity-sphere/fix/issue-333-v6-recover-…
vrogojin May 30, 2026
c5962f0
chore(perf)(issue-363): opt-in perf-counters instrumentation on hot p…
vrogojin May 30, 2026
486795c
chore(perf)(issue-363): extend perf-counters to aggregator + recovery…
vrogojin May 30, 2026
e6fac98
test(harness)(issue-364-item6): strip multi-line perf-counter blocks …
vrogojin May 30, 2026
9588198
perf(profile)(issue-364-item2): suppress applySnapshot during sphere …
vrogojin May 30, 2026
725f01b
chore(perf)(issue-364-item3): add attribution counters for snapshot d…
vrogojin May 31, 2026
0da844c
merge(issue-364): Item #2 — suppress applySnapshot during clear
vrogojin May 31, 2026
a6e1807
merge(issue-364): Item #3 — attribution counters
vrogojin May 31, 2026
19f952e
merge(issue-364): Item #6 — test harness perf-counter contamination
vrogojin May 31, 2026
d2324d0
perf(profile)(issue-367): per-bundle provenance gate for Rule-4 skip
vrogojin May 31, 2026
616c74d
perf(profile/pointer)(issue-364-item1): cache recoverLatest head to e…
vrogojin May 30, 2026
2a1968e
perf(profile/pointer)(issue-366): publish-time cache invalidation for…
vrogojin Jun 1, 2026
1ed2da0
perf(profile)(issue-368): process-wide applySnapshot suppression duri…
vrogojin Jun 1, 2026
9b05d86
perf(profile/ipfs-client)(issue-369): retry-with-backoff + lower DEFA…
vrogojin Jun 1, 2026
badc759
merge: PR #373 (issue #367) Rule-4 per-bundle provenance gate
vrogojin Jun 1, 2026
2695317
merge: PR #374 (issue #366) recoverLatest cache with publish-time inv…
vrogojin Jun 1, 2026
118e1e6
merge: PR #376 (issue #369) pin retry-with-backoff + lower DEFAULT_PI…
vrogojin Jun 1, 2026
8e4113c
perf(profile/ipfs)(issue-370): single-shot CAR /dag/import + /dag/exp…
vrogojin May 31, 2026
7d7be89
test(profile/ipfs)(issue-370): export _setGatewayCapabilityForTest fo…
vrogojin May 31, 2026
fbbef6e
perf(payments)(issue-378): persist V6-RECOVER permanent verdict; shor…
vrogojin Jun 1, 2026
a19feee
merge: PR #379 (issue #378) V6-RECOVER permanent verdict persistence
vrogojin Jun 1, 2026
7e9c090
fix(payments)(#378): correct misleading 'clearing' log in V6-RECOVER …
vrogojin Jun 1, 2026
956b79f
perf: 6-PR perf-stack — CAR batching, Rule-4 provenance, pointer cach…
vrogojin Jun 1, 2026
07b5019
fix(communications)(page-freeze): degrade CID_REF_UNREADABLE — mirror…
vrogojin Jun 1, 2026
5eca35f
perf(profile/ipfs): adaptive cold-cache for sidecar probes — kill 404…
vrogojin Jun 1, 2026
0327e67
merge: PR #383 communications CID_REF_DEGRADE
vrogojin Jun 1, 2026
1499a93
merge: PR #384 sidecar adaptive cold-cache
vrogojin Jun 1, 2026
116b8d9
fix(profile)(security): keep identity / seed material out of OrbitDB
vrogojin Jun 1, 2026
96991eb
fix(profile)(security): lazy-backfill identity keys from fallback int…
vrogojin Jun 1, 2026
a9e6242
fix(payments)(#387): durable V6-RECOVER invalid status; balance exclu…
vrogojin Jun 3, 2026
bc28737
fix(payments)(#389): PR #388 review follow-up — V6-RECOVER ledger dis…
vrogojin Jun 3, 2026
e47da61
test(payments)(#390): manual repro — direct-send predicate-mismatch r…
vrogojin Jun 3, 2026
2f9a690
fix(payments)(#390): V6-RECOVER source-token state = transfer sourceS…
vrogojin Jun 3, 2026
b8b526d
chore(release): 0.0.a1
vrogojin Jun 3, 2026
2dfd7d7
merge: PR #388 V6-RECOVER #387/#389/#390 — durable invalid + root-cau…
vrogojin Jun 4, 2026
6101046
fix(payments)(#391): duplicate-bundle guard checks sourceTokenIds + l…
vrogojin Jun 3, 2026
55c8fe5
test(payments)(#391): soak + e2e for 4-hop round-trip duplicate-bundl…
vrogojin Jun 3, 2026
bc6895e
fix(payments)(#393): disable automated CID-based delivery via kill-sw…
vrogojin Jun 4, 2026
a43e788
test(payments)(#391/#393): handle INLINE_CAR_TOO_LARGE soft-pass in s…
vrogojin Jun 4, 2026
36742e5
test(e2e)(#391): fix amount unit bug + delete obsolete uint64 warnings
vrogojin Jun 4, 2026
246e0d0
merge: PR #392 #391 duplicate-bundle guard + load-tail SENT reconcili…
vrogojin Jun 4, 2026
e5d6938
feat(payments)(#394): re-enable automated CID delivery at the Nostr cap
vrogojin Jun 4, 2026
961da14
test(payments)(#394): add STRICT_CID_DELIVERY mode to round-trip soak
vrogojin Jun 4, 2026
0a20a35
feat(payments)(#394b): raise RELAY_SAFE_CAP_BYTES 96 KiB → 512 KiB
vrogojin Jun 4, 2026
c58f97f
test(transfer)(#394b): raise forced-inline-oversized N from 200 to 80…
vrogojin Jun 4, 2026
5f5901d
docs(#394): payment-round-trip demo playbook
vrogojin Jun 4, 2026
3f3dadf
merge: PR #395 #394 automated CID delivery re-enabled + 512 KiB inlin…
vrogojin Jun 4, 2026
ecb4317
test(accounting)(#397): invoice round-trip soak + full-recovery cap fix
vrogojin Jun 4, 2026
903fc80
fix(accounting)(#397): route invoice delivery through the token pipeline
vrogojin Jun 4, 2026
541b448
feat(accounting)(#401): wire publishUxfBundle into OUTBOX/SENT + reco…
vrogojin Jun 5, 2026
85700b6
Merge pull request #400 from unicity-sphere/fix/issue-397-invoice-via…
vrogojin Jun 5, 2026
d949844
Merge pull request #402 from unicity-sphere/feat/issue-401-invoice-ou…
vrogojin Jun 5, 2026
c19cccd
test(soak): adapt to canonical CLI UX (sphere-cli #32 + #35)
vrogojin Jun 5, 2026
1d2d7e2
Merge pull request #403 from unicity-sphere/fix/soak-scripts-canonica…
vrogojin Jun 5, 2026
8d66c53
feat(accounting): add returnAllInvoicePayments — bulk companion to re…
vrogojin Jun 5, 2026
faf65bf
test(soak)+docs: extend accounting roundtrip with partial-pay + bulk-…
vrogojin Jun 5, 2026
0e3290a
Merge pull request #405 from unicity-sphere/feat/accounting-return-al…
vrogojin Jun 6, 2026
70750bb
Merge pull request #406 from unicity-sphere/feat/soak-accounting-retu…
vrogojin Jun 6, 2026
4b62e9a
fix(accounting)(#404): attribute null-sender back-direction refunds v…
vrogojin Jun 6, 2026
7616c22
Merge pull request #413 from unicity-sphere/fix/issue-404-masked-refu…
vrogojin Jun 6, 2026
5293e9e
chore(soak)+docs: drop #404 workaround now that #413 is merged
vrogojin Jun 6, 2026
3b21b26
Merge pull request #414 from unicity-sphere/chore/post-404-soak-revert
vrogojin Jun 6, 2026
8832a95
fix(sphere)(sphere-cli#42): make Nostr nametag-binding publish fire-a…
vrogojin Jun 7, 2026
1a9d242
test(e2e)(sphere-cli#42): wallet-clear nametag-taken assertion → back…
vrogojin Jun 7, 2026
5ca2822
fix(test)(sphere-cli#42): bump detached-publish flush in wallet-clear…
vrogojin Jun 7, 2026
fc83797
test(e2e)(sphere-cli#42): skip legacy IpfsStorageProvider lifecycle test
vrogojin Jun 7, 2026
5c4221b
fix(sphere)(sphere-cli#42): snapshot address context + destroy-guard …
vrogojin Jun 7, 2026
cc14f3c
Merge pull request #415 from unicity-sphere/fix/issue-42-nametag-publ…
vrogojin Jun 7, 2026
c62757e
fix(profile)(sphere-sdk#419): pin OpLog blocks at depth=0 + emit one-…
vrogojin Jun 7, 2026
34286fa
fix(sphere-sdk)(#423): gate Nostr subscription on handler readiness
vrogojin Jun 8, 2026
7b3c899
fix(sphere-sdk)(#424): make AggregatorPinger flake-resilient
vrogojin Jun 8, 2026
ab7ca47
fix(profile): stabilize pin-count assertion in OrbitDB-write-failure …
vrogojin Jun 8, 2026
38f77a5
fix(payments): stabilize transient-classification assertion in negati…
vrogojin Jun 8, 2026
5561bfb
Merge pull request #430 from unicity-sphere/fix/profile-token-storage…
vrogojin Jun 8, 2026
8c0755b
Merge pull request #431 from unicity-sphere/fix/bundle-acquirer-trans…
vrogojin Jun 8, 2026
59639ca
test(integration): per-test TEST_DIR for nametag-normalization to fix…
vrogojin Jun 8, 2026
fde0f8c
Merge pull request #432 from unicity-sphere/fix/nametag-normalization…
vrogojin Jun 8, 2026
f458869
Merge pull request #385 from unicity-sphere/fix/profile-identity-keys…
vrogojin Jun 8, 2026
1e4edef
Merge pull request #422 from unicity-sphere/fix/issue-419-profile-syn…
vrogojin Jun 8, 2026
bd5bcca
Merge pull request #428 from unicity-sphere/fix/issue-423-gate-subscr…
vrogojin Jun 8, 2026
8c81b17
Merge pull request #429 from unicity-sphere/fix/issue-424-aggregator-…
vrogojin Jun 8, 2026
171a01c
Merge pull request #323 from unicity-sphere/fix/aggregator-proxy-heal…
vrogojin Jun 8, 2026
f67d88f
Merge pull request #324 from unicity-sphere/fix/relay-allowlist-misco…
vrogojin Jun 8, 2026
a2ac81d
fix(core)(#191): promote errMessage helper; replace lossy NametagMint…
vrogojin May 20, 2026
23c20b1
Merge pull request #192 from unicity-sphere/fix/issue-191-error-strin…
vrogojin Jun 8, 2026
736ee6d
test(integration): per-test TEST_DIR for 7 remaining flake-prone test…
vrogojin Jun 8, 2026
302b865
Merge pull request #433 from unicity-sphere/test/per-test-testdir-int…
vrogojin Jun 8, 2026
396a8d7
feat(infra)(#321): proxy serves /.well-known/trust-base.json + faucet…
vrogojin May 28, 2026
3714752
Merge pull request #326 from unicity-sphere/feat/serve-trust-base-fro…
vrogojin Jun 8, 2026
7c2a8e1
fix(profile/pointer)(issue-336): add PID-liveness probe to file lock …
vrogojin May 29, 2026
f6e05b4
Merge pull request #338 from unicity-sphere/fix/issue-336-file-lock-p…
vrogojin Jun 8, 2026
f00ea16
feat(uxf)(sphere-sdk#435): emit child + predecessor refs as Tag 42 CI…
vrogojin Jun 8, 2026
c382eca
fix(uxf)(sphere-sdk#435): review follow-ups before merge
vrogojin Jun 8, 2026
df2db1c
Merge pull request #436 from unicity-sphere/fix/issue-435-tag42-cid-l…
vrogojin Jun 8, 2026
f77e4dd
feat(uxf)(sphere-sdk#437): swap-roundtrip soak + demo playbook
vrogojin Jun 8, 2026
7a54446
fix(uxf)(sphere-sdk#437): adversarial-review follow-ups before merge
vrogojin Jun 8, 2026
50fd512
Merge pull request #439 from unicity-sphere/feat/issue-437-swap-round…
vrogojin Jun 8, 2026
b00a362
fix(transport)(sphere-sdk#442): gate mux relay sub until module handl…
vrogojin Jun 8, 2026
aa6c5d1
fix(swap)(sphere-sdk#445): lazy-load terminal swaps from storage in g…
vrogojin Jun 8, 2026
5fa03ba
fix(uxf)(sphere-sdk#437): section 10 poison-pill scan aborts on clean…
vrogojin Jun 8, 2026
763170d
fix(profile)(sphere-sdk#450): bound pre-shutdown publish-retry spin (…
vrogojin Jun 9, 2026
5c8e5b6
fix(payments)(sphere-sdk#444): split local-commit and remote-publish …
vrogojin Jun 9, 2026
18020a3
docs(uxf)(sphere-sdk#456): document escrow DIRECT address fallback fo…
vrogojin Jun 9, 2026
e8f4c11
docs(uxf)(sphere-sdk#455): investigation of single-coin faucet flakin…
vrogojin Jun 9, 2026
69f1128
test(core)(sphere-sdk#448): assert mux subscription gate stays closed…
vrogojin Jun 9, 2026
9b823d4
fix(profile)(sphere-sdk#454): address HIGH findings + structural-cast…
vrogojin Jun 9, 2026
5130977
fix(transport)(sphere-sdk#464): make MuxAdapter dispatch await async …
vrogojin Jun 9, 2026
03acc02
fix(swap)(sphere-sdk#457): fail fast when counterparty transport pubk…
vrogojin Jun 9, 2026
6c97cd1
fix(swap)(sphere-sdk#447): include terminal swaps in resolveSwapId/ge…
vrogojin Jun 9, 2026
550114c
feat(swap)(sphere-sdk#456): hardcode + export DEFAULT_ESCROW_ADDRESS=…
vrogojin Jun 10, 2026
948c796
feat(trader)(sphere-sdk#474): roundtrip soak + demo playbook + spec d…
vrogojin Jun 10, 2026
b2fd028
fix(market): use decimal-string bigints for all price fields (#483)
vrogojin Jun 10, 2026
8c7d93d
fix(soak)(sphere-sdk#474): three soak-script fixes surfaced in run-th…
vrogojin Jun 11, 2026
a063d4b
fix(oracle,soak): payments.validate() always reported invalid + stale…
vrogojin Jun 14, 2026
8b1955a
fix(swap)(sphere-sdk#535): use state-transition-sdk primitives for ve…
vrogojin Jun 14, 2026
a8081de
fix(communications)(sphere-sdk#551): swallow transient PROFILE_NOT_IN…
vrogojin Jun 15, 2026
8bf05bb
diag(transport)(sphere-sdk#559): relay #p-filter discriminator for fr…
vrogojin Jun 16, 2026
3b25571
feat(transport)(sphere-sdk#555): opt-out for NIP-17 self-wrap on send…
vrogojin Jun 17, 2026
33295d7
fix(transport)(sphere-sdk#559): re-export SendMessageOptions from top…
vrogojin Jun 21, 2026
8f35cc2
diag(transport)(sphere-sdk#559): instrument Mux dedup hydration + hit…
vrogojin Jun 21, 2026
f56dc67
fix(soak): trader-roundtrip §4 ACP probe — eliminate pipefail+SIGPIPE…
vrogojin Jun 21, 2026
1973ee4
fix(soak): trader-roundtrip §10 portfolio_balance parser — handle (#616)
vrogojin Jun 21, 2026
a3b2535
feat(uxf-v2): Phase 1 — repo prep, baseline, report-only conformance …
vrogojin Jul 6, 2026
c09dfd9
refactor(storage): rekey _meta.address to chainPubkey with alpha1 rea…
vrogojin Jul 6, 2026
069582b
feat(l1): remove L1 subsystem (Phase 2 steps 2-5, consolidated)
vrogojin Jul 6, 2026
efbd670
docs(l1): purge L1 references from top-level docs + Phase 2 report
vrogojin Jul 6, 2026
6949765
fix(l1)(steelman): address-guard sync tolerance + wallet-export consi…
vrogojin Jul 6, 2026
42bab2b
refactor(uxf-v2): move uxf/ → extensions/uxf/bundle/ (Phase 3.A step 1)
vrogojin Jul 6, 2026
737cd07
refactor(uxf-v2): move modules/payments/transfer/ → extensions/uxf/pi…
vrogojin Jul 6, 2026
415ee7d
refactor(uxf-v2): move profile/ → extensions/uxf/profile/ (Phase 3.A …
vrogojin Jul 6, 2026
468668e
refactor(uxf-v2): move UXF-only type files → extensions/uxf/types/ (P…
vrogojin Jul 6, 2026
8369f6b
feat(uxf-v2): extension scaffolding (SphereExtension + UxfHandle + fa…
vrogojin Jul 6, 2026
27ddd6e
feat(uxf-v2): ESLint core→extensions boundary + burn-down allowlist
vrogojin Jul 6, 2026
ef01406
docs(uxf-v2): Phase 3 report
vrogojin Jul 6, 2026
57b0718
test: fix 35 shape/path-drift test failures (Phase 2 + Phase 3)
vrogojin Jul 6, 2026
2fe1155
feat(compat): re-export L1 namespace + hexToWIF/generatePrivateKey st…
vrogojin Jul 6, 2026
d2c3b79
feat(profile/kv): ProfileKv (Node + browser) + LocalBlockCache substr…
vrogojin Jul 6, 2026
667862d
feat(profile/kv): ProfileKvAdapter — byte-stable ProfileDatabase impl
vrogojin Jul 6, 2026
1deb0da
feat(profile): opt-in KV substrate wiring (substrate: 'kv')
vrogojin Jul 6, 2026
0553920
refactor(profile): rename orbitdb-write-fairness → kv-write-fairness
vrogojin Jul 6, 2026
395ff3a
test(profile/kv): conformance suite for ProfileKv* + Adapter (+54 tests)
vrogojin Jul 6, 2026
eecf9d1
docs(uxf-v2): Phase 4 sub-phase 4-Adapter report (checkpoint)
vrogojin Jul 6, 2026
c002e0f
refactor(profile): flip factory default substrate from 'orbitdb' to 'kv'
vrogojin Jul 7, 2026
1112537
feat(profile): delete OrbitDB adapter and OpLog-specific recovery paths
vrogojin Jul 7, 2026
83b576a
feat(profile): delete Helia shims + http-block-broker + dead nostr-re…
vrogojin Jul 7, 2026
5a154ee
feat(profile): delete IPNS migration stack + IpfsStorageProvider
vrogojin Jul 7, 2026
308e00d
test(impl): delete IPFS state-persistence + tokenSync.ipfs wiring tests
vrogojin Jul 7, 2026
181c2eb
chore: remove 7 unused deps (@orbitdb/core, helia, gossipsub, libp2p-…
vrogojin Jul 7, 2026
503160d
feat(profile): narrow substrate option to 'kv' only
vrogojin Jul 7, 2026
f035d65
docs(uxf-v2): sub-phase 4-Swap report
vrogojin Jul 7, 2026
5c56f86
fix(profile)(steelman-4b): 3 critical fixes on the KV substrate
vrogojin Jul 7, 2026
30ddd7d
feat(uxf-v2)(phase-6.A,D): borrow token-engine + testnet2 constants (…
vrogojin Jul 7, 2026
34c7baa
feat(uxf-v2)(phase-6.A): stsdk-v1 alias + ESLint STSDK boundary rule
vrogojin Jul 7, 2026
2707a5d
docs(uxf-v2): payments disposition ledger (Phase 5 pre-flight)
vrogojin Jul 7, 2026
c247ba9
refactor(payments)(phase-5): lib/ cross-cutting extractions
vrogojin Jul 7, 2026
ad1e3a4
refactor(payments)(phase-5): split tokens/ helpers into submodule
vrogojin Jul 7, 2026
84b925f
refactor(payments)(phase-5): scaffolding for remaining concern submod…
vrogojin Jul 7, 2026
8d84c9c
docs(uxf-v2): Phase 5 payments-split progress report
vrogojin Jul 7, 2026
a8f3587
refactor(payments)(phase-5): split mint/ concern into submodule
vrogojin Jul 7, 2026
85705f2
refactor(payments)(phase-5): split nametag/ concern into submodule
vrogojin Jul 7, 2026
77b8b8c
refactor(payments)(phase-5): split import-export/ concern into submodule
vrogojin Jul 7, 2026
a091e53
refactor(payments)(phase-5): split payment-request/ concern into subm…
vrogojin Jul 7, 2026
49bb434
refactor(payments)(phase-5): split sync/ concern into submodule
vrogojin Jul 7, 2026
d085bcd
refactor(payments)(phase-5): split read-model/ concern into submodule
vrogojin Jul 7, 2026
b77580c
refactor(payments)(phase-5): split persistence/ concern into submodule
vrogojin Jul 7, 2026
a640a70
refactor(payments)(phase-5): quarantine V5-family into legacy-v1/
vrogojin Jul 7, 2026
07e3eda
refactor(payments)(phase-5): quarantine finalize* family into legacy-v1/
vrogojin Jul 7, 2026
3f4ec83
refactor(payments)(phase-5): quarantine commitment machinery into leg…
vrogojin Jul 7, 2026
55be667
refactor(payments)(phase-5): quarantine TXF/NOSTR-FIRST paths into le…
vrogojin Jul 7, 2026
66bfb4d
refactor(payments)(phase-5): quarantine V6-recover + mintNametag into…
vrogojin Jul 7, 2026
98e327f
chore(payments)(phase-5): tsconfig exclude legacy-v1/
vrogojin Jul 7, 2026
7a5b14b
refactor(payments)(phase-5): move OUTBOX ops to extensions/uxf/pipeli…
vrogojin Jul 7, 2026
47d8781
refactor(payments)(phase-5): move capability-warning to extensions/ux…
vrogojin Jul 7, 2026
e349ab8
refactor(payments)(phase-5): move recordUxfBundleSentHistory to exten…
vrogojin Jul 7, 2026
bc9dcce
refactor(payments)(phase-5): move durability-gate + source-ownership …
vrogojin Jul 7, 2026
5765993
refactor(payments)(phase-5): move worker helpers to extensions/uxf/pi…
vrogojin Jul 7, 2026
7673d11
refactor(payments)(phase-5): move publishUxfBundle to extensions/uxf/…
vrogojin Jul 7, 2026
8e2f70e
refactor(payments)(phase-5): move defaultSpentStateTransition to exte…
vrogojin Jul 7, 2026
7bcbfc6
test(payments)(phase-5): update source-invariant tests for module-glu…
vrogojin Jul 7, 2026
742814f
chore(eslint)(phase-5): add legacy-v1/ to STSDK+extension burn-down l…
vrogojin Jul 7, 2026
7e52dae
refactor(payments)(phase-5): move dispatchUxfConservativeSend to exte…
vrogojin Jul 7, 2026
432b43c
refactor(payments)(phase-5): move dispatchUxfInstantSend to extension…
vrogojin Jul 7, 2026
c06a6ba
refactor(payments)(phase-5): move buildDefault* factories to extensio…
vrogojin Jul 7, 2026
c6a9ae8
refactor(payments)(phase-5): extract UXF worker-fleet auto-install fr…
vrogojin Jul 7, 2026
6830b5e
chore(phase-6)(6.C-A): preemptive plumbing for token-engine anti-corr…
vrogojin Jul 7, 2026
9bd2987
chore(phase-6)(6-P2-1): bump @unicitylabs/state-transition-sdk to v2 …
vrogojin Jul 7, 2026
cd18158
refactor(payments)(phase-6-p2-2): quarantine 6 Group-A helpers to leg…
vrogojin Jul 7, 2026
89981e3
refactor(payments)(phase-6-p2-3): rewrite 6 Group-B capabilities as I…
vrogojin Jul 7, 2026
b4584c5
refactor(oracle)(phase-6-p2-4a): shrink UnicityAggregatorProvider — r…
vrogojin Jul 7, 2026
f186e8d
refactor(sdk)(phase-6-p2-4b-preamble): close 3 residual v1-import drifts
vrogojin Jul 7, 2026
4836d16
refactor(payments)(phase-6-p2-4b): slim rebuild PaymentsModule on ITo…
vrogojin Jul 7, 2026
a264dd5
refactor(sdk)(phase-6-p2-4c-preamble): close 10 residual extension er…
vrogojin Jul 7, 2026
c23d85f
refactor(accounting)(phase-6-p2-4c): slim rebuild AccountingModule on…
vrogojin Jul 7, 2026
bdb12f2
refactor(sphere)(phase-6-p2-4d): route SigningService through token-e…
vrogojin Jul 7, 2026
5eddb91
chore(eslint)(phase-6-p2-4d): remove core/Sphere.ts from STSDK_CORE_B…
vrogojin Jul 7, 2026
9ff3167
chore(phase-6)(smoke): add scripts/smoke-testnet2-mint.ts
vrogojin Jul 7, 2026
10a201e
chore(phase-6)(smoke): fix UCT coin id — v2 uses 64-hex, not symbol
vrogojin Jul 7, 2026
c3feee7
feat(sphere)(phase-6-p2-4e): wire SphereTokenEngine into Sphere.ts
vrogojin Jul 7, 2026
27f734d
feat(sphere)(phase-6-p2-4e): forward Sphere.init options + add facade…
vrogojin Jul 7, 2026
bbf777e
test(quarantine)(phase-6-p2-5): move 109 failing test files + 2 helpe…
vrogojin Jul 7, 2026
63df115
test(config)(phase-6-p2-5): exclude tests/legacy-v1/ from vitest + re…
vrogojin Jul 7, 2026
2650780
test(soak)(wave-6-p2-6): add mint-throughput soak against testnet2
vrogojin Jul 7, 2026
1f11414
test(soak)(wave-6-p2-6): add two-wallet send soak against testnet2
vrogojin Jul 7, 2026
95995e0
test(soak)(wave-6-p2-6): add multi-coin bundle soak against testnet2
vrogojin Jul 7, 2026
37b8502
test(soak)(wave-6-p2-6): add invoice lifecycle soak against testnet2
vrogojin Jul 7, 2026
97ba05d
fix(payments,accounting)(phase-6-p2-6b): close 2 soak-uncovered v2 sl…
vrogojin Jul 7, 2026
a64b3e3
fix(payments,accounting)(phase-6-p2-6c): thread memo + recipientAddre…
vrogojin Jul 7, 2026
49b3a3d
fix(payments,accounting)(phase-6-p2-6d): resolve sender directAddress…
vrogojin Jul 7, 2026
0baa721
test(v2)(phase-6-p2-7): restore critical test coverage — 8 files, 88 …
vrogojin Jul 7, 2026
57e85db
refactor(sphere-sdk)(wave-6-p2-8/1): extract wallet I/O to core/spher…
vrogojin Jul 7, 2026
f59ab8a
refactor(sphere-sdk)(wave-6-p2-8/2): extract epoch reset to core/sphe…
vrogojin Jul 7, 2026
d3df162
refactor(sphere-sdk)(wave-6-p2-8/3): extract nametag identity sync to…
vrogojin Jul 7, 2026
e21bdde
chore(sphere-sdk)(wave-6-p2-8): add sphere-*.ts extraction files to e…
vrogojin Jul 7, 2026
64b83e6
refactor(sphere-sdk)(wave-6-p2-8b/1): extract nametag ceremony to cor…
vrogojin Jul 7, 2026
9624cdf
refactor(sphere-sdk)(wave-6-p2-8b/2): extract identity+key storage to…
vrogojin Jul 7, 2026
56835b5
refactor(sphere-sdk)(wave-6-p2-8b/3): extract provider lifecycle + ev…
vrogojin Jul 7, 2026
d8be129
refactor(sphere-sdk)(wave-6-p2-8c): extract HD address management to …
vrogojin Jul 7, 2026
7f721f3
refactor(sphere-sdk)(wave-6-p2-8d): extract module initialization orc…
vrogojin Jul 7, 2026
2977c13
refactor(core)(phase-6-p2-8e): extract buildConnectivityManager to sp…
vrogojin Jul 7, 2026
6933666
chore(sphere-sdk)(wave-6-p2-9): quick wins — .env.example + soak-invo…
vrogojin Jul 7, 2026
a4d2cb0
Merge pull request #641 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 7, 2026
34989d9
test(sphere-sdk)(wave-6-p2-10a): PaymentsModule v2 test coverage — 7 …
vrogojin Jul 7, 2026
7d20702
test(pointer)(wave-6-p2-10b): restore pointer-layer v2 coverage — 5 f…
vrogojin Jul 7, 2026
fc5285a
Merge pull request #643 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 7, 2026
d8b1a81
fix(payments)(wave-6-p2-11): wire uxf-cid receive path via cidFetchGa…
vrogojin Jul 7, 2026
3b37150
test(wave-6-p2-11): waitForProof audit + uxf-cid receive coverage
vrogojin Jul 7, 2026
6e06a03
Merge pull request #644 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 7, 2026
e62ce04
Merge pull request #645 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 7, 2026
197e28d
fix(payments,accounting)(phase-6-p2-12): sender.directAddress wire hi…
vrogojin Jul 8, 2026
8fa9f1e
Merge pull request #648 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
271d91c
chore(scripts)(phase-6-p2-13): add soak-metrics harness for perf snap…
vrogojin Jul 8, 2026
d8a5434
Merge pull request #649 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
e5fe41b
perf(sphere)(phase-6-p2-14): process-wide trust-base fetch cache
vrogojin Jul 8, 2026
1d3d073
Merge pull request #650 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
63e2b23
fix(sphere)(phase-6-p2-15): await ensureTokenEngine before background…
vrogojin Jul 8, 2026
8e28dbe
Merge pull request #651 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
d895de5
feat(sphere)(phase-6-p2-16): migrate Profile pointer layer to v2 aggr…
vrogojin Jul 8, 2026
fb70e22
Merge pull request #652 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
217956d
feat(sphere-sdk)(phase-6-p2-17): v2-only Profile persistence via UXF …
vrogojin Jul 8, 2026
cc9ab0c
Merge pull request #653 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
6172f60
refactor(sphere-sdk)(phase-6-p2-18): delete v1 type aliases; migrate …
vrogojin Jul 8, 2026
03d9590
test(sphere-sdk)(phase-6-p2-18): quarantine v1-shape tests + wire enc…
vrogojin Jul 8, 2026
ccc90a3
docs(sphere-sdk)(phase-6-p2-18): soak-invoice-lifecycle prose off del…
vrogojin Jul 8, 2026
67faa80
Merge pull request #654 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
e43c140
refactor(sphere-sdk)(phase-6-p2-19): delete legacy v1 import path
vrogojin Jul 8, 2026
ef0d1a1
Merge pull request #655 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
47ebb38
fix(token-engine)(phase-6-p2-20): retry submitCertificationRequest on…
vrogojin Jul 8, 2026
d899ef8
Merge pull request #656 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
f7e4afb
fix(accounting)(phase-6-p2-21): register invoice token in payments af…
vrogojin Jul 8, 2026
f357427
Merge pull request #657 from unicity-sphere/vrogojin/uxf-v2-wave6-p2-…
vrogojin Jul 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# sphere-sdk e2e / soak configuration — copy to `.env` (gitignored).

# Unicity testnet2 v2 gateway (state-transition aggregator).
TESTNET2_GATEWAY=https://gateway.testnet2.unicity.network

# testnet2 gateway API key — NOT a secret: testnet2 keys are safe to
# commit here and in docs.
TESTNET2_API_KEY=sk_ddc3cfcc001e4a28ac3fad7407f99590

# Root trust base JSON URL (testnet2 = networkId 4).
TESTNET2_TRUSTBASE_URL=https://raw.githubusercontent.com/unicitynetwork/unicity-ids/main/bft-trustbase.testnet2.json
28 changes: 26 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI

on:
push:
branches: [main]
branches: [main, '@vrogojin/uxf-v2']
pull_request:
branches: [main]
branches: [main, '@vrogojin/uxf-v2']

jobs:
build:
Expand Down Expand Up @@ -33,3 +33,27 @@ jobs:

- name: Test
run: npm run test:run

conformance-report:
runs-on: ubuntu-latest
# Report-only: never blocks the build. Diffs the exported API surface against a
# frozen upstream main v0.11.4 snapshot as a burn-down metric for the uxf-v2 refactor.
# See docs/uxf/uxfv2-phase-1-report.md.
continue-on-error: true

steps:
- uses: actions/checkout@v4

- name: Use Node.js 22
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm

- name: Install dependencies
run: |
npm install --include=optional --ignore-scripts
npm rebuild

- name: API-conformance drift report
run: bash tests/harness/run-conformance.sh
99 changes: 99 additions & 0 deletions .github/workflows/external-acks-gate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# External Acks Gate (T.8.D production cutover)
#
# Why this exists (W6 / W2 plan rationale):
# The UXF Inter-Wallet Transfer Protocol v1 widens the `onIntent` callback
# shape across consumers. Three downstream repositories must update their
# integrations BEFORE we cut over production (T.8.D), or live wallets will
# silently drop incoming intents. We cannot land the cutover PR until each
# maintainer has signed off in their own repo.
#
# How acks are recorded:
# Each downstream repo opens a tracking issue with the label
# `uxf-transfer-v1-ack`. The maintainer closes the issue once their repo
# has shipped the widened callback. This workflow asserts all 3 are closed.
#
# Tracking issues (corrected from plan after repo audit at PR-prep time —
# `agentsphere` doesn't yet exist as a real GitHub repo so it's not in the
# active gate; if/when it lands, follow the "Adding a 4th external repo"
# instructions below):
# - unicity-sphere/sphere (label: uxf-transfer-v1-ack) — issue #302
# - unicitynetwork/openclaw-unicity (label: uxf-transfer-v1-ack) — issue #8
#
# Triggering model (label-gated):
# The job runs only when the PR carries the `t8d-cutover` label. This keeps
# the gate scoped to the cutover PR; ordinary PRs are unaffected. We
# re-evaluate on label add/remove and on every push to the PR head, so the
# check stays green/red in lockstep with the upstream issue state.
#
# Required secret:
# EXTERNAL_ACKS_TOKEN — a fine-grained PAT (or GitHub App token) with
# `Issues: Read` scope on the upstream repos listed above. The default
# `GITHUB_TOKEN` is scoped to THIS repo only and cannot read issues in other
# repos; passing it would surface as a 404, not an auth error, which is hard
# to debug. Configure under: Settings → Secrets and variables → Actions.
#
# Adding another external repo:
# 1. Add the new tracking issue (label `uxf-transfer-v1-ack`) in that repo.
# 2. Append `<owner>/<repo>` to the `REPOS` list in the gate step.
# 3. Ensure EXTERNAL_ACKS_TOKEN has `Issues: Read` on the new repo.
# 4. Update the T.8.D PR description to reference the new tracking issue.

name: External Acks Gate

on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened, labeled, unlabeled]

jobs:
external-acks-gate:
name: Verify external maintainer acks (T.8.D)
# Only run on the cutover PR — gated by the `t8d-cutover` label.
if: contains(github.event.pull_request.labels.*.name, 't8d-cutover')
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
steps:
- name: Verify EXTERNAL_ACKS_TOKEN is configured
env:
EXTERNAL_ACKS_TOKEN: ${{ secrets.EXTERNAL_ACKS_TOKEN }}
run: |
if [ -z "${EXTERNAL_ACKS_TOKEN:-}" ]; then
echo "::error::EXTERNAL_ACKS_TOKEN secret is not set."
echo "::error::This gate queries closed issues in the configured external repos."
echo "::error::Configure a fine-grained PAT with 'Issues: Read' on those repos."
echo "::error::Settings → Secrets and variables → Actions → New repository secret"
exit 1
fi

- name: Check external repos have a closed uxf-transfer-v1-ack issue
env:
GH_TOKEN: ${{ secrets.EXTERNAL_ACKS_TOKEN }}
run: |
set -euo pipefail
REPOS=(
"unicity-sphere/sphere"
"unicitynetwork/openclaw-unicity"
)
missing=()
for repo in "${REPOS[@]}"; do
# `gh issue list` honours --label and --state; --json id keeps output stable.
count=$(gh issue list \
--repo "$repo" \
--state closed \
--label uxf-transfer-v1-ack \
--json id \
--jq 'length')
if [ "$count" -lt 1 ]; then
echo "❌ $repo has no closed issue with label uxf-transfer-v1-ack — maintainer ack required before T.8.D merges"
missing+=("$repo")
else
echo "✅ $repo: $count closed uxf-transfer-v1-ack issue(s) found"
fi
done
if [ ${#missing[@]} -gt 0 ]; then
echo "::error::T.8.D cutover blocked — ${#missing[@]} external repo(s) missing acks: ${missing[*]}"
exit 1
fi
echo "All ${#REPOS[@]} external repos have signed off — T.8.D cutover gate passed."
175 changes: 175 additions & 0 deletions .github/workflows/pointer-sdk-canary.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
name: Pointer SDK Canary

# Triggers only when pointer-layer surface changes. The goal of this
# workflow is to catch silent drift in:
# (1) the KAT test vectors (SPEC §14)
# (2) the pinned @unicitylabs/state-transition-sdk version range
# (3) the package-major / pointer-layer-major alignment
#
# It does NOT replace the main `CI` workflow; it runs in parallel on
# pointer-touching PRs and fails closed if any of the invariants drift.
#
# See docs/uxf/PROFILE-AGGREGATOR-POINTER-TEST-SPEC.md §4 (W8 "SDK
# version pinning + CI canary") for the normative requirement.

on:
pull_request:
branches: [main]
paths:
- 'profile/aggregator-pointer/**'
- 'profile/pointer-wiring.ts'
- 'profile/profile-token-storage-provider.ts'
- 'tests/fixtures/pointer-kat-vectors.json'
- 'tests/fixtures/pointer-kat-vectors.sha256'
- 'tests/conformance/pointer/**'
- 'docs/uxf/PROFILE-AGGREGATOR-POINTER-TEST-SPEC.md'
- 'docs/uxf/PROFILE-AGGREGATOR-POINTER-SPEC.md'
- '.github/workflows/pointer-sdk-canary.yml'
workflow_dispatch: {}

permissions:
contents: read

jobs:
canary:
name: pointer-layer canary
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm

- name: Install dependencies
run: |
npm install --include=optional --ignore-scripts
npm rebuild

# ---- Invariant 1: KAT vectors checksum has not drifted --------
# The `.sha256` file is the checked-in source of truth. If a dev
# changes the KAT vectors intentionally (e.g. after a SPEC bump),
# they MUST regenerate the checksum and commit both files in the
# same PR. Silent drift is caught here.
- name: Verify KAT vectors checksum
run: |
set -euo pipefail
VECTORS="tests/fixtures/pointer-kat-vectors.json"
CHECKSUM="tests/fixtures/pointer-kat-vectors.sha256"
if [ ! -f "$VECTORS" ]; then
echo "ERROR: $VECTORS not found"
exit 1
fi
if [ ! -f "$CHECKSUM" ]; then
echo "ERROR: $CHECKSUM not found — regenerate via:"
echo " sha256sum $VECTORS | awk '{print \$1}' > $CHECKSUM"
exit 1
fi
EXPECTED=$(awk 'NR==1 {print $1}' "$CHECKSUM")
ACTUAL=$(sha256sum "$VECTORS" | awk '{print $1}')
if [ "$EXPECTED" != "$ACTUAL" ]; then
echo "ERROR: KAT vectors drift detected!"
echo " file: $VECTORS"
echo " expected: $EXPECTED"
echo " actual: $ACTUAL"
echo ""
echo "If this change is intentional (SPEC bump), regenerate:"
echo " sha256sum $VECTORS | awk '{print \$1}' > $CHECKSUM"
echo "and commit both files in the same PR."
exit 1
fi
echo "OK: KAT vectors checksum matches ($EXPECTED)"

# ---- Invariant 2: state-transition-sdk version is strictly pinned
# The pointer layer depends on AggregatorClient / RootTrustBase /
# InclusionProof types from @unicitylabs/state-transition-sdk.
# A floating range (^, ~, *) would allow silent ABI shifts under
# us. Enforce an exact pin (no range operator).
- name: Verify state-transition-sdk version is pinned exactly
run: |
set -euo pipefail
RAW=$(node -p "require('./package.json').dependencies['@unicitylabs/state-transition-sdk'] || ''")
echo "state-transition-sdk pin: '$RAW'"
if [ -z "$RAW" ]; then
echo "ERROR: @unicitylabs/state-transition-sdk missing from dependencies"
exit 1
fi
case "$RAW" in
^*|~*|*x*|*\**|\>*|\<*)
echo "ERROR: @unicitylabs/state-transition-sdk version '$RAW' is a range."
echo "Pointer layer requires an exact pin (e.g. '1.6.1-rc.f37cb85')."
exit 1
;;
esac
echo "OK: state-transition-sdk is exact-pinned"

# ---- Invariant 3: package-major ↔ pointer-layer-major alignment
# The pointer layer's HKDF info string embeds "v1" and the SPEC
# contract promises backwards-compat within a single major.
# If `package.json` version major bumps (0.x → 1.x etc.) without
# a corresponding pointer-layer-major bump (HKDF info rename +
# SPEC version), downstream wallets will silently re-derive
# different keys. Guard against that.
- name: Verify package-major aligns with pointer-layer-major
run: |
set -euo pipefail
PKG_VERSION=$(node -p "require('./package.json').version")
PKG_MAJOR=$(echo "$PKG_VERSION" | cut -d. -f1)
echo "package.json version: $PKG_VERSION (major=$PKG_MAJOR)"

# Expected pointer-layer major encoded in HKDF info constant.
# Parse profile/aggregator-pointer/constants.ts for the
# PROFILE_POINTER_HKDF_INFO literal and extract the trailing
# vN segment.
INFO_LINE=$(grep -E "PROFILE_POINTER_HKDF_INFO\s*=\s*utf8ToBytes\(" profile/aggregator-pointer/constants.ts | head -n1)
if [ -z "$INFO_LINE" ]; then
echo "ERROR: could not locate PROFILE_POINTER_HKDF_INFO in constants.ts"
exit 1
fi
POINTER_MAJOR=$(echo "$INFO_LINE" | sed -n 's/.*-v\([0-9][0-9]*\).*/\1/p')
if [ -z "$POINTER_MAJOR" ]; then
echo "ERROR: could not parse pointer-layer major from HKDF info"
echo " line: $INFO_LINE"
exit 1
fi
echo "pointer-layer major (from HKDF info): v$POINTER_MAJOR"

# Alignment rule (v1 phase): while package.json is on 0.x,
# the pointer layer is v1. When package.json bumps to 1.x,
# pointer-layer v1 must still be the live protocol until a
# SPEC v4.x bump ships v2. This guard fires if someone
# publishes a package with major >= 2 while the HKDF info
# still says v1 — a strong signal of silent skew.
if [ "$PKG_MAJOR" -ge 2 ] && [ "$POINTER_MAJOR" = "1" ]; then
echo "ERROR: package major=$PKG_MAJOR but pointer-layer is still v1."
echo "Either bump pointer-layer to v2 (rename HKDF info + SPEC §14) or"
echo "downgrade package major."
exit 1
fi
echo "OK: package-major=$PKG_MAJOR aligns with pointer-layer-v$POINTER_MAJOR"

# ---- Invariant 4: TEST-SPEC §4 coverage matrix audit ----------
# Fails CI if any H/W finding lacks PRIMARY or SECONDARY coverage.
# The parser + assertions live in the test file; this step is a
# thin shim that invokes them.
- name: Coverage matrix audit
run: npx vitest run tests/conformance/pointer/

# ---- Invariant 5: typecheck + lint of the pointer layer -------
- name: Typecheck
run: npm run typecheck

# Scope: only lint the conformance audit files — the pointer
# layer itself is linted by the main `CI` workflow. Keeping
# this scope tight avoids double-reporting pre-existing
# warnings in pointer-layer source.
- name: Lint coverage-audit scaffold
run: npx eslint tests/conformance/pointer/

# ---- Invariant 6: pointer-layer unit tests still pass ---------
- name: Run pointer-layer unit tests
run: npx vitest run tests/unit/profile/pointer/
Loading
Loading