Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
736 commits
Select commit Hold shift + click to select a range
a2c223f
refactor(artifact): keep one manifest contract
ScriptedAlchemy Aug 18, 2026
a2d800e
fix(dev): bound failure retention and close Windows containment gap
ScriptedAlchemy Aug 18, 2026
c087163
refactor(playground): keep one session storage contract
ScriptedAlchemy Aug 19, 2026
3fe33f9
feat(workbench): show Skill eval coverage
ScriptedAlchemy Aug 19, 2026
05ce456
refactor(eval): require trial provenance
ScriptedAlchemy Aug 19, 2026
5e48801
refactor(workbench): require eval provenance
ScriptedAlchemy Aug 19, 2026
c637495
refactor(eval): remove unverified comparison facets
ScriptedAlchemy Aug 19, 2026
ed1cc2b
feat(bundle): copy project-level assets into target artifacts
ScriptedAlchemy Aug 19, 2026
d4b62c5
refactor(eval): keep one runtime record contract
ScriptedAlchemy Aug 19, 2026
fb747cc
fix(workbench): type the eval-coverage fixture assertions
ScriptedAlchemy Aug 19, 2026
134574c
refactor(playground): keep one export contract
ScriptedAlchemy Aug 19, 2026
683819f
refactor(logs): keep one wire record contract
ScriptedAlchemy Aug 19, 2026
523b0ff
test(dev): keep versionless contract fixtures
ScriptedAlchemy Aug 19, 2026
4e4460a
refactor(hosts): keep one contract manifest
ScriptedAlchemy Aug 19, 2026
5eacd10
refactor(workbench): keep one MCP trace contract
ScriptedAlchemy Aug 19, 2026
c67fd77
test(contracts): keep one evidence shape
ScriptedAlchemy Aug 19, 2026
5594464
refactor(contracts): drop internal version labels
ScriptedAlchemy Aug 19, 2026
ed7eaae
refactor(hooks): keep one artifact index
ScriptedAlchemy Aug 19, 2026
0fa0a63
refactor(playground): keep one owner lock contract
ScriptedAlchemy Aug 19, 2026
a5be9ab
refactor(dev): keep one lock record contract
ScriptedAlchemy Aug 19, 2026
42db5a0
refactor(dev): keep one epoch storage contract
ScriptedAlchemy Aug 19, 2026
ca1969b
refactor(playground): keep one native catalog contract
ScriptedAlchemy Aug 19, 2026
086f671
fix(artifact): validate canonical staging metadata
ScriptedAlchemy Aug 19, 2026
930c79f
refactor(codex): keep one marketplace manifest path
ScriptedAlchemy Aug 19, 2026
723d33f
refactor(eval): require canonical Codex item types
ScriptedAlchemy Aug 19, 2026
6d969ca
docs: describe canonical internal contracts
ScriptedAlchemy Aug 19, 2026
f586ce8
test(dev): use canonical native catalog fixtures
ScriptedAlchemy Aug 19, 2026
9026ebb
fix(dev): make lock close retryable
ScriptedAlchemy Aug 19, 2026
4b59abd
fix(dev): reject symlinked lock directories
ScriptedAlchemy Aug 19, 2026
471eac7
docs: describe versionless MCP trace export
ScriptedAlchemy Aug 19, 2026
799b331
fix(dev): validate canonical lock identities
ScriptedAlchemy Aug 19, 2026
52bc0f8
fix(dev): reject ambiguous epoch metadata
ScriptedAlchemy Aug 19, 2026
053914e
refactor(workbench): keep one MCP route
ScriptedAlchemy Aug 19, 2026
2a4e885
fix(playground): contain native catalog storage
ScriptedAlchemy Aug 19, 2026
b5b3c3f
fix(dev): share epoch leases across stores
ScriptedAlchemy Aug 19, 2026
30b3ec7
refactor(inspector): keep one sync manifest contract
ScriptedAlchemy Aug 19, 2026
346ec89
fix(playground): tolerate Windows directory sync limits
ScriptedAlchemy Aug 19, 2026
1c2f399
refactor(eval): keep one semantic grader identity
ScriptedAlchemy Aug 19, 2026
081a6eb
Reject noncanonical eval owner metadata
ScriptedAlchemy Aug 19, 2026
5014b86
fix(dev): serialize cross-store epoch leases
ScriptedAlchemy Aug 19, 2026
a9d3026
fix(dev): make lock publication durable
ScriptedAlchemy Aug 19, 2026
cd17da6
fix(playground): make native catalog rollback identity-safe
ScriptedAlchemy Aug 19, 2026
de1dac0
fix(playground): preserve fresh owner locks
ScriptedAlchemy Aug 19, 2026
94dd695
docs: correct integrated Inspector route
ScriptedAlchemy Aug 19, 2026
da9f569
fix(dev): distinguish post-commit cleanup failures
ScriptedAlchemy Aug 19, 2026
bedf2b0
fix(playground): validate native fixture digests
ScriptedAlchemy Aug 19, 2026
8de7490
docs: name semantic grader identities
ScriptedAlchemy Aug 19, 2026
679aae1
refactor(eval): name semantic grader identity precisely
ScriptedAlchemy Aug 19, 2026
0ed523a
fix(playground): bound native catalog decoding
ScriptedAlchemy Aug 19, 2026
5d7d5d4
fix(dev): fsync epoch publication boundaries
ScriptedAlchemy Aug 19, 2026
96efb32
refactor(mcp): keep one app resource URI contract
ScriptedAlchemy Aug 19, 2026
a1ed255
fix(workbench): require matching project SSE sequences
ScriptedAlchemy Aug 19, 2026
b116944
test: verify canonical packed consumer contract
ScriptedAlchemy Aug 19, 2026
b97a79a
fix(workbench): strictly decode hook responses
ScriptedAlchemy Aug 19, 2026
7230e65
fix(workbench): strictly decode artifact routes
ScriptedAlchemy Aug 19, 2026
a992341
feat(workbench): strictly decode skill responses
ScriptedAlchemy Aug 19, 2026
af65abb
docs: name Inspector trace coverage precisely
ScriptedAlchemy Aug 19, 2026
cd3f591
fix(workbench): strictly decode project DTOs
ScriptedAlchemy Aug 19, 2026
64f0d94
fix(workbench): require exact foreground session envelope
ScriptedAlchemy Aug 19, 2026
90f23ba
test(hooks): use canonical epoch staging marker
ScriptedAlchemy Aug 19, 2026
e70379e
ci: run all native host smoke suites
ScriptedAlchemy Aug 19, 2026
db46040
fix(workbench): contain artifact tables on mobile
ScriptedAlchemy Aug 19, 2026
8edd8cc
test(workbench): prove packed skill hot reload
ScriptedAlchemy Aug 19, 2026
a93efca
test: add opt-in packed native smoke harness
ScriptedAlchemy Aug 19, 2026
8b506e5
test: expose packed native smoke commands
ScriptedAlchemy Aug 19, 2026
5c99aa0
docs: reconcile implementation plans
ScriptedAlchemy Aug 19, 2026
13bc2cb
docs: clarify delivery and native smoke workflows
ScriptedAlchemy Aug 19, 2026
e51244e
test: preserve native smoke host state
ScriptedAlchemy Aug 19, 2026
bc01974
test: cover Claude normal home integrity
ScriptedAlchemy Aug 19, 2026
74a2941
fix: label unequal usage trial counts
ScriptedAlchemy Aug 19, 2026
9eb480f
ci: add packed native host smokes
ScriptedAlchemy Aug 19, 2026
fa1bb2e
feat: preserve Claude normal home state
ScriptedAlchemy Aug 19, 2026
72fa89a
test: cover Claude default sibling state
ScriptedAlchemy Aug 19, 2026
909e9f1
test: snapshot default Claude state
ScriptedAlchemy Aug 19, 2026
715c470
fix: protect Claude default state file
ScriptedAlchemy Aug 19, 2026
b239e8f
test(workbench): harden packed server readiness
ScriptedAlchemy Aug 19, 2026
d325fc3
test: protect custom Claude state
ScriptedAlchemy Aug 19, 2026
7a1bccd
test(workbench): verify packed playground and live logs
ScriptedAlchemy Aug 19, 2026
29943fc
docs: keep native delivery evidence open
ScriptedAlchemy Aug 19, 2026
be6e7c2
fix(workbench): report foreground stream outages
ScriptedAlchemy Aug 19, 2026
887a328
feat(dev): identify foreground server instances
ScriptedAlchemy Aug 19, 2026
e31b979
feat(workbench): decode foreground instance identity
ScriptedAlchemy Aug 19, 2026
c6b397b
feat(workbench): add restart-aware foreground sessions
ScriptedAlchemy Aug 19, 2026
e917c8b
fix(dev): validate foreground instance IDs
ScriptedAlchemy Aug 19, 2026
e53fa1f
fix(workbench): supersede stale foreground bootstraps
ScriptedAlchemy Aug 19, 2026
60592c5
feat(workbench): share foreground authority with domain clients
ScriptedAlchemy Aug 19, 2026
336bb69
feat(workbench): inject foreground authority into MCP clients
ScriptedAlchemy Aug 19, 2026
979ccc9
fix(workbench): recover foreground project streams
ScriptedAlchemy Aug 19, 2026
fcf9c52
Gate Workbench during foreground recovery
ScriptedAlchemy Aug 19, 2026
e6ec2cc
fix(workbench): reject superseded project results
ScriptedAlchemy Aug 19, 2026
5d7a0b2
test(workbench): prove packed foreground recovery
ScriptedAlchemy Aug 19, 2026
4969b20
test(workbench): cover packed responsive navigation
ScriptedAlchemy Aug 19, 2026
4dfe73c
test(workbench): harden packed outage ledger
ScriptedAlchemy Aug 19, 2026
e2dec2f
fix(release): audit sbom from packed consumer
ScriptedAlchemy Aug 19, 2026
7d29dd1
test(public-api): budget built entrypoint smoke
ScriptedAlchemy Aug 19, 2026
2c41998
test(workbench): classify exact outage stream reset
ScriptedAlchemy Aug 19, 2026
836a402
docs: document packed native smokes
ScriptedAlchemy Aug 19, 2026
9653d6b
fix(eval): escape NUL delimiters so eval sources stay text
cursoragent Aug 19, 2026
5327558
test: add micro-eval end-to-end spot-check
cursoragent Aug 19, 2026
51550c7
fix(test): restore fixture script modes after checkout
cursoragent Aug 19, 2026
b1ed643
ci: add spot-check job and build before typecheck
cursoragent Aug 19, 2026
914eeda
docs: document startDevServer and the CI delivery gates
cursoragent Aug 19, 2026
c60f20d
fix(test): make delivery gates pass on fresh checkouts and modest mac…
cursoragent Aug 19, 2026
bfb5d13
refactor: consolidate duplicated helpers and cache hot paths
ScriptedAlchemy Aug 19, 2026
ffe24d8
fix(dev): revalidate artifact inspections
ScriptedAlchemy Aug 19, 2026
dd20e05
fix(dev): hash project sources from current bytes
ScriptedAlchemy Aug 19, 2026
9e5ad14
fix(dev): detect in-place active epoch changes
ScriptedAlchemy Aug 19, 2026
797279d
fix(dev): encode mutable stream messages freshly
ScriptedAlchemy Aug 19, 2026
a1cbeb1
style(test): remove trailing whitespace
ScriptedAlchemy Aug 19, 2026
fc5e367
refactor(core): share bounded concurrency
ScriptedAlchemy Aug 19, 2026
05ad0ae
refactor: break artifact hook dependency cycles
ScriptedAlchemy Aug 19, 2026
e0b64ca
refactor(dev): share strict MCP App JSON snapshots
ScriptedAlchemy Aug 19, 2026
0a68f72
fix(eval): ignore volatile Claude telemetry in normal-home check
ScriptedAlchemy Aug 19, 2026
3056e49
refactor(dev): separate MCP App wire protocol
ScriptedAlchemy Aug 19, 2026
763ed66
refactor(dev): isolate MCP session trace delivery
ScriptedAlchemy Aug 19, 2026
43ad2dc
refactor(dev): isolate MCP session launch policy
ScriptedAlchemy Aug 19, 2026
9bc7a9d
refactor(playground): separate protocol value policy
ScriptedAlchemy Aug 19, 2026
9d874d7
refactor(playground): isolate subscriber delivery
ScriptedAlchemy Aug 19, 2026
8dc6faa
refactor(eval): separate run storage codec
ScriptedAlchemy Aug 19, 2026
3e2d31e
refactor(build): separate artifact validation policy
ScriptedAlchemy Aug 19, 2026
56f80db
refactor(playground): separate native catalog policy
ScriptedAlchemy Aug 19, 2026
78a8aed
refactor(eval): separate dev service boundaries
ScriptedAlchemy Aug 19, 2026
a56edf9
refactor(test): separate packed release harness
ScriptedAlchemy Aug 19, 2026
790167e
refactor(dev): separate MCP session contracts
ScriptedAlchemy Aug 19, 2026
65e004a
refactor(dev): isolate MCP App session policy
ScriptedAlchemy Aug 19, 2026
17e5620
style: normalize extracted module endings
ScriptedAlchemy Aug 19, 2026
74f0dcf
fix(eval): hash Claude plugin tree by contents in normal-home check
ScriptedAlchemy Aug 19, 2026
e91f126
test(workbench): await terminal packed native run
ScriptedAlchemy Aug 19, 2026
7202eb3
ci: publish pull request package previews
ScriptedAlchemy Aug 19, 2026
2ceefa4
ci: expose package lint as a required gate
ScriptedAlchemy Aug 19, 2026
18ec41e
fix(eval): tolerate torn state reads and loaded machines in Claude smoke
ScriptedAlchemy Aug 19, 2026
d51c8f0
fix(eval): exclude skillUsage from the Claude normal-home contract
ScriptedAlchemy Aug 19, 2026
317531c
test(codex): separate process timeout fixtures
ScriptedAlchemy Aug 19, 2026
d665ab2
fix(test): stop forbidding the Skill tool in the Claude smoke prompt
ScriptedAlchemy Aug 19, 2026
8cbc037
fix(workbench): make production builds independent of NODE_ENV
ScriptedAlchemy Aug 20, 2026
e923662
docs: design thermo-review refactor sequence
ScriptedAlchemy Aug 20, 2026
09e63a6
docs: plan thermo-review refactor execution
ScriptedAlchemy Aug 20, 2026
0f8dc8c
fix(ci): satisfy rsbuild ConfigParams and recognize catalog abort pre…
ScriptedAlchemy Aug 21, 2026
8e31f84
refactor: deduplicate shared helpers surfaced by cleanup review
ScriptedAlchemy Aug 21, 2026
e3a7989
fix(ci): stabilize Node 26 verify failures
ScriptedAlchemy Aug 21, 2026
5339250
fix(ci): recognize socket severance and npm 11 SBOM shape in gates
ScriptedAlchemy Aug 21, 2026
48f802e
refactor: continue cleanup-review dedup
ScriptedAlchemy Aug 21, 2026
360bb3b
fix(workbench): correct landmark and heading semantics
ScriptedAlchemy Aug 21, 2026
7eefeae
fix(ci): accept a RESET project/session probe against the dying server
ScriptedAlchemy Aug 21, 2026
8eebf5a
refactor: reuse canonical serialization helpers
ScriptedAlchemy Aug 22, 2026
e6dc9f0
refactor: deslop shared decoder paths
ScriptedAlchemy Aug 22, 2026
4b4e668
refactor: apply branch-wide simplification review fixes
ScriptedAlchemy Aug 22, 2026
21c47a3
build: derive rslib externals from the published manifest
ScriptedAlchemy Aug 22, 2026
e24aaaf
build: migrate generated executables off deprecated chunkSplit
ScriptedAlchemy Aug 22, 2026
9865317
build: compile MCP apps in one rsbuild run with per-app environments
ScriptedAlchemy Aug 22, 2026
6fb271a
build: drop stats checks rspack never emits
ScriptedAlchemy Aug 22, 2026
ffc9c7c
chore: drop config values rsbuild and rstest already default
ScriptedAlchemy Aug 22, 2026
96b2e66
deps: launch browsers with open and drop direct @rspack/core
ScriptedAlchemy Aug 22, 2026
122e0b5
refactor: complete simplification review follow-ups
ScriptedAlchemy Aug 22, 2026
2f3d5df
test: split unit and integration pools and adopt rstest 0.11.9
ScriptedAlchemy Aug 22, 2026
4166ccd
fix: resolve ajv in the emitted declaration consumer fixture
ScriptedAlchemy Aug 22, 2026
8140b34
style: remove residual slop from branch-wide sweep
ScriptedAlchemy Aug 22, 2026
c19f3ea
refactor: remediate audit blockers wave 1
ScriptedAlchemy Aug 22, 2026
1d59c00
refactor: remediate audit wave 2
ScriptedAlchemy Aug 22, 2026
a382f9d
refactor: group dev services by subdomain
ScriptedAlchemy Aug 22, 2026
1dd766d
refactor: close re-audit residuals
ScriptedAlchemy Aug 22, 2026
e22dba8
refactor: simplify re-audit residual seams
ScriptedAlchemy Aug 22, 2026
f97c021
refactor(dev): reuse durable filesystem primitives
ScriptedAlchemy Aug 24, 2026
c494e5e
refactor(test): reuse errno failure fixtures
ScriptedAlchemy Aug 24, 2026
ca129d6
refactor(workbench): centralize stream lifecycle
ScriptedAlchemy Aug 24, 2026
266dac1
docs: scope Workbench to desktop
ScriptedAlchemy Aug 24, 2026
3dfb6e1
refactor(workbench): finish client cleanup
ScriptedAlchemy Aug 24, 2026
4d9c506
test(workbench): make playground cancellation load-safe
ScriptedAlchemy Aug 24, 2026
ea49ec3
test(workbench): await initial packed log replay
ScriptedAlchemy Aug 24, 2026
f85dca8
test(workbench): close comparison pages before fixtures
ScriptedAlchemy Aug 24, 2026
cfaebfd
test(workbench): pin actual last-good epoch
ScriptedAlchemy Aug 24, 2026
59b7da4
test(playground): allow bounded close cleanup
ScriptedAlchemy Aug 24, 2026
ab28e99
refactor(workbench): simplify stream clients
ScriptedAlchemy Aug 24, 2026
d904099
fix(workbench): reject partial stream frames
ScriptedAlchemy Aug 24, 2026
911a15b
test(workbench): cover malformed MCP trace frames
ScriptedAlchemy Aug 24, 2026
c3ec309
docs: design public example workspaces
ScriptedAlchemy Aug 24, 2026
b462e69
docs: plan public example workspaces
ScriptedAlchemy Aug 24, 2026
518c987
build: adopt canonical pnpm workspace
ScriptedAlchemy Aug 25, 2026
7c03e9d
feat(examples): add skills starter
ScriptedAlchemy Aug 25, 2026
549d99f
feat(examples): add hooks and scripts
ScriptedAlchemy Aug 25, 2026
768712e
feat(examples): add interactive MCP app
ScriptedAlchemy Aug 25, 2026
4a70225
docs: publish example command surface
ScriptedAlchemy Aug 25, 2026
07e2a4d
test(examples): verify real workbench experiences
ScriptedAlchemy Aug 25, 2026
fc2c97c
ci: install pnpm directly
ScriptedAlchemy Aug 25, 2026
362304c
build: move Rslib into the package
ScriptedAlchemy Aug 25, 2026
23c09ab
test: use pnpm for workspace tooling
ScriptedAlchemy Aug 25, 2026
aa30e0d
docs(examples): complete local walkthroughs
ScriptedAlchemy Aug 25, 2026
0c51e14
refactor(workbench): remove Inspector build spike
ScriptedAlchemy Aug 25, 2026
3716fa6
refactor(workbench): remove internal milestone copy
ScriptedAlchemy Aug 25, 2026
f7def12
refactor(dev): reuse path containment helper
ScriptedAlchemy Aug 25, 2026
2ea1825
refactor(workbench): share strict MCP trace framing
ScriptedAlchemy Aug 25, 2026
6f0d1c3
fix(workbench): close hidden MCP app previews
ScriptedAlchemy Aug 25, 2026
9325126
docs: use pnpm for Workbench development
ScriptedAlchemy Aug 25, 2026
33bd1ee
test: load package-owned Rslib config
ScriptedAlchemy Aug 25, 2026
25b2639
docs: design realistic example workflows
ScriptedAlchemy Aug 25, 2026
be9c00c
feat(examples): teach release readiness skills
ScriptedAlchemy Aug 25, 2026
0cd2c73
feat(examples): model release automation
ScriptedAlchemy Aug 25, 2026
0f608e5
feat(examples): showcase unified service readiness
ScriptedAlchemy Aug 25, 2026
c9e80be
fix(examples): reject incomplete service fixtures
ScriptedAlchemy Aug 25, 2026
f77b339
feat(workbench): explain the bundle workflow
ScriptedAlchemy Aug 25, 2026
b9e83bd
fix(workbench): clarify workflow guidance
ScriptedAlchemy Aug 25, 2026
3abf74e
fix(artifact): validate emitted assets
ScriptedAlchemy Aug 25, 2026
868d47c
fix(examples): package release evidence for scripts
ScriptedAlchemy Aug 25, 2026
0fafc04
feat(workbench): choose useful artifact defaults
ScriptedAlchemy Aug 25, 2026
eb56d9b
fix(workbench): preserve current artifact binding defaults
ScriptedAlchemy Aug 25, 2026
3a1c48c
fix(workbench): settle artifact catalog races
ScriptedAlchemy Aug 25, 2026
21fc7d6
fix(examples): package service fixture evidence
ScriptedAlchemy Aug 25, 2026
81f5551
fix(workbench): present workflow steps once
ScriptedAlchemy Aug 25, 2026
1d40e3b
test(examples): verify the complete desktop workflow
ScriptedAlchemy Aug 25, 2026
2349838
test(workbench): require terminal diagnostic capture states
ScriptedAlchemy Aug 25, 2026
8da8766
fix(mcp-app): present degraded status accessibly
ScriptedAlchemy Aug 25, 2026
87af9a1
test(workbench): align integration expectations
ScriptedAlchemy Aug 25, 2026
55c496e
test(workbench): require recovered artifact binding
ScriptedAlchemy Aug 25, 2026
4984de4
test(workbench): follow dashboard heading
ScriptedAlchemy Aug 25, 2026
54817f2
fix(workspace): link the CLI before builds
ScriptedAlchemy Aug 25, 2026
0380bab
test(workbench): follow the packaged CLI wrapper
ScriptedAlchemy Aug 25, 2026
1e60f58
test(workspace): serialize real example journeys
ScriptedAlchemy Aug 25, 2026
7dc600e
fix(workspace): resolve fixture dependencies from owners
ScriptedAlchemy Aug 25, 2026
581543b
test(workbench): stabilize app preview acceptance
ScriptedAlchemy Aug 25, 2026
703bb00
test(workbench): classify aborted session reads
ScriptedAlchemy Aug 25, 2026
7b4b3f7
test(workspace): reuse the prepared workbench build
ScriptedAlchemy Aug 25, 2026
f31a181
test(workbench): sample live logs atomically
ScriptedAlchemy Aug 25, 2026
e8e0d1e
test(workbench): inspect the prepared production build
ScriptedAlchemy Aug 25, 2026
c5027f4
docs: design capability-aware workbench
ScriptedAlchemy Aug 25, 2026
80b92a3
docs: plan capability-aware workbench
ScriptedAlchemy Aug 25, 2026
49a07e7
feat(workbench): derive routes from bundle capabilities
ScriptedAlchemy Aug 25, 2026
a48ab28
feat(workbench): explain bundle builds
ScriptedAlchemy Aug 25, 2026
0b732e4
feat(workbench): guide playground operations
ScriptedAlchemy Aug 25, 2026
78ad858
feat(examples): expand the skills starter
ScriptedAlchemy Aug 25, 2026
679d351
fix(workbench): clarify generated skill output
ScriptedAlchemy Aug 25, 2026
3e2d37f
test(workbench): verify capability-aware examples
ScriptedAlchemy Aug 25, 2026
4ea30c0
fix(workbench): align capability-aware browser flows
ScriptedAlchemy Aug 26, 2026
126f4cf
feat(workbench): simplify hook simulation input
ScriptedAlchemy Aug 26, 2026
40c66ec
fix(workbench): label hooks for developers
ScriptedAlchemy Aug 26, 2026
4133260
test(workbench): exercise advanced hook input
ScriptedAlchemy Aug 26, 2026
8a3efc6
test(workbench): allow logs cursor recovery
ScriptedAlchemy Aug 26, 2026
abc0415
refactor(workbench): centralize capability-aware routing
ScriptedAlchemy Aug 27, 2026
0b6e290
fix(workbench): update react router
ScriptedAlchemy Aug 27, 2026
9d1323b
test(eval): stabilize Node 26 cancellation cleanup
ScriptedAlchemy Aug 27, 2026
0bf6769
refactor(build): plan target diagnostics once
ScriptedAlchemy Aug 27, 2026
4ad1d50
refactor(workbench): share route client options
ScriptedAlchemy Aug 27, 2026
39953ff
test(mcp): share inert client stubs
ScriptedAlchemy Aug 27, 2026
26ae2d5
fix(playground): treat unpublished owner locks as contention
ScriptedAlchemy Aug 27, 2026
d58d028
refactor: remove unused diagnostic and route helpers
ScriptedAlchemy Aug 27, 2026
5022a23
perf: avoid repeated project walks and a full CLI import on --help
ScriptedAlchemy Aug 27, 2026
b796f90
refactor(adapters): share the plugin artifact emission tail
ScriptedAlchemy Aug 27, 2026
794bdb3
test(workbench): boot e2e suites through one hardened server harness
ScriptedAlchemy Aug 27, 2026
73dbf71
test: share stream, deferred, and process-spawn helpers
ScriptedAlchemy Aug 27, 2026
e203382
test: table-drive corrupt-lock rejections and reuse the production di…
ScriptedAlchemy Aug 27, 2026
e23f7d7
test(workbench): read the newest readable logs replay body
ScriptedAlchemy Aug 27, 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
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
77 changes: 77 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: CI

on:
pull_request:
push:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
# Fast end-to-end confidence gate: builds, validates, and deterministically evals the
# checked-in micro fixture through the real CLI. Never skip-gated and needs no native host.
spot-check:
name: Micro-eval spot-check (Node 22.19)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/setup@v1
with:
cache: true
install: false
runtime: node@22.19.0
- run: pnpm install --frozen-lockfile
- run: pnpm examples:check
- run: pnpm test:spot-check

verify:
name: Verify (Node ${{ matrix.node-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: ['22.19.0', '24', '26']
steps:
- uses: actions/checkout@v7
- uses: pnpm/setup@v1
with:
cache: true
install: false
runtime: node@${{ matrix.node-version }}
- run: pnpm install --frozen-lockfile
- run: pnpm exec playwright install --with-deps chrome
# Build first: checked-in suites and API tests import the package's built type
# declarations, so typecheck requires dist (same order as `pnpm check`).
- run: pnpm build
- name: Package lint (publint)
run: pnpm lint:package
- run: pnpm typecheck
- run: pnpm lint
- run: pnpm test

release-gates:
name: Release gates (Node 22.19)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/setup@v1
with:
cache: true
install: false
runtime: node@22.19.0
- run: pnpm install --frozen-lockfile
- run: pnpm exec playwright install --with-deps chrome
- run: pnpm check:release

dependency-review:
if: github.event_name == 'pull_request'
name: Dependency review
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/dependency-review-action@v4
53 changes: 53 additions & 0 deletions .github/workflows/native-host-smoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Native host smoke

on:
workflow_dispatch:
inputs:
host:
description: Signed-in host CLI to exercise
required: true
default: both
type: choice
options: [both, claude, codex]

permissions:
contents: read

concurrency:
group: native-host-smoke-${{ github.workflow }}-${{ inputs.host }}
cancel-in-progress: true

jobs:
native-host-smoke:
# This runs only on a trusted runner with existing CLI login state; no workflow secrets are passed.
runs-on: self-hosted
strategy:
fail-fast: false
matrix:
include:
- host: claude
source_tests: packages/agent-bundle/tests/native-claude-contract.test.ts packages/agent-bundle/tests/eval-claude-harness.test.ts
packed_command: pnpm test:packed:native:claude
- host: codex
source_tests: packages/agent-bundle/tests/native-codex-contract.test.ts packages/agent-bundle/tests/eval-codex-home.test.ts
packed_command: pnpm test:packed:native:codex
steps:
- uses: actions/checkout@v7
if: inputs.host == 'both' || inputs.host == matrix.host
- uses: pnpm/setup@v1
if: inputs.host == 'both' || inputs.host == matrix.host
with:
cache: true
install: false
runtime: node@22.19.0
- run: pnpm install --frozen-lockfile
if: inputs.host == 'both' || inputs.host == matrix.host
- name: ${{ matrix.host }} source signed-in smoke
if: inputs.host == 'both' || inputs.host == matrix.host
env:
AGENT_BUNDLE_NATIVE_CLAUDE_SMOKE: ${{ matrix.host == 'claude' && '1' || '' }}
AGENT_BUNDLE_NATIVE_CODEX_SMOKE: ${{ matrix.host == 'codex' && '1' || '' }}
run: pnpm test -- ${{ matrix.source_tests }}
- name: ${{ matrix.host }} installed-tarball native smoke
if: inputs.host == 'both' || inputs.host == matrix.host
run: ${{ matrix.packed_command }}
25 changes: 25 additions & 0 deletions .github/workflows/package-preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Package preview

on:
pull_request:

permissions: {}

concurrency:
group: package-preview-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
publish:
name: Publish pkg.pr.new preview
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/setup@v1
with:
cache: true
install: false
runtime: node@22.19.0
- run: pnpm install --frozen-lockfile
- run: pnpm build
- run: pnpm preview:publish
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Task 9A: MCP launch configuration report

## Outcome

- Added the Session-local `Launch configuration` display using only `McpBrowserSessionModel.config`.
- `stdio` renders transport, command, ordered arguments, cwd, and lexical environment rows with explicit empty states.
- `streamable-http` renders only its transport and sanitized URL.
- The existing Inspector-config download and display now both derive from the same local `config` snapshot.
- No server or model sanitizer changes were needed.

## TDD evidence

- RED: `npm test -- packages/workbench/tests/mcp-page.test.ts` exited 1 because the current page did not contain `Launch configuration`.
- RED: `npm exec rstest -- --config rstest.config.ts run packages/workbench/tests/overview.e2e.test.ts --testNamePattern 'renders the safe launch configuration for one real artifact MCP session'` exited 1 at the missing `.mcp-page-launch-configuration` locator.
- GREEN: the same dedicated Chrome command exited 0 (1 passed, 7 skipped). It opens a real artifact session, asserts safe values and secret absence, checks 390px overflow, and records page errors.

## Verification

- `npm test -- packages/workbench/tests/mcp-page.test.ts packages/workbench/tests/mcp-session-model.test.ts packages/workbench/tests/mcp-session-controller.test.ts` — 38 passed.
- `npm run typecheck --workspace agent-bundle-workbench` — passed.
- `npm exec rslint -- packages/workbench/src/mcp/mcp-page.tsx packages/workbench/tests/mcp-page.test.ts packages/workbench/tests/overview.e2e.test.ts` — 0 errors, 0 warnings.
- `npm run build --workspace agent-bundle-workbench` — production Rsbuild passed.
- `git diff --check` — passed.
- Review regression: `git diff --unified=0 bc25a0c -- packages/workbench/tests/overview.e2e.test.ts` shows only the dedicated helper and test outside the broad lifecycle body.
- TraceDecay file diagnostics — 0 diagnostics; unsafe-pattern and redundancy scans found no production findings.

## Browser note

The in-app Browser was unavailable, so the task-authorized Chrome fixture was used. Launch-configuration display, secret-absence, responsive-layout, and page-error coverage live solely in the dedicated Chrome test; the pre-existing broad lifecycle body was restored to its `bc25a0c` form. Its normal close-button click still has the independently reproduced baseline timeout, including when the Task 9A session subsection is temporarily removed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Task 9B: MCP session timeout report

## Delivered contract

- `timeoutMs` is selected before session open, defaults to 5,000 ms, and is stored immutably on the session rather than in `McpSessionBinding`.
- The MCP create route admits only a finite, positive own JSON number and returns the established `AB8016` invalid-shape diagnostic for invalid values or smuggled fields.
- Initialization, catalog reads, prompt/resource/tool calls, and restart resolve omitted timeouts from the session value; internal callers can still supply an explicit request override.
- Route, transport, controller, and page retain the value. The page exposes an accessible `Session timeout (ms)` control, validates locally, locks it once opening begins, and displays the exact active timeout.

## TDD evidence

- Backend RED: a create request with `timeoutMs` received HTTP 400; the opened session exposed no timeout.
- Browser RED: transport POST body omitted `timeoutMs`, controller factory options omitted it, and page markup had no labeled control.
- Chrome RED: dedicated interaction contract was written before the page control existed.
- GREEN: all contracts pass with the implementation below.

## Verification

- `npm test -- packages/agent-bundle/tests/mcp-session-service.test.ts packages/agent-bundle/tests/mcp-session-routes.test.ts` — 34 passed.
- `npm run typecheck --workspace agent-bundle-workbench` — passed.
- Scoped `npx rslint` for the five MCP sources and focused tests — 0 errors, 0 warnings.
- `npm test -- packages/workbench/tests/agent-bundle-remote-transport.test.ts packages/workbench/tests/mcp-session-controller.test.ts packages/workbench/tests/mcp-page.test.ts` — 41 passed.
- `npx rstest --config rstest.config.ts packages/workbench/tests/mcp-session-timeout.e2e.test.ts --reporter verbose` — 1 Chrome test passed, including restart, invalid local input/no route request, no page errors, and 390 px overflow check.
- `npm run build --workspace agent-bundle-workbench` and `git diff --check` — passed.
- TraceDecay diagnostics reported 0 errors; simplify, redundancy, unsafe-pattern, and test-risk scans reported no findings in scope.

## Commits

1. `9f868fa feat(mcp): persist session request timeouts`
2. `feat(workbench): control MCP session timeouts`

## Scope guard

No per-operation browser timeout, launch-config/download, trace-export, Inspector, Playground, eval, raw-log, or broad lifecycle E2E changes were made.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Task 9C: Integrated Inspector report

## Delivered contract

- The Workbench rail and page union no longer expose Inspector as a peer page.
- MCP owns an internal, accessible Playground / Inspector tab control. Both tab panels stay mounted and are hidden and inert when inactive, so switching does not recreate either presentation.
- `McpPage` and `InspectorSessionAdapter` share the existing controller; the adapter receives the app-level subscription of that same controller model. No second transport, session, bootstrap, route client, or iframe was introduced.
- `#mcp` is the sole MCP route. Direct `#mcp` and the rail MCP action select Playground, and internal tabs leave browser history unchanged. Unsupported `#inspector` remains in the URL, resolves to Overview, renders no Inspector tab, and opens no MCP session.
- The responsive tab shell keeps the 390 px page width within the viewport.

## TDD evidence

- RED: the dedicated-Inspector Chrome fixture was first rewritten to require canonical `#mcp`, no Inspector rail link, a selected internal Inspector tab, idle/no POST, the shared real-session flow, and a separate unsupported-`#inspector` Overview fallback with no session. The pre-change dedicated page retained `#inspector` and had no internal Inspector tab.
- GREEN: the same real Chrome fixture now verifies the unsupported hash stays `#inspector` while showing Overview without a session, then exercises the canonical `#mcp` flow with one POST, exact shared Inspector catalogs/protocol/logging, preserved Playground form state, reset propagation, no page errors, and 390 px overflow.

## Verification

- `npm exec rstest -- run packages/workbench/tests/inspector-shell.e2e.test.ts --reporter verbose` — 3 Chrome tests passed: unsupported-hash fallback, production `#mcp` session flow, and explicit development artifact.
- `npm exec rstest -- run packages/workbench/tests/inspector-session-adapter.test.ts packages/workbench/tests/inspector-session-adapter-fixture.test.ts packages/workbench/tests/mcp-session-controller.test.ts packages/workbench/tests/mcp-page.test.ts --reporter verbose` — 47 tests passed.
- `npm run typecheck --workspace agent-bundle-workbench` — passed.
- `npx rslint packages/workbench/src/main.tsx packages/workbench/tests/inspector-shell.e2e.test.ts` — 0 errors, 0 warnings.
- `npm run build --workspace agent-bundle-workbench` and `git diff --check` — passed.
- TraceDecay package diagnostics — 0 errors, 0 warnings; simplify scan — no findings (the index noted only `styles.css` stale); unsafe-pattern scan — 0 matches; test-risk scan — no items.
- Code-simplifier and deslop review — no behavior-preserving cleanup needed.

## Scope guard

No Inspector vendor/adapter source, export wiring, MCP launch/timeout/App logic, backend routes, or evaluator files changed.

## Fix round 1: complete tab semantics

- RED: the expanded real Chrome session contract failed because the selected Playground tab had no `tabindex="0"`; ArrowRight therefore did not move focus or select Inspector.
- GREEN: the two internal tabs now use roving `tabIndex` and select/focus through ArrowLeft, ArrowRight, Home, and End without mutating browser history.
- The existing Chrome fixture now also proves exactly one mounted panel of each kind, inactive `hidden` + `inert` state, selected-panel exposure, stable history through keyboard and pointer switches, retained Inspector Logging state after a Playground roundtrip, and no horizontal overflow for either presentation at 390 px.
- Verification: Inspector Chrome fixture 3/3; focused Inspector adapter/controller/page suite 47/47; Workbench typecheck, scoped Rslint, production Rsbuild, and `git diff --check` all passed. Code-simplifier/deslop found no cleanup needed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Task 9D report: current MCP protocol trace export

## Scope guard

Implemented only the browser-side current MCP protocol trace export. The export is deliberately distinct from Task 10's durable Playground session export: it has no persistence, append/finalize route, transport call, session POST, backend, hook, artifact, App, timeout, vendor, eval, or launch-config/environment/session-capability surface.

The shared Task 9C controller/session remains the sole source of truth. The MCP page uses the existing generic Blob browser-download sink, and Inspector Protocol and Logging use their existing `onExportTrace` callback with the full underlying timeline rather than a filtered or cleared presentation list.

Concurrent unrelated worktree edits (including Hooks, closure, config, and other MCP test changes) were preserved and are excluded from this commit.

## RED

Before production code, ran:

```text
npx rstest run packages/workbench/tests/mcp-page.test.ts packages/workbench/tests/inspector-session-adapter.test.ts
```

Expected RED: `packages/workbench/tests/mcp-page.test.ts` failed because `../src/mcp/mcp-protocol-trace.ts` did not exist. The new contracts covered the missing canonical builder/page trace action; the real Inspector Chrome flow was then extended to require the absent browser download wiring.

## GREEN

- Added `mcp-protocol-trace.ts`, a pure canonical, versionless builder with `kind: "agent-bundle.mcp-protocol-trace"`, explicit null session facts, full cursor/timeline/history, immediate detached JSON Blob serialization, trailing newline, JSON MIME type, and deterministic opaque-session/idle filename.
- Added the labeled MCP Trace action and explanatory copy: it exports the current browser MCP trace, not a durable Playground session export.
- Reused one generic browser Blob/download sink for Inspector config, MCP trace, and Inspector Protocol/Logging trace downloads.
- Added unit coverage for exact export shape, raw ordered entries including replay gaps/invocations, cursor/history preservation, nulls, MIME/newline/filename, detached bytes after caller mutation, sensitive launch/config/session-capability omission, page sink handoff, and complete Inspector Protocol/Logging timeline handoff.
- Extended the existing artifact-backed Inspector Chrome fixture to parse downloads from MCP Page, Inspector Protocol, and Inspector Logging; it proves matching canonical traces, the real `tools/call` payload, one session POST, no page errors, and 390 px no-overflow behavior.
- Applied explicit `undefined` `useRef` initializers in the owned entry file to satisfy the current Workbench TypeScript version without changing runtime behavior.

## Verification

All post-change commands passed:

```text
npx rstest run packages/workbench/tests/mcp-page.test.ts packages/workbench/tests/inspector-session-adapter.test.ts packages/workbench/tests/mcp-session-controller.test.ts packages/workbench/tests/mcp-session-model.test.ts
# 62 passed

npx rstest run packages/workbench/tests/inspector-shell.e2e.test.ts
# 3 passed: unsupported-hash, shared real-session, and development artifact coverage

npm run typecheck --workspace agent-bundle-workbench
npx rslint packages/workbench/src/mcp/mcp-protocol-trace.ts packages/workbench/src/mcp/mcp-page.tsx packages/workbench/src/main.tsx packages/workbench/tests/mcp-page.test.ts packages/workbench/tests/inspector-session-adapter.test.ts packages/workbench/tests/inspector-shell.e2e.test.ts
npm run build --workspace agent-bundle-workbench
git diff --check
```

TraceDecay MCP was unavailable. One required CLI fallback attempt failed exactly with:

```text
Error: config error: TraceDecay daemon socket '/home/zack/.tracedecay/daemon.sock' is not available. Run `tracedecay daemon install-service` and ensure the service is running.
```

Used local scoped source/test evidence after that single failed attempt. The requested code-simplifier and deslop reviews found no behavior-preserving cleanup to apply in the Task 9D hunks.
16 changes: 16 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Repository guidance

## Workbench platform scope

- The developer Workbench is a desktop-only application.
- Design, implementation, and browser acceptance should target desktop viewports and desktop interaction patterns.
- Do not add mobile-specific layouts, responsive behavior, or mobile acceptance requirements unless the user explicitly requests them.
- A mobile-only layout defect is not a release blocker for this repository.

## Public examples

- Treat `examples/*` as user-facing products, not test fixtures.
- Use only public `agent-bundle` package exports and `workspace:*` dependencies.
- Validate examples at a 1440×900 desktop viewport; mobile support is not required.
- Never accept or capture a Workbench route while its loading state is still visible.
- Browser acceptance must cover populated state plus the documented stale-diagnostic and repair flow.
Loading
Loading