Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
725 commits
Select commit Hold shift + click to select a range
f9d8100
Accept native SpacetimeDB module re-exports during grading reset
bradleyshep Sep 27, 2026
87830d6
Fix count observations during application redraws
bradleyshep Sep 27, 2026
90fcf93
Accept separate sign-in after account registration in Stack Bench
bradleyshep Sep 27, 2026
183b17b
Fix ecommerce grading navigation and completion boundaries
bradleyshep Sep 27, 2026
4f5bd95
Qualify declared app navigation and role authorization checks
bradleyshep Sep 27, 2026
704fbea
Fix audited grading boundaries and request budget admission
bradleyshep Sep 27, 2026
144dd74
Preserve completed auth receipts across normal socket closure
bradleyshep Sep 27, 2026
308ace4
fix(stack-bench): align defect controls with save and role baselines
bradleyshep Sep 27, 2026
75f5b90
fix(stack-bench): preserve staff fixture in Convex signup control
bradleyshep Sep 27, 2026
2b6e925
Preserve interrupted navigation capture findings
bradleyshep Sep 27, 2026
59f94cb
Record safe pending request diagnostics at privacy failure boundaries
bradleyshep Sep 27, 2026
73ab0f5
Align behavior fixtures with current role and navigation contracts
bradleyshep Sep 27, 2026
8eb2017
Preserve typed native authentication arguments during replay
bradleyshep Sep 27, 2026
dfb0e92
Preserve unpriced provider capabilities and block unsafe continuations
bradleyshep Sep 27, 2026
27e01bd
Use the declared initial staff role in the SpacetimeDB reference
bradleyshep Sep 27, 2026
b85dc39
Preserve HTTP privacy evidence across browser navigation
bradleyshep Sep 27, 2026
0fc6c1b
Keep evaluator HTTP requests outside browser-only proxies
bradleyshep Sep 27, 2026
9babf3f
Keep dropped checkout replies from updating browser cookies
bradleyshep Sep 27, 2026
b122e76
Preserve safe browser navigation error codes in evidence
bradleyshep Sep 27, 2026
ea80500
Preserve verified Vite tooling during response-loss faults
bradleyshep Sep 27, 2026
42f31b5
Qualify audited four-stack grading fixes with scoped evidence
bradleyshep Sep 27, 2026
e569492
Clarify checkout interface and remove unused locator declarations
bradleyshep Sep 27, 2026
473ca5c
Fix crash dispatch timing and ambiguous durability attribution
bradleyshep Sep 27, 2026
36255d6
Qualify scoped checkout crash fixes across four stacks
bradleyshep Sep 27, 2026
9b7acb5
Fix native auth replay and accepted source handling
bradleyshep Sep 28, 2026
f4cef76
Keep auth refusal scoring at explicit assertions
bradleyshep Sep 28, 2026
ec24f22
Remove obsolete purchase setup ordering assertion
bradleyshep Sep 28, 2026
54ff1b6
Preserve native auth evidence during token renewal
bradleyshep Sep 28, 2026
8b202ce
Grade signup claims across each write and wait for stored effects
bradleyshep Sep 28, 2026
f7d1d7a
Measure signup transport writes and preserve completed state reads
bradleyshep Sep 28, 2026
c033e66
Capture signup writes at submission and drain late receipts
bradleyshep Sep 28, 2026
149fecf
Observe signup reconnects before closing the write inventory
bradleyshep Sep 28, 2026
bf1460e
Qualify signup write capture and scoped state observation
bradleyshep Sep 28, 2026
318f8e3
Clarify exact catalog name hooks for deterministic grading
bradleyshep Sep 28, 2026
194a4aa
Qualify exact catalog name contract with reviewed evidence reuse
bradleyshep Sep 28, 2026
6d560ca
Fix restored-panel grading navigation and clarify required controls
bradleyshep Sep 28, 2026
3943a8e
Qualify restored-panel grading across four stacks
bradleyshep Sep 28, 2026
49b4053
Grade ranked catalog in the declared faceted search view
bradleyshep Sep 28, 2026
b58dd7f
Qualify faceted catalog grading with scoped evidence reuse
bradleyshep Sep 28, 2026
d9cf20f
Fix audited grading observations and crash boundaries
bradleyshep Sep 28, 2026
cbd3e83
Qualify audited grading fixes across four stacks
bradleyshep Sep 28, 2026
b2e6303
Distinguish intercepted clicks from uncertain delivery
bradleyshep Sep 28, 2026
7120c8c
Qualify click classification with reviewed evidence reuse
bradleyshep Sep 28, 2026
84e2be5
Fix warehouse observation and clarify benchmark failure semantics
bradleyshep Sep 28, 2026
31f0712
Allow bounded reuse of unchanged fixed qualification slices
bradleyshep Sep 28, 2026
6875333
Accept redundant warehouse wrappers by declared identity
bradleyshep Sep 28, 2026
3926fa8
Handle full source selection in qualification slice validation
bradleyshep Sep 28, 2026
a6edb1c
Qualify product-defensibility fixes with scoped controls and evidence…
bradleyshep Sep 28, 2026
3007afa
Remove unsolicited Stack Bench startup action probes
bradleyshep Sep 28, 2026
3cfc397
Qualify removal of unsolicited Stack Bench startup probes
bradleyshep Sep 28, 2026
0ab4106
Accept valid session cookie formats in authentication replay
bradleyshep Sep 28, 2026
a9da55a
Qualify cookie session replay with targeted controls and reviewed reuse
bradleyshep Sep 29, 2026
c8a83a6
Fix support history navigation after reload
bradleyshep Sep 29, 2026
a7b9bf7
Wait for purchase completion before grading observers
bradleyshep Sep 29, 2026
104e8bd
Accept declared decoration on visible order status
bradleyshep Sep 29, 2026
fae0df8
Preserve visible form status in decorated status checks
bradleyshep Sep 29, 2026
d652f9e
Qualify support purchase and visible status fixes
bradleyshep Sep 29, 2026
eac5e29
Require proven routes for refusals and harden grading for the Opus study
bradleyshep Sep 29, 2026
028df12
Keep one actor accessor per graded feature
bradleyshep Sep 29, 2026
68ad3f0
Prove restock routes with distinct items
bradleyshep Sep 29, 2026
02dda1d
Forge a review on a purchase the buyer has not reviewed
bradleyshep Sep 29, 2026
a5cbf35
Give the timing-only audit the compiled pack budgets
bradleyshep Sep 29, 2026
c0f6def
Schedule MongoDB reference restocks by name as the contract states
bradleyshep Sep 29, 2026
c34ab8c
Set L3 pack budgets from the c0f6defa03 timing measurement
bradleyshep Sep 29, 2026
0c0d88b
Qualify L3 on c34ab8c8a7 with fresh four-stack evidence
bradleyshep Sep 29, 2026
f7b4214
Fail apps that reload onto the browser error page while offline
bradleyshep Sep 30, 2026
550e8fb
Gate dependent features on every check, not only feature checks
bradleyshep Sep 30, 2026
3094b01
Clear stale L3 evidence for the strict-gating candidate
bradleyshep Sep 30, 2026
44a7dde
Reuse c34ab8c8a7 L3 evidence for strict gating with a reviewed scope
bradleyshep Sep 30, 2026
f3c84fd
Retry the no-model smoke outbound probe before failing preflight
bradleyshep Sep 30, 2026
8e79196
Extend the reviewed L3 reuse to the preflight probe retry
bradleyshep Sep 30, 2026
6e88af4
Record a check that outruns grading time instead of losing the level
bradleyshep Sep 30, 2026
a7d311d
Extend the reviewed L3 reuse to the grading time limit
bradleyshep Sep 30, 2026
7e432d4
Type into the editable control when a listed value reuses its ID
bradleyshep Sep 30, 2026
e607c93
Extend the reviewed L3 reuse to the editable fill target
bradleyshep Sep 30, 2026
38f03a4
Replay SpacetimeDB setup writes whose reducers take lists or records
bradleyshep Sep 30, 2026
e6f379a
Measure catalog completeness across 300 products instead of 1000
bradleyshep Sep 30, 2026
018eb1f
Replay SpacetimeDB bulk writes when the app proxies its socket
bradleyshep Sep 30, 2026
513d909
Cover SpacetimeDB bulk-write replay through an app proxy
bradleyshep Sep 30, 2026
d97a8f4
Verify each calibration's qualification evidence once per dashboard r…
bradleyshep Sep 30, 2026
efbee4f
Replay SpacetimeDB credentials sent through procedures
bradleyshep Sep 30, 2026
222c126
Keep scenario test values when an action input carries extra fields
bradleyshep Sep 30, 2026
70fb20b
Keep pack budgets at least as long as their scenarios allow
bradleyshep Sep 30, 2026
c303983
Merge remote-tracking branch 'origin/master' into bradley/stackbench-…
bradleyshep Sep 30, 2026
31f5bab
Pin the SpacetimeDB checkout reducer to no arguments
bradleyshep Sep 30, 2026
4872ac0
Revert "Pin the SpacetimeDB checkout reducer to no arguments"
bradleyshep Sep 30, 2026
f27ef9d
Send blank values for a SpacetimeDB reducer's optional parameters
bradleyshep Sep 30, 2026
6759fc4
Reopen a sign-in toggle that closed a panel left on sign-up
bradleyshep Sep 30, 2026
c5d8cb3
Lock the SpacetimeDB reference to the merged SDK package
bradleyshep Sep 30, 2026
c620988
Recompute pinned hashes with one command
bradleyshep Sep 30, 2026
c5ec3e4
Dismiss a sign-up dialog that covers the sign-in toggle
bradleyshep Sep 30, 2026
e301abb
Note that sign-out keeps the identity and when TS clients reconnect
bradleyshep Sep 30, 2026
6d1529f
Report internal authority for database-spawned TypeScript reducers
bradleyshep Oct 1, 2026
bb8f105
Keep the dashboard front page to the campaign table
bradleyshep Oct 1, 2026
51aa1f0
Lead the campaign page with progress charts and move setup facts to o…
bradleyshep Oct 1, 2026
69b51b6
Accept native confirmations and open collapsed sections when the grad…
bradleyshep Oct 1, 2026
6802102
Pin Codex 0.159.3, which knows gpt-6.1-sol
bradleyshep Oct 1, 2026
e6357b1
Treat a provider refusal inside a successful stream as a rejection, a…
bradleyshep Oct 1, 2026
88a9a0d
Recognise a Convex sync socket that an application proxy mounts under…
bradleyshep Oct 1, 2026
6e0bc03
Let application startup add runtime files without failing the accepte…
bradleyshep Oct 1, 2026
e10e3f2
Name the accepted files that application startup changed
bradleyshep Oct 1, 2026
5887253
Treat an app's .run directory as runtime state, not source
bradleyshep Oct 2, 2026
d758ab4
Wait out an unreachable provider at no charge, and count only this in…
bradleyshep Oct 2, 2026
347dcbf
Follow an inline confirmation that replaces an entry's control under …
bradleyshep Oct 2, 2026
88fc0b8
Resolve TypeScript SDK endpoints under the connection URI's path
bradleyshep Oct 2, 2026
edf844a
Grade at most three runs at once, and keep slot waits out of working …
bradleyshep Oct 2, 2026
3e60ac5
Keep the sign-up write inventory when a probe cannot repeat it, and r…
bradleyshep Oct 2, 2026
4892f94
Serve grading slots first come, first served, one suite at a time
bradleyshep Oct 3, 2026
bfddce4
Let a crash check that mistimed its fault run its suite once more
bradleyshep Oct 3, 2026
1f33dfc
Report a control that never appears as a page timeout, not a missing …
bradleyshep Oct 3, 2026
022c0cb
Tell a control that never appears from one missing its attribute with…
bradleyshep Oct 3, 2026
9d1c4b9
Grade six suites at once
bradleyshep Oct 3, 2026
9faa54d
Read an action's input from the one element inside its control that c…
bradleyshep Oct 3, 2026
f8e0f18
Wait for a write to finish before another user reloads to look for it
bradleyshep Oct 4, 2026
232b44d
Let a write-completion check wait for any SpacetimeDB reducer
bradleyshep Oct 4, 2026
445567d
Start sign-in from a sign-up form whose dialog hides the toggle
bradleyshep Oct 5, 2026
3c995ce
Wait for a moving page to hold still before calling a destination hidden
bradleyshep Oct 5, 2026
189c591
Forward every Convex write a capture sees and match each reply to its…
bradleyshep Oct 5, 2026
f0c31b9
Start an accepted app from only its saved source
bradleyshep Oct 5, 2026
a7045a3
Estimate usage when a provider's token counts are missing or malformed
bradleyshep Oct 5, 2026
1515e1a
Let the managed SpacetimeDB workflow render, and set production wordi…
bradleyshep Oct 5, 2026
4d18e90
Report delivered targets over every assigned attempt
bradleyshep Oct 5, 2026
b05f5b7
Accept a refused over-length password, and still fail a truncated one
bradleyshep Oct 5, 2026
ba50f87
Wait for cart writes before recording the prepared cart
bradleyshep Oct 5, 2026
6bcc716
Repin definitions for the password and cart preparation changes
bradleyshep Oct 5, 2026
684b2f0
Register the password boundary probe in the action fixture and defini…
bradleyshep Oct 5, 2026
40f5f36
Leave the lost-reply check's cart clicks without a write barrier
bradleyshep Oct 5, 2026
61b929b
Keep write barriers out of the whole duplicate-checkout feature
bradleyshep Oct 5, 2026
9fff7f0
Add Supabase to the ecommerce dependency L3 calibration
bradleyshep Oct 5, 2026
1ece5a3
Let pg_cron reach the Supabase database, and restart services a datab…
bradleyshep Oct 6, 2026
cf24086
Record the database fault time in milliseconds where date prints whol…
bradleyshep Oct 6, 2026
6f515d6
Treat Supabase read-only functions and unmatched arguments as the dat…
bradleyshep Oct 6, 2026
48dafc2
Add the save-state controls to the Supabase reference
bradleyshep Oct 6, 2026
cc50b83
Seed the second staff account in the Supabase reference
bradleyshep Oct 6, 2026
d75f180
Grade Supabase's Realtime socket and checkout crash as the platform b…
bradleyshep Oct 6, 2026
af9277c
Keep starting stopped Supabase services until all answer after a data…
bradleyshep Oct 6, 2026
79f591d
Fit the Supabase defect controls to the seeded staff2 account and the…
bradleyshep Oct 6, 2026
5c418ac
Apply defect-control edits literally
bradleyshep Oct 6, 2026
68b4279
Target every staff-role check the Supabase inventory-role control breaks
bradleyshep Oct 6, 2026
9e2141b
Keep a failed feature failed when its prerequisite later regresses
bradleyshep Oct 6, 2026
b0f759b
Close an account menu that covers a navigation link before clicking it
bradleyshep Oct 6, 2026
bab295e
Let an app resend a sign-up write the server refused during a claim p…
bradleyshep Oct 6, 2026
a449bc3
Recognise Supabase Auth and Realtime served through the app's own origin
bradleyshep Oct 6, 2026
fdc86ad
Add Grok Build as a coding agent on a SuperGrok sign-in or an xAI API…
bradleyshep Oct 6, 2026
4e541aa
Forward Grok Build model calls that name no output cap
bradleyshep Oct 6, 2026
d147884
Fix Grok Build sessions found by the first live run
bradleyshep Oct 6, 2026
9a7384a
Say why a privacy observer's capture is incomplete
bradleyshep Oct 7, 2026
10a7dae
Keep Grok's turn summary and sign-in output out of a session
bradleyshep Oct 7, 2026
eb76a5c
Settle a paid call still open when the credential broker stops
bradleyshep Oct 7, 2026
0ba797b
Observe a page that navigates while its collapsed sections are opened
bradleyshep Oct 8, 2026
cdda460
Wait out a provider's server errors instead of ending the attempt
bradleyshep Oct 8, 2026
f61cb1d
Say that client visibility filters are experimental in the TS server …
bradleyshep Oct 8, 2026
e90e2d7
Say which page is the signed-out page, and grade sign-in by it
bradleyshep Oct 8, 2026
ab4bcc7
Grade what the contracts say for carts, forms, support and restocks
bradleyshep Oct 8, 2026
f228015
Publish the credential broker's ready file whole
bradleyshep Oct 9, 2026
59bc72e
Let a credential profile send Claude Code to a model maker's endpoint
bradleyshep Oct 9, 2026
b83aeea
Accept the model makers' API keys in set-secret
bradleyshep Oct 9, 2026
e63c672
Accept a Gemini API key in set-secret
bradleyshep Oct 9, 2026
e87a557
Ask for a secret at the terminal instead of waiting for end of input
bradleyshep Oct 9, 2026
688337c
Add Google's Antigravity CLI as a coding agent on a Gemini API key
bradleyshep Oct 9, 2026
82dd96e
Read Antigravity's usage as the CLI reports it
bradleyshep Oct 9, 2026
e9e5d10
Keep a rate-limited session call on record past agy's title call
bradleyshep Oct 9, 2026
79a22de
Run Antigravity on a Google account through Code Assist
bradleyshep Oct 10, 2026
bdce9fc
Answer agy's account check in the broker and end a session that linge…
bradleyshep Oct 10, 2026
5d00452
Accept a finished answer whatever end error agy repeats when stopped
bradleyshep Oct 10, 2026
d48f399
Judge an agy session by how its stream ends, not by its result status
bradleyshep Oct 10, 2026
c6508c0
Name the account's models for Gemini 3.8 Flash and Gemini 3.1 Pro at …
bradleyshep Oct 10, 2026
59a3564
Renew an agy sign-in that has not expired yet
bradleyshep Oct 10, 2026
f90f887
Raise the coding container's process cap and keep broker connections …
bradleyshep Oct 10, 2026
83374f5
Keep agy's proxy and certificate settings out of the commands it runs
bradleyshep Oct 10, 2026
e6493d6
Forward agy's check whether a running command waits for input
bradleyshep Oct 10, 2026
0bfb621
Say on every stack that APP_WARM_START only permits reusing dependencies
bradleyshep Oct 11, 2026
c0f1c9b
Start an app from clean source without the warm-start flag
bradleyshep Oct 11, 2026
395acff
Take the warm-start sentence back out of three stack prompts
bradleyshep Oct 11, 2026
92ccf48
Prove a replayed route by the success status of the captured request
bradleyshep Oct 11, 2026
63fec68
Leave SpacetimeDB calls without parameters out of the signup sequence
bradleyshep Oct 11, 2026
7a8381e
Keep the agy launcher's files out of /tmp
bradleyshep Oct 12, 2026
cacc33c
Retake the proxy snapshot when a response arrives while it is in flight
bradleyshep Oct 12, 2026
12dcf80
Give an optional click the ordinary click time once its control is on…
bradleyshep Oct 12, 2026
8e52c38
Judge a privacy window that has settled, not a request that began aft…
bradleyshep Oct 12, 2026
5fba339
Treat a lock file that installs the same packages as unchanged by sta…
bradleyshep Oct 12, 2026
019f059
Write the accepted lock file back in place
bradleyshep Oct 13, 2026
4832a13
Say in the server skills what public and private tables expose
bradleyshep Oct 13, 2026
fb9e4d1
Bring two reload-observation tests in line with the grader
bradleyshep Oct 13, 2026
263ec8d
Name Gemini 4 Argon's account models for agy
bradleyshep Oct 13, 2026
33bbb08
Route lost replies and write capture through one socket delivery path
bradleyshep Oct 15, 2026
75f48a3
Find the reply-loss gate on each socket frame
bradleyshep Oct 15, 2026
2965319
Add a command that uploads a finished dependency campaign to StackBench
bradleyshep Oct 15, 2026
8509fc0
Find each published attempt's run by attempt id, not list position
bradleyshep Oct 15, 2026
4beec95
Add the ecommerce design review and fix proposal, and say guarantees …
bradleyshep Oct 15, 2026
9a1685d
Fail stock-alert privacy when another client receives the owner's rec…
bradleyshep Oct 15, 2026
c522caf
Accept a lock file whose root entry follows a hand-edited package.json
bradleyshep Oct 15, 2026
28e8658
Expect Supabase among the dependency L3 calibration stacks
bradleyshep Oct 15, 2026
8396a14
Restore the bootstrap public schema when an app dropped it
bradleyshep Oct 15, 2026
604a507
Repeat a Supabase reset that Postgres rolled back for a deadlock
bradleyshep Oct 15, 2026
1bb3066
Add seeded defects for 24 deep checks and fix what they exposed
bradleyshep Oct 16, 2026
9dc92e5
Merge master into bradley/stackbench-test
bradleyshep Oct 16, 2026
16a9359
Cover every deep check with a seeded defect and calibrate all of L6
bradleyshep Oct 16, 2026
cdf4c91
Let publish exclude replaced attempts and skip ones that never started
bradleyshep Oct 16, 2026
c63b0ee
Check that stock written outside the app still delivers a requested s…
bradleyshep Oct 16, 2026
c0a0acf
Let a dependency replay run a check added since the run was planned
bradleyshep Oct 16, 2026
d1b3db0
Start Postgres reference timers after its schema exists and give dire…
bradleyshep Oct 16, 2026
ea93b4f
Raise the external data sync pack budget for its third check
bradleyshep Oct 16, 2026
7a72d52
Record evidence for the direct-write stock alert check
bradleyshep Oct 16, 2026
3818a2a
Give the direct-write stock alert 90 seconds to appear
bradleyshep Oct 19, 2026
b611e81
Set the external data sync pack budget from the longer alert check
bradleyshep Oct 19, 2026
6add839
Record the longer direct-write alert window in its evidence
bradleyshep Oct 19, 2026
e1a2c8b
Give every coding agent the same recorded tool policy
bradleyshep Oct 20, 2026
5a36374
Treat fetching StackBench's own source as contamination
bradleyshep Oct 20, 2026
d43f90b
Describe the agent tool policy, search counting and source leak check
bradleyshep Oct 20, 2026
224a13a
Keep Claude Code bare and default web search off
bradleyshep Oct 20, 2026
68b59e2
Apply review fixes to the agent tool policy
bradleyshep Oct 20, 2026
85b1187
Align stock alert, buy-now and last-unit timing with what the prompts…
bradleyshep Oct 21, 2026
c601926
Set the stock alert pack budget from the longer checks and record the…
bradleyshep Oct 21, 2026
c4e8bfc
Replace the slide deck with a StackBench technical reference and fix …
bradleyshep Oct 27, 2026
6c65947
Document the blocked outcome, grading-slot waits, and the pack budget…
bradleyshep Oct 27, 2026
2ff4780
Style the StackBench reference page in the StackBench brand
bradleyshep Oct 27, 2026
d70a6d4
Drop the count tiles from the reference page head
bradleyshep Oct 27, 2026
08784ea
Rebuild the reference page around code excerpts
bradleyshep Oct 27, 2026
d2debbf
Say plainly how the run order rotates
bradleyshep Oct 27, 2026
01f7783
Rewrite the reference page in plain language
bradleyshep Oct 27, 2026
40a3f1a
Cut the reference page prose to one short point per excerpt
bradleyshep Oct 27, 2026
07660f8
Rebuild the reference page around diagrams, code popovers, and search
bradleyshep Oct 27, 2026
d7b2b39
Keep diagrams only where they show a flow or structure
bradleyshep Oct 27, 2026
9b2c324
Drop run-count and sign-off caveats from the reference page
bradleyshep Oct 27, 2026
d5c02b6
Name the technology behind each part of the reference page's setup
bradleyshep Oct 27, 2026
a7b6967
Spell out the mechanism behind every claim on the reference page
bradleyshep Oct 27, 2026
cd6c313
Say what Puppeteer Core is on the reference page
bradleyshep Oct 27, 2026
b682103
List enumerations on the reference page as bullets
bradleyshep Oct 27, 2026
697adb7
Say which credential the broker holds and where it sends requests
bradleyshep Oct 27, 2026
8a64020
Separate public websites from the model provider API on the setup dia…
bradleyshep Oct 27, 2026
40f5d80
Drop a self-evident diagram label
bradleyshep Oct 27, 2026
ed59293
Join the prompt and production-checks sentences
bradleyshep Oct 27, 2026
dd5c27d
Join split sentences on the reference page
bradleyshep Oct 27, 2026
0cbe804
Explain what a hidden data leak is on the reference page
bradleyshep Oct 27, 2026
b885041
Rewrite the reference page so each card says what problem it handles …
bradleyshep Oct 27, 2026
add8007
Defend the Spacetime skills and add follow-up answers to the hard que…
bradleyshep Oct 27, 2026
22db3e8
Answer why live checks wait 10 seconds and why direct writes are fair…
bradleyshep Oct 27, 2026
6322672
Explain every production check: mechanism, pass rule, fairness, limit…
bradleyshep Oct 27, 2026
b5ffa4d
Say what the log audit cannot catch, with the evidence from saved runs
bradleyshep Oct 28, 2026
06cd9e7
Add the search-ordering card and make the reference page readable on …
bradleyshep Oct 28, 2026
074d248
Resolve contradictions between sections of the reference page
bradleyshep Oct 28, 2026
e79f2fc
Show that the slow-restart undecided case has never occurred
bradleyshep Oct 28, 2026
cc5c3a6
Edit the reference page for plain English: one fact once, one term pe…
bradleyshep Oct 29, 2026
f2e6346
Move the reference page out of the repo
bradleyshep Oct 29, 2026
6eaa572
Add operator skills: run a campaign, recover a run, release, archive …
bradleyshep Oct 29, 2026
3e8e4ed
Rewrite the appliance and dashboard guides; fold recovery, release, j…
bradleyshep Oct 29, 2026
42284ea
Merge grading coverage, check categories, and grader outcome rules in…
bradleyshep Oct 29, 2026
e1df2d8
Rewrite the developer docs and index; fold the appliance design doc i…
bradleyshep Oct 29, 2026
3697369
Remove unbound qualification evidence; the calibration names none of …
bradleyshep Oct 29, 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
  •  
  •  
  •  
25 changes: 25 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,28 @@
**/ModuleBindings/** linguist-generated=true eol=lf
/docs/llms/** linguist-generated=true
/docs/llms/*-details.json linguist-generated=false
/tools/stack-bench/** text eol=lf
/tools/stack-bench/**/*.woff2 -text -diff
/tools/stack-bench/qualification-evidence/**/*.json -text whitespace=cr-at-eol
/tools/stack-bench/qualification-evidence/ecommerce-l3-navigation-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-readiness-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-module-layout-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-count-observation-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-catalog-support-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-readiness-final-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-entry-navigation-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-audit-fixes-ea80500/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-crash-order-20260927/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-signup-writes-20260928/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-restored-navigation-20260928/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-faceted-ranking-20260928/Dockerfile -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-checkout-readiness-20260928/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-click-classifier-20260928/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-probe-removal-20260928/** -text -whitespace

# Preserve exact measured cookie-control evidence bytes.
tools/stack-bench/qualification-evidence/ecommerce-l3-cookie-session-20260928/** -text -whitespace

# Preserve exact measured combined-control evidence bytes.
tools/stack-bench/qualification-evidence/ecommerce-l3-combined-20260929/** -text -whitespace
/tools/stack-bench/qualification-evidence/ecommerce-l3-opus55-c34ab8c8a7/** -text -whitespace
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,9 @@ nul
# Any local file
*.local

# Local working notes and temporary builds
/local-notes/

# Generated when testing or publishing the TypeScript module test utilities.
/crates/bindings-typescript/src/server/test-utils/portable-datastore-wasm/
/crates/bindings-typescript/src/server/test-utils/.portable-datastore-wasm-*/
11 changes: 5 additions & 6 deletions codex-plugin/plugins/spacetimedb/skills/cli/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,15 @@ spacetime build --debug # faster iteration, slower runtime

# Dev mode (auto-rebuild, auto-publish, generates bindings)
spacetime dev
spacetime dev --client-lang typescript --module-bindings-path ./client/src/module_bindings
spacetime dev my-database --server local --yes --delete-data=never --client-lang typescript --module-bindings-path ./client/src/module_bindings

# Generate client bindings
spacetime generate --lang typescript|csharp|rust --out-dir ./bindings --module-path ./server
spacetime generate --lang unrealcpp --uproject-dir ./MyGame --module-path ./server --unreal-module-name MyGame
```

`dev` stays running and watches module changes. `--run "npm run dev"` starts a client command; `--server-only` omits it. `--module-path` selects the module directory when no publish targets exist in `spacetime.json`. Once targets exist, use their configured paths and omit that flag. Separate build/publish/generate commands remain useful for one-shot deployment.

### Publishing & Deployment

```bash
Expand Down Expand Up @@ -114,7 +116,7 @@ spacetime server add myserver --url https://my-spacetime.example.com
# Set default server
spacetime server set-default local

# Test connectivity
# Check connectivity
spacetime server ping local

# Start local instance
Expand Down Expand Up @@ -172,10 +174,7 @@ spacetime server ping <server>
```

### "Schema conflict"
```bash
# Clear data and republish
spacetime publish my-db --delete-data=always --yes
```
`--delete-data=never` rejects incompatible schema updates without clearing data. A compatible migration preserves existing data; `--delete-data=always` destroys it and is only appropriate for an intentional reset.

### "Build failed"
```bash
Expand Down
4 changes: 2 additions & 2 deletions codex-plugin/plugins/spacetimedb/skills/concepts/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ Lifecycle: Write → Compile → Publish (`spacetime publish`) → Hot-swap (rep

## Identity

- **Identity**: A long-lived, globally unique identifier for a user.
- **ConnectionId**: Identifies a specific client connection.
- **Identity**: A long-lived, globally unique identifier for a user, derived from the token's issuer and subject claims. The same token yields the same identity on every connection.
- **ConnectionId**: Identifies one client connection. A new connection gets a new connection ID; a disconnect ends the connection, not the identity.
- Always use `ctx.sender` / `ctx.Sender` / `ctx.sender()` for authorization.

SpacetimeDB works with many OIDC providers, including SpacetimeAuth (built-in), Auth0, Clerk, Keycloak, Google, and GitHub.
2 changes: 2 additions & 0 deletions codex-plugin/plugins/spacetimedb/skills/cpp-server/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ SPACETIMEDB_CLIENT_DISCONNECTED(on_disconnect, ReducerContext ctx) {
}
```

Connection hooks run once per connection. The same authenticated principal keeps the same identity (`ctx.sender()`) across connections, while each connection has its own connection ID (`ctx.connection_id()`). A disconnect ends one connection; it does not end the identity, which returns unchanged on the next connection with the same token. Use connection IDs for presence and other connection-scoped state.

## Authentication & Timestamps

```cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,9 @@ public static void OnConnect(ReducerContext ctx) { ... }
public static void OnDisconnect(ReducerContext ctx) { ... }
```

`ctx.ConnectionId` is `ConnectionId?`, including in connection lifecycle reducers. Check or unwrap it before storing it in a non-nullable column or passing it to an index accessor.
Connection hooks run once per connection. The same authenticated principal keeps the same identity (`ctx.Sender`) across connections, while each connection has its own connection ID (`ctx.ConnectionId`). A disconnect ends one connection; it does not end the identity, which returns unchanged on the next connection with the same token. Use connection IDs for presence and other connection-scoped state.

`ctx.ConnectionId` is typed `ConnectionId?`. It is present inside connection lifecycle reducers and reducers invoked over a connection, and null in `Init` and scheduled reducers. Check or unwrap it before storing it in a non-nullable column or passing it to an index accessor.

## Views

Expand Down
2 changes: 2 additions & 0 deletions codex-plugin/plugins/spacetimedb/skills/rust-server/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ pub fn on_connect(ctx: &ReducerContext) { ... }
pub fn on_disconnect(ctx: &ReducerContext) { ... }
```

Connection hooks run once per connection. The same authenticated principal keeps the same identity (`ctx.sender()`) across connections, while each connection has its own connection ID (`ctx.connection_id()`). A disconnect ends one connection; it does not end the identity, which returns unchanged on the next connection with the same token. Use connection IDs for presence and other connection-scoped state.

The current connection ID is available through `ctx.connection_id()` (not a public field) and may be absent outside connection-scoped calls.

## Views
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,9 @@ Calls made while disconnected fail immediately. Pending reducer and procedure pr

## Gotchas

- **`useTable` rows are `readonly`.** Copy before sorting/mutating, or it fails to type-check:
- **Subscription rows have no presentation order.** A server view's array order does not
define client cache iteration order. `useTable` rows are `readonly`; a sorted copy can
express the application's display order:
`const [rows] = useTable(tables.message); const sorted = [...rows].sort(...)`.
- **bigint in JSX.** ids/counts from `t.u64()`/`t.i64()` columns are `bigint`, which React
cannot render. Wrap it: `{Number(row.id)}` or `{String(count)}`.
- **64-bit display values.** `{String(row.id)}` preserves the full `bigint` value.
Conversion to `Number` can lose precision outside JavaScript's safe integer range.
46 changes: 43 additions & 3 deletions codex-plugin/plugins/spacetimedb/skills/typescript-server/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@ Every column is a `t` builder value:

Modifiers: `.primaryKey()`, `.autoInc()`, `.unique()`, `.index('btree')`, `.default(value)`.

`.primaryKey()` and `.unique()` apply to one column. For uniqueness across
multiple columns, use a surrogate key, the multi-column index below, and a
reducer that rejects an existing index match before inserting. An index alone
does not enforce uniqueness.

Use `.default(value)` only for a newly appended migration-safe field. Do not put defaults on primary-key, unique, or auto-increment columns.

Optional columns: `nickname: t.option(t.string())`
Expand Down Expand Up @@ -130,7 +135,9 @@ export { default } from './schema'; // re-export the schema for the module ent

## Reducers

Reducers are created with `spacetimedb.reducer(...)`; the export name becomes the reducer name:
Reducers are created with `spacetimedb.reducer(...)`. An exported `signUp`
becomes `signUp` in generated clients and `sign_up` in `spacetime call` and
`describe`:

```typescript
export const createEntity = spacetimedb.reducer(
Expand Down Expand Up @@ -178,10 +185,27 @@ export const onConnect = spacetimedb.clientConnected((ctx) => { ... });
export const onDisconnect = spacetimedb.clientDisconnected((ctx) => { ... });
```

`ctx.connectionId` is `ConnectionId | null`, including in lifecycle contexts. Guard it before passing it to a helper or using it as a table key.
Connection hooks run once per connection. `ctx.connectionId` identifies that connection.
`ctx.sender` identifies the authenticated caller and stays the same when the client
reconnects with the same token.

Use connection IDs for connection state, such as presence. A reload or network loss can
cause a disconnect. A disconnect alone does not mean the user signed out or their
application login expired. Keep connection cleanup separate from session revocation.

`ctx.sender` is a SpacetimeDB identity, not necessarily an application account. Separate
identities can authenticate to the same application account. An application sign-out leaves
the identity unchanged, so data scoped to `ctx.sender` stays available to that client.

`ctx.connectionId` is typed `ConnectionId | null`. It is present inside connection lifecycle hooks and reducers invoked over a connection, and `null` in `init` and scheduled reducers. Guard it before passing it to a helper or using it as a table key.

## Reducer Context API

Each reducer call runs in one database transaction. An error that escapes the
reducer rolls back its database changes. `ctx.sender` identifies the caller;
application roles and permissions are not inferred from that identity. Table
visibility and view filters control reads, not authorization to call reducers.

`ctx` is the only source of sender identity, time, and randomness; stdlib clocks and RNG are unavailable in modules. Let exported callbacks infer their context type. In helpers, use `ReducerCtx<InferSchema<typeof spacetimedb>>`; do not annotate a context as `any`, because that erases table row types and can make `bigint` expressions infer as `number`.

```typescript
Expand Down Expand Up @@ -282,17 +306,30 @@ const Shape = t.enum('Shape', {
A client subscribing to a view receives only the rows it returns. Use a per-user view
(keyed on `ctx.sender`) for per-viewer access control: deleting a row it depends on
(e.g. a membership row) automatically drops the rows it was exposing from that client.
Use index accessors in views. Do not scan a whole table with `.iter()` when an
indexed lookup can select the required rows.

`t.row(...)` and `t.object(...)` return schema builders, not TypeScript runtime row types. Let a view callback infer its result, or annotate a separately declared structural type such as `Array<{ sku: bigint; label: string }>`. A named output type must not reuse the generated PascalCase name of its view accessor (for example, reserve `DiscountedProduct` for a `discounted_product` view).

A view context is `ViewCtx<S>` (and `AnonymousViewCtx<S>`), both exported from
`spacetimedb/server`. It carries `sender`, a read-only `db`, and `from`; it is
not a `ReducerCtx`, so a helper shared between a reducer and a view must accept
either:

```typescript
import type { ReducerCtx, ViewCtx, InferSchema } from 'spacetimedb/server';
type S = InferSchema<typeof spacetimedb>;
function stockOf(ctx: ReducerCtx<S> | ViewCtx<S>, itemId: bigint) { ... }
```

Both `spacetimedb.view(...)` and `spacetimedb.anonymousView(...)` take three arguments: view options, the declared return schema, and the callback.

```typescript
// Anonymous view (same for all clients):
export const activeUsers = spacetimedb.anonymousView(
{ name: 'active_users', public: true },
t.array(entity.rowType),
(ctx) => [...ctx.db.entity.iter()].filter(e => e.active)
(ctx) => [...ctx.db.entity.active.filter(true)] // active: t.bool().index('btree')
);

// Per-user view (varies by ctx.sender):
Expand Down Expand Up @@ -328,6 +365,9 @@ Procedural views read through `ctx.db` and return materialized values such as ar

## Client Visibility Filters

Client visibility filters are experimental and may change or be removed. Use views for access
control. `:sender` is the requesting client's identity.

```typescript
export const privateNoteFilter = spacetimedb.clientVisibilityFilter.sql(
'SELECT * FROM owned_row WHERE owner = :sender'
Expand Down
26 changes: 14 additions & 12 deletions crates/bindings-typescript/src/lib/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -248,19 +248,21 @@ export type NamespacedQueryBuilder<SchemaDef extends UntypedSchemaDef> =
* A runtime reference to a table. This materializes the RowExpr for us.
* TODO: Maybe add the full SchemaDef to the type signature depending on how joins will work.
*/
export type TableRef<TableDef extends TypedTableDef> = Readonly<{
type: 'table';
sourceName: TableDef['sourceName'];
accessorName: string;
cols: RowExpr<TableDef>;
indexedCols: IndexedRowExpr<TableDef>;
tableDef: TableDef;
// Keep this named so TypeScript diagnostics show `TableRef` instead of its
// expanded structure.
export interface TableRef<TableDef extends TypedTableDef> {
readonly type: 'table';
readonly sourceName: TableDef['sourceName'];
readonly accessorName: string;
readonly cols: RowExpr<TableDef>;
readonly indexedCols: IndexedRowExpr<TableDef>;
readonly tableDef: TableDef;
// Delegated UntypedTableDef properties for compatibility.
columns: TableDef['columns'];
indexes: TableDef['indexes'];
rowType: TableDef['rowType'];
constraints: any;
}>;
readonly columns: TableDef['columns'];
readonly indexes: TableDef['indexes'];
readonly rowType: TableDef['rowType'];
readonly constraints: any;
}

class TableRefImpl<TableDef extends TypedTableDef>
implements TableRef<TableDef>, From<TableDef>
Expand Down
8 changes: 6 additions & 2 deletions crates/bindings-typescript/src/sdk/ws.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,16 @@ export async function openWebSocket({

const WS = await resolveWS();

// Endpoints resolve under the URI's path, so `ws://host/stdb` reaches `/stdb/v1/...`.
const base = new URL(url);
if (!base.pathname.endsWith('/')) base.pathname += '/';

// We swap our original token to a shorter-lived token
// to avoid sending the original via query params.
let temporaryAuthToken: string | undefined;
if (authToken) {
headers.set('Authorization', `Bearer ${authToken}`);
const tokenUrl = new URL('v1/identity/websocket-token', url);
const tokenUrl = new URL('v1/identity/websocket-token', base);
tokenUrl.protocol = url.protocol === 'wss:' ? 'https:' : 'http:';

const response = await fetch(tokenUrl, { method: 'POST', headers });
Expand All @@ -112,7 +116,7 @@ export async function openWebSocket({
}
}

const databaseUrl = new URL(`v1/database/${nameOrAddress}/subscribe`, url);
const databaseUrl = new URL(`v1/database/${nameOrAddress}/subscribe`, base);
if (temporaryAuthToken) {
databaseUrl.searchParams.set('token', temporaryAuthToken);
}
Expand Down
34 changes: 23 additions & 11 deletions crates/bindings-typescript/src/server/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,15 +218,27 @@ class AuthCtxImpl implements AuthCtx {
});
}

/** If there is a connection id, look up the JWT payload from the system tables. */
/** Create a context for an HTTP request, which has no connection but is not host-originated. */
static httpRequest(): AuthCtx {
return new AuthCtxImpl({
isInternal: false,
jwtSource: () => null,
senderIdentity: Identity.zero(),
});
}

/**
* If there is a connection id, look up the JWT payload from the system tables.
* A call without one was spawned by the database, such as `init` or a scheduled function.
*/
static fromBackend(
connectionId: ConnectionId | null,
sender: Identity,
backend: DatastoreBackend
): AuthCtx {
if (connectionId === null) {
return new AuthCtxImpl({
isInternal: false,
isInternal: true,
jwtSource: () => null,
senderIdentity: sender,
});
Expand Down Expand Up @@ -357,6 +369,13 @@ export const ReducerCtxImpl = class ReducerCtx<
}
}

/** A transaction inside an HTTP handler, which reports external authority. */
static forHttpHandler(timestamp: Timestamp, dbView: DbView<any>) {
const tx = new ReducerCtx<any>(Identity.zero(), timestamp, null, dbView);
tx.#senderAuth = AuthCtxImpl.httpRequest();
return tx;
}

get databaseIdentity() {
return (this.#identity ??= new Identity(this.#backend.identity()));
}
Expand Down Expand Up @@ -887,12 +906,7 @@ class HandlerContextImpl<S extends UntypedSchemaDef = UntypedSchemaDef>
withTx<T>(body: (ctx: any) => T): T {
const dispatches = this.#dispatches;
return runWithTx(timestamp => {
const tx = new ReducerCtxImpl(
Identity.zero(),
timestamp,
null,
this.#dbView()
);
const tx = ReducerCtxImpl.forHttpHandler(timestamp, this.#dbView());
if (dispatches.length > 0) {
tx.as = buildAliasCtxMap(tx, dispatches, '') as any;
}
Expand Down Expand Up @@ -1011,10 +1025,8 @@ function buildHandlerAliasCtx(
as: subAs,
withTx(body: any) {
return runWithTx((ts: Timestamp) => {
const tx = new ReducerCtxImpl(
Identity.zero(),
const tx = ReducerCtxImpl.forHttpHandler(
ts,
null,
(nsDb_ ??= buildDbViewForDispatch(
dispatch,
namePrefix
Expand Down
42 changes: 42 additions & 0 deletions crates/bindings-typescript/tests/sender_auth.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { describe, expect, it } from 'vitest';
import * as sys from 'spacetime:sys@2.0';
import { schema } from '../src/server/schema';
import { ReducerCtxImpl } from '../src/server/runtime';
import { table } from '../src/lib/table';
import { t } from '../src/lib/type_builders';
import { Timestamp } from '../src/lib/timestamp';

describe('ctx.senderAuth', () => {
function senderAuthFor(connectionId: bigint) {
const items = table({ name: 'items' }, { id: t.u32().primaryKey() });
const module = schema({ items });
let isInternal: boolean | undefined;
const check = module.reducer(ctx => {
isInternal = ctx.senderAuth.isInternal;
});
const hooks = (module as any)[(sys as any).moduleHooks]({ check });
hooks.__call_reducer__(
0,
0n,
connectionId,
0n,
new DataView(new ArrayBuffer(0))
);
return isInternal;
}

it('is internal for a reducer the database spawns without a connection', () => {
expect(senderAuthFor(0n)).toBe(true);
});

it('is external for a reducer called over a connection', () => {
expect(senderAuthFor(7n)).toBe(false);
});

it('is external for a transaction inside an HTTP handler', () => {
const tx = ReducerCtxImpl.forHttpHandler(new Timestamp(0n), {} as never);
expect(tx.connectionId).toBeNull();
expect(tx.senderAuth.isInternal).toBe(false);
expect(tx.senderAuth.hasJWT).toBe(false);
});
});
Loading
Loading