Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
232 commits
Select commit Hold shift + click to select a range
42a090c
chore: snapshot pre-rewrite baseline
phroi Aug 9, 2026
dd2b18a
docs: record rewrite decisions, prune July review artifacts
phroi Aug 10, 2026
6ed8630
docs: add CCC integration-audit mapping appendix to the decisions record
phroi Aug 10, 2026
f0fa229
chore: update deps to latest under release-age policy
phroi Aug 10, 2026
51e624c
fix(order): correct ckb2udt minimum-match conversion (C1), add contra…
phroi Aug 10, 2026
0e0dda5
test(testkit): cross-adjudicate oracle against Rust golden vectors
phroi Aug 10, 2026
c7942b2
style(interface): visual polish pass, snapshot-verified
phroi Aug 10, 2026
4116be0
test(order,core): fast-check property layer adjudicated by the oracle
phroi Aug 10, 2026
f7cbc6c
docs: amend decisions record per review 2026-08-10-stack-overhaul-plan
phroi Aug 10, 2026
910a33d
test(testkit): add FakeClient over declarative ChainState
phroi Aug 10, 2026
6f63dab
style: prettier pass over review documents
phroi Aug 10, 2026
0a975a9
test(order): fee-bearing properties prove the ckb2udt post-guard equi…
phroi Aug 10, 2026
ce6e12a
style: prettier reflow of protocol vectors fixture
phroi Aug 10, 2026
4d5efc0
docs: reconcile decisions-record body with its amendments
phroi Aug 10, 2026
027c39c
docs: record treeshake probe verdict as amendment 12
phroi Aug 10, 2026
b81bff7
test(probes): commit B4 entity/api-extractor probe and root-export-fl…
phroi Aug 10, 2026
d36c6e1
chore(lint): reasoned disables for findings surfaced by plugin updates
phroi Aug 10, 2026
f5e2471
docs: clear the three textual residuals from review 005
phroi Aug 10, 2026
f46fb3b
test,docs: resolve review 007 findings F-013..F-016; amendments 13-17
phroi Aug 10, 2026
c0a3303
test(testkit): split the hash-lookup override tests into their own de…
phroi Aug 10, 2026
ec58d52
docs: staged-cutover rollback pair includes the credential/config sch…
phroi Aug 10, 2026
59329e3
docs: record maintainer decision on the tester-signing exception (F-0…
phroi Aug 10, 2026
efadafe
test,docs: resolve review 009 residuals F-015..F-017
phroi Aug 10, 2026
3da2cdd
docs: ratify confirmation policy as chaining + clean-state restart (F…
phroi Aug 10, 2026
d385322
test,docs: resolve review 011 findings; recover orphaned F-019 ratifi…
phroi Aug 10, 2026
f4922f6
docs: organize stack rewrite authority
phroi Aug 23, 2026
60a7dec
fix(dao): align claim epoch with deployed script
phroi Aug 23, 2026
a24522d
refactor(sdk): remove synthetic conversion retries
phroi Aug 23, 2026
75681d0
feat(sdk): bound account state scans
phroi Aug 23, 2026
2173693
refactor(utils): share canonical chain identities
phroi Aug 23, 2026
3194945
test(lint): enforce contract oracle independence
phroi Aug 23, 2026
8074258
test(probes): align export floor with rewrite authority
phroi Aug 23, 2026
4647b54
fix(sdk): complete transactions from committed cells
phroi Aug 23, 2026
a68fed2
chore: ignore private workspace drafts
phroi Aug 23, 2026
a51e340
fix(stack): fail closed on uncertain chain state
phroi Aug 25, 2026
d0041e9
refactor(sdk): accept only canonical mainnet/testnet config
phroi Sep 2, 2026
6cf9f07
fix(sdk): keep every matchable order pending by default
phroi Sep 2, 2026
4b9eaed
fix(sdk): reject connector body changes and value fee pre-sign
phroi Sep 2, 2026
dee77a4
docs(stack-rewrite): record amendments 30-31 and Phase-5 investigations
phroi Sep 2, 2026
0106403
chore(lint): stop policing repo-built fs paths outside src
phroi Sep 2, 2026
c6585b5
refactor(validation): delete the killed coverage ledger and untrack-p…
phroi Sep 3, 2026
8406b1e
refactor(supervisor): drop injectable filesystem seams and forwarding…
phroi Sep 3, 2026
949023c
chore(lint): ratchet out rest tuples, untyped records, and mock seams
phroi Sep 4, 2026
92180da
chore(lint): let ESLint own eslint-suppressions.json formatting
phroi Sep 4, 2026
71c1176
refactor(supervisor): call the filesystem directly and drop race-only…
phroi Sep 4, 2026
769146d
refactor(scripts): delete the bot incident collector
phroi Sep 4, 2026
ce8027b
test: fold four duplicated test blocks into shared fixtures
phroi Sep 4, 2026
b68368f
refactor(validation): delete the stimulus, loop, and dynamic-loop orc…
phroi Sep 4, 2026
f6d40a1
refactor(bot): delete the launcher; systemd runs the bot entrypoint d…
phroi Sep 4, 2026
85c69d6
refactor(validation): delete the supervisor; the operator runs the ac…
phroi Sep 4, 2026
fcdb2c1
refactor: one process is one turn for the bot and the tester
phroi Sep 4, 2026
4b65cdd
refactor: drop the fields and helpers that only the launcher era needed
phroi Sep 4, 2026
c971a19
refactor(apps): entrypoints are plain scripts tested as processes
phroi Sep 4, 2026
0079443
fix(apps): exit only after stdout drains
phroi Sep 4, 2026
daa8c0a
fix(apps): drain stderr as well as stdout before exiting
phroi Sep 4, 2026
7b4c5fe
refactor: replace rest-tuple parameter lists with plain or options pa…
phroi Sep 4, 2026
0f6a001
fix(tester): hold after a node hash mismatch or confirmation failure
phroi Sep 4, 2026
9e88b15
fix(systemd): restart after every turn and match the current prefligh…
phroi Sep 4, 2026
09b0430
chore(format): anchor the config and log ignores to the repo root
phroi Sep 4, 2026
d5b00d5
docs(bot): describe the single-turn bot and record the 2026-09-04 del…
phroi Sep 4, 2026
1ea185e
refactor(bot): delete the BotTurnOperations injection seam
phroi Sep 4, 2026
2ffe47a
refactor(sampler): yield CSV rows from a required client
phroi Sep 4, 2026
7077cb8
chore(knip): add the production lane and delete what only tests reached
phroi Sep 4, 2026
f7862c8
refactor(ops): the unit is the config
phroi Sep 5, 2026
7262d65
refactor(bot): exit 2 means low capital only
phroi Sep 5, 2026
a1605e0
docs(decisions): amendment 35, plain package merge
phroi Sep 5, 2026
3ce68b0
docs(decisions): amendment 35 takes the four-workspace shape
phroi Sep 5, 2026
4bba3d2
docs(decisions): amendment 36, lint keeps invariants, not proxies
phroi Sep 5, 2026
11cd468
docs(decisions): amendment 37, one store, seven events, no classifica…
phroi Sep 5, 2026
8961111
docs(decisions): amendment 38, interface tooling matched to the product
phroi Sep 5, 2026
c2323a1
docs(decisions): amendment 39, tester auto mode, scoped coverage, lea…
phroi Sep 5, 2026
d09c76e
docs: delete the design history, the frozen-tree review, the lint led…
phroi Sep 5, 2026
9ddc695
docs(decisions): amendment 40, ring, selection, and floors as the cod…
phroi Sep 5, 2026
95c6adc
docs: drop the emptied questions heading
phroi Sep 5, 2026
96fd52f
docs(decisions): amendment 41, the completer decides how many withdra…
phroi Sep 5, 2026
bbd4543
docs(decisions): amendment 42, key boundary by host, not by UID
phroi Sep 6, 2026
96b035c
docs(decisions): amendment 40(d) describes the floors as the code com…
phroi Sep 6, 2026
f87c0cd
docs(decisions): amendment 37 states the exact ring sample is not rec…
phroi Sep 6, 2026
d0607ce
docs(decisions): base text catches up with amendments 28, 34, and 37
phroi Sep 6, 2026
096e1f1
docs(decisions): amendment 39 states the one-runtime gate as a cost t…
phroi Sep 6, 2026
83bcecf
docs(decisions): amendment 43, auto draws from every scenario
phroi Sep 6, 2026
1071397
docs(decisions): amendment 44, oracle stays, its guard moves to depen…
phroi Sep 6, 2026
d57ccc7
docs(decisions): amendment 45, waitTransaction keeps only what Stack …
phroi Sep 6, 2026
8e205db
docs(decisions): amendment 41 names fundability as the SDK's to solve
phroi Sep 6, 2026
b988b2d
docs(decisions): amendment 46, plan audit dispositions, and base text…
phroi Sep 6, 2026
1a34d36
refactor(sdk): merge core, dao, order, and utils into one package
phroi Sep 6, 2026
0957cdc
refactor(node): one Node workspace for the bot, the tester, and the s…
phroi Sep 6, 2026
c5c0182
refactor(node): one store, seven bot events, no retry classification
phroi Sep 6, 2026
6d24930
refactor(lint): keep invariants, delete proxies and the suppressions …
phroi Sep 6, 2026
ff8be67
feat(sdk): the completer decides how many withdrawals a transaction c…
phroi Sep 6, 2026
b5af03f
feat(node): tester auto draws from every scenario and leads with its …
phroi Sep 6, 2026
bfccf96
refactor(interface): session-owned pending record, identity keys, nat…
phroi Sep 6, 2026
15fb830
refactor(sdk): waitTransaction keeps only the wait every caller makes
phroi Sep 6, 2026
467c902
chore(gate): check runs against installed dependencies, coverage wher…
phroi Sep 6, 2026
c2736dc
chore(scripts): delete the live preflight; each actor names its own a…
phroi Sep 6, 2026
4d74b43
fix(node): each withdrawal prefix starts from a clean match; dust nev…
phroi Sep 6, 2026
14ab85d
feat(node): stimulus generator replaces the tester
phroi Sep 6, 2026
0bd71fd
refactor(node,sdk): log errors whole instead of normalizing them thre…
phroi Sep 6, 2026
38d1fff
test(node): bot transaction tests run the real builders
phroi Sep 6, 2026
c35c758
refactor(bot): drop the ring diagnostic fields the journal never carried
phroi Sep 6, 2026
84476f2
docs(ccc-integration): NERVOS-016 cites the verified dao.c read and R…
phroi Sep 7, 2026
d940be2
refactor(sdk): every cell read is one uncached paging loop with no bu…
phroi Sep 8, 2026
e643adc
refactor(sdk): the walk owns every count; flags and anchor deps go
phroi Sep 8, 2026
730dfa7
refactor(sdk): completion funds from the cells it is given and sweeps…
phroi Sep 8, 2026
85b86f6
refactor(node): one-transaction turn policy replaces the hold, floors…
phroi Sep 8, 2026
27f124f
refactor(node,sdk): stimulus drops the hold; callers name the orders …
phroi Sep 8, 2026
a440881
fix(interface): fresh client after any transaction error; preview wai…
phroi Sep 8, 2026
b0e7e30
chore: vitest 4.1.11 clears the mocker path-traversal advisory
phroi Sep 10, 2026
f07c8db
chore(testkit,docs): retire the contract binaries and the debugger lane
phroi Sep 10, 2026
24db56a
refactor(sdk): cap each match direction at allowance plus the other s…
phroi Sep 10, 2026
e5a04a1
test: adopt the auditor tests that prove a settled property
phroi Sep 10, 2026
6875799
refactor(sdk): one unfiltered exact-lock scan per account lock, class…
phroi Sep 10, 2026
8800680
refactor(sdk): delete the consumer-less statics, root export, skip ho…
phroi Sep 10, 2026
c06a8b4
docs: amendment 52 records the whole-turn policy, the audit answers, …
phroi Sep 10, 2026
2c09526
refactor(sdk,node): joint net-delta match search replaces the frontie…
phroi Sep 10, 2026
e9de200
refactor: flatten the workspace to sdk, sdk/node, testkit, and interface
phroi Sep 10, 2026
5741a95
refactor(sdk): collapse the internal directories by protocol domain
phroi Sep 10, 2026
92eb3d7
refactor(sdk,interface,node): one explicit public surface, the actors…
phroi Sep 10, 2026
fd71c9f
fix(sdk): match search closes any state, skips early, keeps the fundi…
phroi Sep 10, 2026
95f4651
fix(sdk): match search orders by gain, closes from any order, and ord…
phroi Sep 10, 2026
ab7a8ad
perf(sdk): the resolver attests a private parse of each order group
phroi Sep 10, 2026
39f6b73
fix(sdk): the attestation is the resolver's own group
phroi Sep 10, 2026
087b4f7
fix(sdk): match search ranks closers by fill worth, prunes unrepayabl…
phroi Sep 10, 2026
3b7813f
refactor(sdk,node): the search result is its verdict and the match
phroi Sep 10, 2026
7dfbf63
fix(sdk): match closers are probed as ranked, the seller minimum is e…
phroi Sep 10, 2026
62b5a59
feat(sdk): the resolved order model is readonly and frozen at attesta…
phroi Sep 10, 2026
79335c9
fix(sdk): match search bounds subtrees at asset prices and orders chi…
phroi Sep 10, 2026
891b4f8
fix(sdk): the bot matches only orders at or below the default minimum…
phroi Sep 10, 2026
af200e8
fix(sdk): match search walks smallest orders first when the gain-firs…
phroi Sep 10, 2026
864a07d
refactor(sdk): drop the match search; the SDK keeps the exact matcher…
phroi Sep 10, 2026
f276969
feat(node): the bot matches one fill at a time, best return per unit …
phroi Sep 10, 2026
0ac5af7
fix(node): the match evidence names its fill fee and what candidates …
phroi Sep 10, 2026
a345b87
fix(node): the reserve is a sizing line; the post-completion check an…
phroi Sep 12, 2026
8d993a4
docs(node): the policy and amendment 52 stop describing the deleted f…
phroi Sep 12, 2026
e632dc5
docs: withdraw the shedding walk from the contract and prune the dele…
phroi Sep 12, 2026
45432a9
refactor(node): the stimulus generator drops its post-completion rese…
phroi Sep 12, 2026
e22aad6
docs(node): a public RPC node is acceptable at the operator's risk; r…
phroi Sep 12, 2026
7478e02
docs: amendment 52(i) no longer leaves shedding open, and 52(a) names…
phroi Sep 12, 2026
22a673d
fix(interface): a transaction error swaps the client's cache instead …
phroi Sep 12, 2026
7df6c37
feat(node): the generator melts buys the bot will not take and never …
phroi Sep 12, 2026
ee563c6
docs: amendment 52(l) records that the 0.001% default buy fee stays b…
phroi Sep 12, 2026
dc13059
fix(bot): cap collected withdrawals by the deposit-header slots left …
phroi Sep 12, 2026
e11f380
feat(node): the generator counts under-par and thirty-day melts apart
phroi Sep 12, 2026
db7f60e
feat(node): journals carry one envelope and the match reason tells ex…
phroi Sep 12, 2026
42ad172
refactor(interface): read the wallet config once per signer instead o…
phroi Sep 12, 2026
5223714
feat(sdk): the projection owns the withdrawal batch and a header over…
phroi Sep 14, 2026
3a66a07
feat(node): the generator melts the buys the bot's own matcher would …
phroi Sep 14, 2026
aaaf1b5
chore(sdk): drop the release-tag rule and its @public tags; the expor…
phroi Sep 14, 2026
7ccf440
refactor(interface): the connector's client is the one source of the …
phroi Sep 14, 2026
a0a836c
fix(interface): a failure is the last attempt's result, kept until th…
phroi Sep 14, 2026
bfd49cc
chore: scan .tsx for clones, share the app test fixtures, drop the in…
phroi Sep 14, 2026
e8ad0e7
docs: the records and READMEs describe the tree as it is
phroi Sep 14, 2026
10e5fdb
test(sdk): the completion walk advances past a deposit-header overflo…
phroi Sep 14, 2026
c802350
fix(testkit): the stub client never reaches the live network
phroi Sep 14, 2026
cdb550c
chore: testnet endpoint is testnet.ckbapp.dev until the CCC bump
phroi Sep 14, 2026
689d2b7
fix(interface): a wallet's plain-object rejection shows its message, …
phroi Sep 14, 2026
f3906fb
docs: record the stuck small CKB-to-iCKB request as a question to eva…
phroi Sep 14, 2026
6a8b2a6
docs: no fee escalation for small CKB-to-iCKB orders; the minimum in …
phroi Sep 14, 2026
f536e2f
docs: the amount-too-small message shows a rounded-up minimum
phroi Sep 14, 2026
d7b1fa1
feat: CCC core 1.20 and connector 2.0; the actors and the interface t…
phroi Sep 14, 2026
284adab
chore: testnet stays on ckbapp first while testnet.ckb.dev's front en…
phroi Sep 14, 2026
b161058
fix(interface): a client pick in the wallet modal closes it
phroi Sep 14, 2026
4b23ec0
feat: the amount-too-small failure names its minimum, and the interfa…
phroi Sep 14, 2026
68fa40e
perf(sdk): read a transaction's header without its body
phroi Sep 14, 2026
54137cb
perf(sdk): resolve order origins together instead of one at a time
phroi Sep 14, 2026
b64c03b
perf(node): the generator reads its live orders' origins together
phroi Sep 14, 2026
7bd14ae
docs(node): the reserve paragraph names the cells that draw on it and…
phroi Sep 15, 2026
e898852
docs(node): the reserve paragraph says when the iCKB change cell cost…
phroi Sep 15, 2026
c1616e0
chore: the actors and the interface take CCC's default testnet pool a…
phroi Sep 15, 2026
502be44
docs(testkit): the deployed code cells are verified against the vecto…
phroi Sep 15, 2026
bbca580
docs: the two parked read-performance candidates are measured and closed
phroi Sep 15, 2026
6714c04
fix(node): the withdrawal walk tries one greedy chain's prefixes, not…
phroi Sep 15, 2026
8b849cf
refactor(sdk): delete the pool scan id, the plain-balance helper, two…
phroi Sep 15, 2026
4105f06
refactor(testkit): the stub client keeps one scan path and loses the …
phroi Sep 15, 2026
07d03c3
fix(sdk): one CKB reserve, and the liquidity estimate projects a know…
phroi Sep 15, 2026
011f071
fix(node): the sampler disposes its client on failure, and the bot bu…
phroi Sep 15, 2026
36d15d2
test(sdk): the wait test pins that the window closes, not the timer i…
phroi Sep 15, 2026
71af89b
docs: amendment 52(y) records the pre-fork consultation, and three pa…
phroi Sep 15, 2026
4fe5450
chore(interface): React 19.3
phroi Sep 15, 2026
25793d0
fix(node): the actors end on an empty event loop, and the units cap a…
phroi Sep 15, 2026
608170a
docs: the rewrite phase table stops promising the shape slice and pla…
phroi Sep 15, 2026
d89e70e
feat(sdk): the default order fee is 0.01%, and the generator draws it…
phroi Sep 15, 2026
90ab6e0
feat: an order the market will never fill is collectable, and the rul…
phroi Sep 15, 2026
59d82e5
fix(interface): the status line says fixed time and variable time, no…
phroi Sep 15, 2026
0cb1979
docs: amendment 52(z) records conversions over positions, and the pha…
phroi Sep 15, 2026
a4a717b
docs: amendment 52(aa) records one squash PR in place of the stacked PRs
phroi Sep 15, 2026
55ede1b
ci: every merge to the default branch deploys the interface to GitHub…
phroi Sep 15, 2026
6769374
chore: pnpm 12.4.2, audit ignores by GHSA, build scripts denied expli…
phroi Sep 15, 2026
64b05ea
ci: a release is a version bump merged to the default branch; the SDK…
phroi Sep 15, 2026
0ae18bf
feat: the destination address field; the lock owns every cell a trans…
phroi Sep 15, 2026
1ba0c8b
feat(interface): the destination is the header's address; empty means…
phroi Sep 15, 2026
c00df68
feat(interface): balances in words, a quote with its unit, the rate a…
phroi Sep 15, 2026
ea198f9
fix(interface): the chart caption in one size; three dots before a pr…
phroi Sep 15, 2026
bd6dfb5
feat(interface): the unit rate beside the switch, plain chart caption…
phroi Sep 15, 2026
6bde213
fix(interface): the direction switch is a drawn pair of arrows; the u…
phroi Sep 15, 2026
cfa2d6f
feat(interface): the rate row is the direction switch, outlined like …
phroi Sep 15, 2026
6ec9e71
feat(interface): the action before the chart, a labelled destination,…
phroi Sep 15, 2026
681ec75
feat(sdk,interface): CKB figures mean what the wallet holds
phroi Sep 17, 2026
19b57b1
feat(interface): max under the source asset, the balance words say wh…
phroi Sep 17, 2026
bde5774
fix(interface): figures that fit a phone column, evened header and ac…
phroi Sep 17, 2026
6e7e96d
fix(interface): shortfall sentences say what ran out; the title block…
phroi Sep 17, 2026
c1abc65
feat(interface): grouped amounts, a two-decimal quote, the faucet und…
phroi Sep 17, 2026
6f7de29
fix(interface): intent sentences stop pointing at the maturity line
phroi Sep 17, 2026
325d00f
feat(interface): parallel intent sentences and a "Ready by" line
phroi Sep 17, 2026
81c0b81
fix(interface): the time line reads "Ready: in 3 days"
phroi Sep 17, 2026
8962977
refactor(sdk): the maturity estimate reads the public pool alone, no …
phroi Sep 17, 2026
404aac9
fix(node): the bot waits two minutes for its commit, not ten
phroi Sep 19, 2026
0e4a291
feat(node): a partial fill leaves the order's own minimum match; the …
phroi Sep 19, 2026
c1a43fe
refactor(sdk): one flat order module
phroi Sep 19, 2026
5dd975d
refactor(sdk): one SDK class, a flat conversion layer, direct-first p…
phroi Sep 19, 2026
ab45215
refactor(sdk): dissolve the DAO layer into one file per script, decod…
phroi Sep 19, 2026
ef6a3fe
refactor(node): the actors parse the RPC URL once, journal decisions …
phroi Sep 19, 2026
7cb075d
refactor(interface): direction and text as two primitives, one projec…
phroi Sep 19, 2026
cc96262
chore(lint): a dead-member lint beside knip; the four entity isValid …
phroi Sep 19, 2026
f60298b
feat(sdk): the order estimate models the bot; the pool's real claim d…
phroi Sep 19, 2026
5290bcd
refactor(interface): one file per concern; the chart is two files, th…
phroi Sep 19, 2026
6c82b22
refactor(testkit): one client double
phroi Sep 19, 2026
552da22
refactor(sdk,node): no utils barrel; the bot reads its state in the turn
phroi Sep 19, 2026
280cc51
docs(node): the bot needs about 2.5 deposits, not 2.2
phroi Sep 19, 2026
db6727b
fix(sdk,node): a seller's estimate owes the remaining iCKB whole; the…
phroi Sep 19, 2026
09706d0
fix(sdk,interface): the SDK recognises a JSON-RPC client by its reque…
phroi Sep 19, 2026
abe2392
fix(sdk,interface): a sell order's estimate always has a date; ties c…
phroi Sep 19, 2026
c69d522
feat(sdk,interface): another address as the destination sends all CKB…
phroi Sep 20, 2026
ec5988c
feat(sdk,node,interface): withdrawal timing is a per-caller epoch pol…
phroi Sep 20, 2026
d36bfde
docs(sdk,node): the sweep budget reads "about 64 KiB"; decisions amen…
phroi Sep 20, 2026
7a08df9
feat(sdk,interface): an order thirty days on the book is collected, w…
phroi Sep 20, 2026
f113ef9
fix(sdk): trust a cached origin only once it is in a block; withdrawa…
phroi Sep 20, 2026
125ca22
refactor(sdk,node,interface): the claim epoch is CCC's; the cell scan…
phroi Sep 20, 2026
b5995aa
chore: delete what the rewrite left behind; a README in every folder
phroi Sep 20, 2026
bd99614
chore: the minimum release age is seven days again
phroi Sep 20, 2026
8157b44
chore: every package reads 9000.0.0
phroi Sep 21, 2026
6b23b0e
chore: CCC stays on the locked 1.20.0 set
phroi Sep 21, 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
  •  
  •  
  •  
131 changes: 131 additions & 0 deletions .dependency-cruiser.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
{
"extends": "dependency-cruiser/configs/recommended-strict",
"forbidden": [
{
"name": "no-orphans",
"from": {
"orphan": true,
"pathNot": [
"(^|/)\\.[^/]+\\.(js|cjs|mjs|ts|json)$",
"\\.d\\.(c|m)?ts$",
"(^|/)tsconfig\\.json$",
"(^|/)(?:babel|webpack)\\.config\\.(?:js|cjs|mjs|ts|json)$",
"^scripts/run-node-tests[.](?:mts|ts)$",
"^scripts/tooling/build/rewrite-dts-imports[.](?:mts|ts)$",
"^scripts/tooling/dead-members[.]ts$",
"^scripts/tooling/eslint/plugins[.]ts$",
"^scripts/test/.+[.](?:mts|ts)$",
"^sdk/node/test/.+[.]ts$",
"^(?:sdk|sdk/node|testkit|interface)/vitest[.]config[.]mts$",
"^interface/vite[.]config[.]ts$",
"^interface/eslint[.]config[.]mts$",
],
},
},
{
"name": "not-prod-to-test-source",
"comment": "Production source must not import test-only files. Keep test fixtures behind test/ boundaries.",
"severity": "error",
"from": {
"path": "^(?:(?:sdk|sdk/node|testkit|interface)/src/|scripts/)",
"pathNot": [
"(?:^|/)test/",
"[.]test[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:Suite[0-9]*[.]test|Suite|Test(?:Assertions|CommandFixtures|Constants|Fixtures|ProcessFixtures|RunFixtures|Support)|TestFixtures|TestSupport)[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:Suite[0-9]*[.]test|Suite|Test(?:Assertions|CommandFixtures|Constants|Fixtures|ProcessFixtures|RunFixtures|Support)|TestFixtures|TestSupport)[.][^/]+[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:_test_|_test_constants[.]|_test_fixtures[.]|_test_support[.])[^/]*$",
],
},
"to": {
"path": [
"(?:^|/)test/",
"[.]test[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:Suite[0-9]*[.]test|Suite|Test(?:Assertions|CommandFixtures|Constants|Fixtures|ProcessFixtures|RunFixtures|Support)|TestFixtures|TestSupport)[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:Suite[0-9]*[.]test|Suite|Test(?:Assertions|CommandFixtures|Constants|Fixtures|ProcessFixtures|RunFixtures|Support)|TestFixtures|TestSupport)[.][^/]+[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:_test_|_test_constants[.]|_test_fixtures[.]|_test_support[.])[^/]*$",
],
},
},
{
"name": "not-prod-to-testkit",
"comment": "Production source must not import @ickb/testkit. Keep test harness dependencies under test/.",
"severity": "error",
"from": {
"path": "^(?:sdk|sdk/node|testkit|interface)/src/",
"pathNot": [
"^testkit/src/",
"(?:^|/)test/",
"[.]test[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:Suite[0-9]*[.]test|Suite|Test(?:Assertions|CommandFixtures|Constants|Fixtures|ProcessFixtures|RunFixtures|Support)|TestFixtures|TestSupport)[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:Suite[0-9]*[.]test|Suite|Test(?:Assertions|CommandFixtures|Constants|Fixtures|ProcessFixtures|RunFixtures|Support)|TestFixtures|TestSupport)[.][^/]+[.](?:mts|ts|tsx)$",
"(?:^|/)[^/]*(?:_test_|_test_constants[.]|_test_fixtures[.]|_test_support[.])[^/]*$",
],
},
"to": {
"path": "^testkit/src/",
},
},
{
"name": "oracle-independent",
"comment": "The contract oracle imports nothing from the implementation it judges (amendment 44).",
"severity": "error",
"from": { "path": "^testkit/src/contract_oracle[.]ts$" },
"to": {},
},
{
"name": "node-actors-apart",
"comment": "The bot, the sampler, and the stimulus generator share only src/shared; they never import each other.",
"severity": "error",
"from": { "path": "^sdk/node/src/(bot|sampler|stimulus)/" },
"to": {
"path": "^sdk/node/src/(?:bot|sampler|stimulus)/",
"pathNot": "^sdk/node/src/$1/",
},
},
{
"name": "node-shared-neutral",
"comment": "src/shared serves every actor and depends on none of them.",
"severity": "error",
"from": { "path": "^sdk/node/src/shared/" },
"to": { "path": "^sdk/node/src/(?:bot|sampler|stimulus)" },
},
{
"name": "sdk-browser-safe",
"comment": "The SDK runs in the browser: no Node built-ins (decisions §1).",
"severity": "error",
"from": { "path": "^sdk/src/" },
"to": { "dependencyTypes": ["core"] },
},
{
"name": "sdk-not-node",
"comment": "The published SDK never imports the Node actors that live beside it (amendment 52).",
"severity": "error",
"from": { "path": "^sdk/src/" },
"to": { "path": "^sdk/node/" },
},
{
"name": "no-library-to-actor",
"comment": "The SDK and the test kit must not depend on the actors.",
"severity": "error",
"from": { "path": "^(?:sdk/src|testkit)/" },
"to": { "path": "^(?:interface|sdk/node)/" },
},
{
"name": "no-actor-to-actor",
"comment": "The interface and the Node actors must not depend on each other.",
"severity": "error",
"from": { "path": "^(interface|sdk/node)/" },
"to": { "path": "^(?:interface|sdk/node)/", "pathNot": "^$1/" },
},
],
"options": {
"exclude": {
"path": "(?:^|/)(?:coverage|dist)/",
},
"includeOnly": "^(sdk|testkit|interface|scripts)/",
"tsConfig": {
"fileName": "tsconfig.json",
},
"tsPreCompilationDeps": "specify",
},
}
86 changes: 79 additions & 7 deletions .github/workflows/check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,91 @@ on:
push:
branches: [master]

permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest
outputs:
interface: ${{ steps.releases.outputs.interface }}
sdk: ${{ steps.releases.outputs.sdk }}

steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
node-version: 24
- uses: pnpm/action-setup@v4

- name: Install jq for fork bootstrap
run: sudo apt-get update -qq && sudo apt-get install -y -qq --no-install-recommends jq
persist-credentials: false
# The release rule below reads the previous commit.
fetch-depth: 2
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
# The declared Node floor; the example units run the current release.
node-version: 22.19.0
- uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1

- name: Install pinned dependencies
run: pnpm install --frozen-lockfile
- name: Run pnpm check
run: pnpm check

# A release is a push to the default branch whose commit changes a package's version
# field (decisions amendment 52(ad)). Every such push is one squash commit, so the
# previous commit is the comparison; a path absent there counts as changed.
- id: releases
if: github.event_name == 'push' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
run: |
released() {
now=$(node -p "require('./$1/package.json').version")
before=$(git show "HEAD^:$1/package.json" 2>/dev/null | node -p "JSON.parse(require('fs').readFileSync(0, 'utf8')).version" 2>/dev/null || echo none)
if [ "$now" != "$before" ]; then echo true; else echo false; fi
}
echo "interface=$(released interface)" >> "$GITHUB_OUTPUT"
echo "sdk=$(released sdk)" >> "$GITHUB_OUTPUT"
- if: steps.releases.outputs.interface == 'true'
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9
with:
path: interface/dist

# The interface bundle the gate just built goes live at ickb.org (decisions amendment
# 52(ab)); a failed run leaves the previous deployment live.
deploy:
needs: build
if: needs.build.outputs.interface == 'true'
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}

steps:
- id: deployment
uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346

# npm trusted publishing: the id token stands in for a registry token, and npm records
# the provenance of this run with the package (decisions amendment 52(ad)).
publish:
needs: build
if: needs.build.outputs.sdk == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write

steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: 22.19.0
- uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1

- name: Install pinned dependencies
run: pnpm install --frozen-lockfile
- name: Build the SDK
run: pnpm build
# The checkout is a detached commit, so pnpm's branch and remote checks do not apply.
- name: Publish @ickb/sdk
run: pnpm --filter @ickb/sdk publish --provenance --access public --no-git-checks
12 changes: 3 additions & 9 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,9 @@
**/node_modules/

# Artifacts
**/coverage/
**/dist/
log/
apps/*/log_*.json

# Local runtime config files
config/

# Local logs
logs/
**/*.tsbuildinfo

# Local scratch files
.scratch/
/private/
6 changes: 6 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
**/node_modules/
**/dist/
**/*.tsbuildinfo
coverage/
.git/
pnpm-lock.yaml
Loading
Loading