Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
33edd46
docs: design service resource safety
ty-everett Aug 4, 2026
a46a2e5
feat: harden service resource boundaries
ty-everett Aug 4, 2026
8a17821
chore: refresh pull request evidence
ty-everett Aug 4, 2026
f650b68
refactor: satisfy resource hardening quality gates
ty-everett Aug 4, 2026
b746236
refactor: simplify bounded message pagination
ty-everett Aug 4, 2026
cce8c69
fix: close authenticated response security findings
ty-everett Aug 4, 2026
24dd68e
merge: integrate wallet performance base
ty-everett Aug 4, 2026
056a8e8
chore: refresh message box API bindings
ty-everett Aug 4, 2026
fc47068
test: cover service resource hardening boundaries
ty-everett Aug 4, 2026
1947b08
Merge remote-tracking branch 'origin/main' into codex/service-resourc…
ty-everett Aug 4, 2026
f208f32
chore(wallet): record measured browser bundle growth
ty-everett Aug 4, 2026
90bf5e6
Merge remote-tracking branch 'origin/main' into codex/service-resourc…
ty-everett Aug 4, 2026
6144aba
test(overlay): close hosted patch coverage gaps
ty-everett Aug 4, 2026
e9b7fd5
feat(wallet): refresh ChainTracks resiliency
ty-everett Aug 6, 2026
c0dc294
fix(ci): resolve ChainTracks Sonar findings
ty-everett Aug 6, 2026
e54679c
chore: refresh dependency evidence check
ty-everett Aug 6, 2026
d10d165
fix(ci): include mobile sources in patch coverage
ty-everett Aug 6, 2026
67721d3
test(wallet): cover ChainTracks resilience boundaries
ty-everett Aug 6, 2026
09bcefb
test(wallet): cover in-memory storage boundaries
ty-everett Aug 6, 2026
b1e4c8e
test(wallet): cover orphaned live storage ancestry
ty-everett Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ paths-ignore:
- infra/chaintracks-server/src/security/edgePolicy.ts
- packages/overlays/overlay-express/src/security/edgePolicy.ts
- packages/wallet/wallet-toolbox/src/storage/remoting/edgePolicy.ts
- infra/uhrp-server-cloud-bucket/src/resourceLimits.ts
- infra/wallet-infra/src/KnexPaymentReplayStore.ts
22 changes: 20 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ jobs:
run: |
node scripts/sync-service-rate-limit-policy.mjs --check
node scripts/sync-service-edge-policy.mjs --check
node scripts/sync-service-runtime-copies.mjs --check

- name: Enforce inventory, exception, baseline, and contract ratchets
run: >-
Expand Down Expand Up @@ -714,8 +715,23 @@ jobs:
name: build-outputs
path: .ci-artifacts
- run: tar --extract --gzip --file .ci-artifacts/build-outputs.tar.gz
- name: Verify packed mobile consumer with Metro and Hermes
run: pnpm --filter @bsv/wallet-toolbox-mobile run test:mobile
- name: Verify packed mobile consumer with Metro and Hermes and retain source coverage
run: |
pnpm --filter @bsv/wallet-toolbox-mobile run test:mobile
pnpm --filter @bsv/wallet-toolbox-mobile run test:coverage
node scripts/normalize-lcov-paths.mjs \
packages/wallet/wallet-toolbox/mobile/coverage/lcov.info \
packages/wallet/wallet-toolbox
mkdir -p .coverage-output
cp packages/wallet/wallet-toolbox/mobile/coverage/lcov.info \
.coverage-output/wallet-mobile.lcov.info
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: coverage-wallet-mobile
path: .coverage-output/
if-no-files-found: error
include-hidden-files: true
retention-days: 1

coverage-sdk:
name: Coverage / SDK
Expand Down Expand Up @@ -1045,13 +1061,15 @@ jobs:
(needs.coverage-did.result == 'success' || needs.coverage-did.result == 'skipped') &&
(needs.coverage-wallet.result == 'success' || needs.coverage-wallet.result == 'skipped') &&
(needs.coverage-wallet-monitor.result == 'success' || needs.coverage-wallet-monitor.result == 'skipped') &&
(needs.wallet-mobile-platform.result == 'success' || needs.wallet-mobile-platform.result == 'skipped') &&
(needs.coverage-verifast.result == 'success' || needs.coverage-verifast.result == 'skipped')
needs:
- prepare
- coverage-sdk
- coverage-did
- coverage-wallet
- coverage-wallet-monitor
- wallet-mobile-platform
- coverage-verifast
- coverage-other
runs-on: ubuntu-latest
Expand Down
2 changes: 1 addition & 1 deletion .sonarcloud.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ sonar.exclusions=packages/verifast/src/wasm/bdk-core.*,conformance/generated/**,
# into self-contained Docker/package build contexts and checked byte-for-byte
# in CI. Analyze the code for issues, but do not report intentional generated
# copies as source duplication.
sonar.cpd.exclusions=**/*.test.ts,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx,**/*.man.test.ts,**/__test__/**,**/__tests__/**,**/test/**,**/tests/**,**/*.vectors.ts,**/eslint.config.js,infra/wab/src/security/rateLimitPolicy.ts,infra/uhrp-server-basic/src/security/rateLimitPolicy.ts,infra/uhrp-server-cloud-bucket/src/security/rateLimitPolicy.ts,infra/message-box-server/src/security/rateLimitPolicy.ts,infra/uhrp-server-basic/src/security/edgePolicy.ts,infra/uhrp-server-cloud-bucket/src/security/edgePolicy.ts,infra/message-box-server/src/security/edgePolicy.ts,infra/chaintracks-server/src/security/edgePolicy.ts,packages/overlays/overlay-express/src/security/edgePolicy.ts,packages/wallet/wallet-toolbox/src/storage/remoting/edgePolicy.ts
sonar.cpd.exclusions=**/*.test.ts,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx,**/*.man.test.ts,**/__test__/**,**/__tests__/**,**/test/**,**/tests/**,**/*.vectors.ts,**/eslint.config.js,infra/wab/src/security/rateLimitPolicy.ts,infra/uhrp-server-basic/src/security/rateLimitPolicy.ts,infra/uhrp-server-cloud-bucket/src/security/rateLimitPolicy.ts,infra/message-box-server/src/security/rateLimitPolicy.ts,infra/uhrp-server-basic/src/security/edgePolicy.ts,infra/uhrp-server-cloud-bucket/src/security/edgePolicy.ts,infra/message-box-server/src/security/edgePolicy.ts,infra/chaintracks-server/src/security/edgePolicy.ts,packages/overlays/overlay-express/src/security/edgePolicy.ts,packages/wallet/wallet-toolbox/src/storage/remoting/edgePolicy.ts,infra/uhrp-server-cloud-bucket/src/resourceLimits.ts,infra/wallet-infra/src/KnexPaymentReplayStore.ts
# Narrow compatibility exceptions are registered with owner, evidence, review
# dates, and objective removal conditions in repository-health/exceptions.json.
sonar.issue.ignore.multicriteria=werrProtocolNames,curveSingletonAlias,curveSingletonReturn,scriptOpcodeDispatch
Expand Down
4 changes: 4 additions & 0 deletions conformance/generated/messaging/types.gen.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -633,6 +633,8 @@ export interface operations {
limit?: number;
/** @default 0 */
offset?: number;
/** @description Compatibility alias for offset; both must match if supplied together. */
skip?: number;
};
};
};
Expand All @@ -649,6 +651,8 @@ export interface operations {
messages: components["schemas"]["StoredMessage"][];
limit: number;
offset: number;
/** @description Offset for the next page; unchanged when the result is empty. */
nextOffset: number;
hasMore: boolean;
};
};
Expand Down
3 changes: 3 additions & 0 deletions conformance/generated/messaging/types.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

168 changes: 164 additions & 4 deletions conformance/runner/reports/report.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"timestamp": "2026-07-24T22:49:48.768Z",
"totalVectors": 6650,
"totalFiles": 74,
"timestamp": "2026-08-06T03:52:21.445Z",
"totalVectors": 6681,
"totalFiles": 75,
"parseErrors": 0,
"suites": [
{
Expand Down Expand Up @@ -28499,6 +28499,166 @@
}
]
},
{
"name": "transport/air-gap-optical",
"cases": [
{
"name": "transport.air-gap-optical.crc32.1",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.length.2",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.length.3",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.length.4",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.5",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.6",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.7",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.8",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.9",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.10",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.11",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.12",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.13",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.14",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.encode.15",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.decode.16",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.decode.17",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.decode.18",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.session.19",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.session.20",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.session.21",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.session.22",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.23",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.24",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.25",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.26",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.27",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.28",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.29",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.30",
"pass": true,
"error": null
},
{
"name": "transport.air-gap-optical.reject.31",
"pass": true,
"error": null
}
]
},
{
"name": "wallet/brc100/abortaction",
"cases": [
Expand Down Expand Up @@ -33625,4 +33785,4 @@
]
}
]
}
}
35 changes: 34 additions & 1 deletion conformance/runner/reports/results.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="bsv-conformance" tests="6650" failures="0" errors="0" skipped="0">
<testsuites name="bsv-conformance" tests="6681" failures="0" errors="0" skipped="0">
<testsuite name="auth/brc31-handshake" tests="16" failures="0" errors="0" skipped="0">
<testcase name="auth.brc31-handshake.1" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.2" classname="auth/brc31-handshake" time="0"/>
Expand Down Expand Up @@ -5743,6 +5743,39 @@
<testcase name="sync.gasprotocol.19" classname="sync/gasp-protocol" time="0"/>
<testcase name="sync.gasprotocol.20" classname="sync/gasp-protocol" time="0"/>
</testsuite>
<testsuite name="transport/air-gap-optical" tests="31" failures="0" errors="0" skipped="0">
<testcase name="transport.air-gap-optical.crc32.1" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.length.2" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.length.3" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.length.4" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.5" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.6" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.7" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.8" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.9" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.10" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.11" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.12" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.13" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.14" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.encode.15" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.decode.16" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.decode.17" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.decode.18" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.session.19" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.session.20" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.session.21" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.session.22" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.23" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.24" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.25" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.26" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.27" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.28" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.29" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.30" classname="transport/air-gap-optical" time="0"/>
<testcase name="transport.air-gap-optical.reject.31" classname="transport/air-gap-optical" time="0"/>
</testsuite>
<testsuite name="wallet/brc100/abortaction" tests="8" failures="0" errors="0" skipped="0">
<testcase name="wallet.brc100.abortaction.1" classname="wallet/brc100/abortaction" time="0"/>
<testcase name="wallet.brc100.abortaction.2" classname="wallet/brc100/abortaction" time="0"/>
Expand Down
2 changes: 1 addition & 1 deletion docs-site/public/assets/asyncapi/authsocket/index.html

Large diffs are not rendered by default.

40 changes: 40 additions & 0 deletions docs/examples/kubernetes/resource-profiles/message-box-hpa.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Prerequisites: shared MySQL sessions/replay/quota state and a shared gateway
# rate limit. Disable WebSockets or provide sticky routing / shared Socket.IO
# pub-sub before increasing replicas.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: message-box-server
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: message-box-server
minReplicas: 2
maxReplicas: 8
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 25
periodSeconds: 60
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70
Loading
Loading