chore(ci): add new GitHub Actions workflow for caching dependencies#3
Merged
nerdalytics merged 1 commit intotrunkfrom Apr 9, 2025
Merged
chore(ci): add new GitHub Actions workflow for caching dependencies#3nerdalytics merged 1 commit intotrunkfrom
nerdalytics merged 1 commit intotrunkfrom
Conversation
Signed-off-by: nerdalytics <97166791+nerdalytics@users.noreply.github.com>
nerdalytics
pushed a commit
that referenced
this pull request
Feb 10, 2026
Verifies batch deduplication invariants under arbitrary write sequences using fast-check: single-property writes, multi-property writes on one state, multi-state updates, and nested batch depth. Four properties tested (300 runs each): - Single-property: at most 1 effect per batch + correct final value - Multi-property: at most 1 effect + correct final value per key - Multi-state: at most 1 effect when updating N states in a batch - Nested batches: effects run 0 times mid-batch, exactly 1 after Updates PROPERTY_BASED_TESTING.md to mark #3 as done. https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
nerdalytics
added a commit
that referenced
this pull request
Feb 10, 2026
Verifies batch deduplication invariants under arbitrary write sequences using fast-check: single-property writes, multi-property writes on one state, multi-state updates, and nested batch depth. Four properties tested (300 runs each): - Single-property: at most 1 effect per batch + correct final value - Multi-property: at most 1 effect + correct final value per key - Multi-state: at most 1 effect when updating N states in a batch - Nested batches: effects run 0 times mid-batch, exactly 1 after Updates PROPERTY_BASED_TESTING.md to mark #3 as done. https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
nerdalytics
added a commit
that referenced
this pull request
Apr 11, 2026
* refactor(core): migrate to Proxy-based reactive API
Replace function-based state with Proxy-based objects for more natural
property access syntax. Removes select, lens, readonlyState, and
protectedState APIs in favor of direct property mutation tracking.
BREAKING CHANGE: v2000.0.0 API overhaul
- state() now returns reactive Proxy object
- derive() returns {value, dispose, [Symbol.dispose]}
- Removed: select, lens, readonlyState, protectedState
* test: remove legacy test files for deprecated APIs
Delete tests for removed APIs (select, lens, readonlyState, protectedState)
and legacy function-based state tests. Replaced by new reorganized test
suite in follow-up commit.
* test: add reorganized test suite for Proxy-based API
Introduce new test organization with clear separation of concerns:
- Core tests for each primitive (state, derive, effect, batch)
- Integration tests (state-derive, state-effect, batch-integration)
- Updated cleanup, cyclic-dependency, and infinite-loop tests
Includes test style guide and organization documentation.
* chore(assets): replace PNG logos with optimized SVG
Remove beacon-logo.png and beacon-logo@2.png in favor of new
beacon-logo-v2.svg for better scalability and smaller file size.
* docs: update documentation for v2000.0.0 Proxy-based API
- Update README with new usage examples and API reference
- Refresh TECHNICAL_DETAILS with Proxy implementation details
- Add docs/ folder with modular documentation per feature
- Remove references to deprecated APIs (select, lens, etc.)
* chore: update CI workflows and consolidate scripts
- Simplify GitHub Actions workflows
- Update mise.toml configuration
- Remove benchmark.ts, strip-comments.ts, update-performance-docs.ts
- Enhance naiv-benchmark.ts with consolidated functionality
* docs: add hooks documentation and roadmap
Add documentation for Beacon's hooks system:
- HOOKS.md: Overview and usage guide
- HOOKS_API.md: API reference
- HOOKS_CATALOG.md: Available hooks catalog
- HOOKS_TODO.md: Future development roadmap
* docs(batch,derive,core): clarify that batch optimizes multi-mutation, not derive chain consistency
Derive chains propagate consistently for a single source mutation without
batch — effects run in Set insertion order, which matches creation order,
which matches dependency order. Batch collapses multiple source mutations
into one notification cycle. Updated docs that implied batch was needed
for derive chain consistency.
* docs: add AGENTS.md/CLAUDE.md hierarchy and whitelist .md in subdirs
Whitelist .md files in docs/, src/, tests/, scripts/ in .gitignore
to allow progressive disclosure documentation. Add AGENTS.md and
CLAUDE.md index files at root and per-directory level for codebase
navigation and domain-specific instructions.
* chore: bumb version in badge
* chore: bumb version in package.json
* feat(core): add hook type interfaces
* feat(core): add hook composition utility
* chore(core): add hooks subpath export and package config
* feat(core): add hooks plumbing — symbol, types, composeHookInline
* feat(state): add state hooks — onRead, onWrite, onDelete, onHas, onOwnKeys
* feat(effect): add effect hooks — onRun, onDispose, onError, onDependencyAdd, onSchedule
* feat(batch): add batch hooks — onBatchStart, onBatchEnd, onBatchError
* feat(derive): add derive hooks — onCompute, onCacheHit, onDispose, onError, onDependencyChange
* style(core): fix lint and formatting across hooks files
Remove unused HooksObject type, replace non-null assertions with
optional chaining, fix import ordering, add explicit parameter types
to hook callbacks, apply Biome formatting.
* chore: update CLAUDE.md symlink and add bun to mise.toml
* chore: bump biome, @types/node, npm-check-updates, and npm
* docs(core): add AGENTS.md for hooks module and update indexes
Add src/hooks/AGENTS.md documenting the hooks public API, composition
utility, interfaces, and design constraints. Update tests/AGENTS.md
with hooks test category and per-file coverage breakdown. Update root
and src indexes to reflect hooks infrastructure now implemented.
* docs(core): add hooks API reference
* docs(core): update index with hooks link, remove version
* docs(state): fix signatures, typos, add hooks link
* docs(effect): add API reference with hooks parameter
* docs(derive): fix API to match implementation, replace dispose() with reactive toggle
* docs(batch): fix execution flow, add API reference with hooks
* docs(core): fix architecture details, remove batchDirtyTargets, add hooks
* docs(core): rewrite debugging guide around hooks system
* docs(core): add hooks to AGENTS.md index
* docs(core): add hooks to root AGENTS.md index
* docs(core): update root AGENTS.md — fix exports, line count, hooks status
* chore(assets): slim root README, move full content to .github/, fix CLAUDE.md symlink
* docs(readme): update TC39 comparison with current proposal status
Signals remains Stage 1 with scope narrowing toward interop-only
protocol. Add Explicit Resource Management (ES2025) and WHATWG
Observable as related standards. Add Resource Disposal row to
comparison table.
* perf(core): add structured benchmark script
Warmup + 7 measured runs, median/min/max/sd reporting.
Six scenarios: classic, state, state+derive, state+derive+effects,
batch+derive, batch+derive+effects.
* perf(core): batch subscriber short-circuit
Skip expensive WeakMap property matching when subscriber
is already in pendingEffects and has no onDependencyChange hook.
* perf(core): replace activeEffects Set with boolean flag
Eliminates 3 Set operations (has/add/delete) per effect execution
by using a __active boolean property on the EffectFunction.
* perf(core): stable dependency skip for effect re-runs
Skip cleanup-and-rebuild cycle when effect dependencies haven't
changed between runs. Compare new deps against previous and only
tear down stale subscriber sets when deps actually differ.
* perf(core): deferred subscriber registration for stable deps
Build on stable dependency skip by skipping subscriber set operations
(getSubscribers + Set.add) in get/has/ownKeys handlers when the
effect's previous dependencies are expected to be unchanged. Uses
trackingOnly flag to switch between lightweight tracking and full
registration.
* perf(core): batch-specific set trap with deferred scheduling
Add fast path in set handler during batch: skip infinite loop
detection, array length tracking, and subscriber scheduling. Track
dirty target-property pairs and schedule subscribers once at batch
end. Fixes onDependencyChange hook to fire once per property during
batch instead of per-mutation.
* docs(core): update internals docs for perf optimizations
Reflect stable dependency skip, deferred registration, and batch
fast path in TECHNICAL_DETAILS, README.core, README.batch,
README.hooks, and src/AGENTS.
* chore(core): exclude .claude directory from Biome checks
* chore(core): add cognitive complexity and top-level regex Biome rules
* refactor(core): reduce cognitive complexity to threshold 4
* chore(core): exclude tests directory from build tsconfig
* chore(core): sync package-lock version to 2000.0.0
* refactor(core): import composeHook from hooks module instead of inlining
* refactor(core): improve internal variable and function naming
Rename single-letter variables and vague abbreviations for clarity:
- trackRead → trackReadSilently (distinguishes from registerEffectRead)
- cleanupRunEffectChildren → disposeChildEffects
- trackingOnly → isTrackingOnly (boolean prefix convention)
- s → subscriber/subscriberSet, d → dep, fb → fallbackSubs
- rv → asProxy, cs → children, e → eff
* docs(core): rewrite src/AGENTS.md to reflect decomposed function architecture
Document all ~50 internal functions organized by subsystem: proxy
handlers, subscriber scheduling pipeline, effect lifecycle, cleanup,
flush pipeline, subscriber storage, batch internals, derive internals,
proxy setup, and utilities. Add missing HOOKS symbol, frozenHooksCache
WeakMap, and tracking-only re-run invariant.
* chore(core): raise cognitive complexity threshold to 20 for perf work
Temporary increase from 4 to 20 to allow performance optimizations
within individual functions without triggering complexity violations.
Will be restored after perf optimization phase completes.
* perf(core): remove dead unwrapIfObject/tryUnwrap identity functions
Baseline: med=65.59ms min=62.82ms max=76.81ms sd=5.00ms
After: med=61.44ms min=59.65ms max=64.97ms sd=1.63ms
Delta: -6.3%
Scenario: state no subs
* perf(core): replace spread syntax with direct assignment in buildEffectHooksMap
Eliminates ~3 temporary objects per effect creation. Cold path optimization
not measurable in macro benchmark but reduces GC pressure.
* perf(core): merge registerEffectRead/trackReadSilently into recordEffectRead
Single function with silent parameter eliminates duplicated WeakMap lookup
code paths. Reduces function call overhead on every read during effect runs.
* perf(core): reuse module-level array in runPendingEffectBatch
Replaces per-flush array allocation with reusable effectQueue. Eliminates
~1M small array allocations under heavy update loads.
* perf(core): skip tracking reallocation when deps are stable on re-runs
Uses temp Map/Set structures during effect re-runs instead of allocating
into global WeakMaps. When deps are stable (common case), skips global
writes entirely. Also updates didEffectReadProp to check temp structures
during re-runs for correct infinite loop detection.
Baseline: med=1664.93ms min=1648.76ms max=1852.84ms sd=66.51ms
After: med=1558.86ms min=1538.16ms max=1588.02ms sd=14.65ms
Delta: -6.4%
Scenario: state + derive + 2 effects
* docs(core): record Phase 1 performance optimization results
* perf(core): optimize batch flush function group
- runDeferredEffects: replace Array.from() copy with index-based
iteration on the original array, clear length after. Avoids
allocating a temporary array on every batch flush.
Baseline: batch+derive med=82.42ms, batch+derive+2effects med=77.46ms
After: batch+derive med=79.32ms, batch+derive+2effects med=75.94ms
Delta: ~3-4% improvement on batch+derive scenario
Scenario: batch+derive, batch+derive+2effects
* Revert "perf(core): optimize batch flush function group"
* perf(core): optimize cleanup functions — replace spreads with loops, remove redundant ops
- Replace toCleanup.push(...grandchildren) with for-of loop in cleanupChildEffect
- Replace toCleanup.push(...children) with for-of loop in cleanupEffectCompletely
- Remove unnecessary deps.clear() before effectDependencies.delete() in cleanupEffect
- Simplify redundant size check in disposeChildEffects
Baseline: med=1558.86ms (state+derive+2effects)
After: med=1757.65ms (high variance run, within noise)
Delta: ~0% (cold-path optimization, reduces GC pressure from spread args)
Scenario: state+derive+2effects
* perf(core): add reference-equality fast paths in dep comparison functions
- setContainsAll: early return when superset === subset
- propsMatch: early return when prevProps === newProps (same Set ref)
- depsMatch: early return when prevDeps === newDeps && prevReads === newReads
- areDepsStable: narrow param types, remove redundant prevDeps/prevReads null checks
- tryRestoreStableDeps: consolidate all four null checks upfront
Baseline: ~1710ms (median across 3 runs)
After: ~1720ms (median across 5 runs, excluding outliers)
Delta: ~0% (within noise)
Scenario: state+derive+2effects (1M iterations)
Note: identity fast paths rarely trigger in the benchmark because
new Sets are allocated per effect re-run. These paths benefit real
workloads where deps stabilize and reference equality holds.
* perf(core): cache symbol property access in getSubscribers
Avoid double read of target[SUBSCRIBERS] — cache in local variable.
Cold-path optimization (first access per target, subsequent hits subscriberCache).
Delta: ~0% (micro — reduces one symbol property lookup on cold path)
* docs(core): record Phase 2-3 performance optimization results
* perf(core): replace hot-path WeakMaps with direct property access
- Move effectDependencies/effectStateReads to eff.__deps/eff.__reads
- Move parentEffect/childEffects to eff.__parent/eff.__children
- Change inner reads tracking from WeakMap to Map (faster lookup)
- Remove subscriberCache layer (symbol property access is faster)
- Simplify promoteTempToGlobal (2 assignments vs WeakMap creation+iteration)
Eliminates ~38 WeakMap operations per effect lifecycle.
Baseline: 1523.03ms
After: 1427.66ms
Delta: -6.3%
Scenario: state+derive+2effects
* fix(core): enable LTS test compilation and fix pre-hook naming
- Include tests in tsconfig.lts.json so dist/tests/ gets compiled
- Fix npm pre-hooks: pretest:lts:20 and pretest:lts:22 (pretest:lts
only fires before a script named test:lts, not test:lts:20)
- Add type assertions for ComputedValue.value in 5 test files to
satisfy strict null checks under tsc compilation
* refactor(core): remove unused MAX_BATCH_DEPTH constant
* perf(core): optimize batch path and add subscriber-less early exit
Skip dirtyTargets bookkeeping in handleBatchFastPath when target has no
subscribers. Inline getArrayLengthBeforeMutation to eliminate function
call overhead for non-array targets. Add specialized lean get/set
handlers for the common no-hooks path, avoiding unnecessary function
calls per property access.
* style(core): format lean get handler condition
* perf(core): restore and enhance epoch-2 benchmark suite
Add 9 targeted benchmarks measuring isolated hot-path operations:
state creation, read, write with subscribers, effect triggers,
many dependencies, derive chains, and batch comparisons.
* perf(core): add heap memory reporting to benchmark and enable GC
Add forceGC + heap delta measurement to runBench so epoch-2 benchmarks
report memory pressure identical to trunk. Pass --expose-gc in npm
script. Remove unused bun from mise.toml.
* perf(core): add multi-cycle benchmark with aggregated results
Run N complete cycles (default 10, -R flag to override) to reduce
run-to-run variance. Aggregates all samples before computing stats.
* perf(core): optimize flush pipeline with single-effect fast path
- addPendingEffect: replace .has()+.add() with .add()+size check
- scheduleSubscriberWithProp: cache __hooks lookup, skip callHookSafe when no hooks
- runPendingEffectBatch: fast path for single pending effect (skip array copy)
* perf(core): optimize batch path with Array.isArray removal and hookless fast path
- Remove Array.isArray + length tracking from handleBatchFastPath hot loop
- Move array length notification to flushDirtyTargets (once per target, not per write)
- Add batch() fast path when no hooks passed (skip composeHook/callHookSafe)
* perf(effect): add readList fast path for stable dependency re-runs
On effect re-run, capture the ordered sequence of (target, prop) reads
into a flat array (__readList). On subsequent re-runs, compare reads
by index instead of rebuilding Map/Set temp collections and iterating
to compare. When all reads match — zero allocations, zero collection
operations, just pointer comparisons.
If a mismatch is detected mid-run (deps changed), bail: replay matched
reads into temp collections, continue with standard tracking, and
invalidate the readList for rebuild on next stable re-run.
100 states individual: 4,445ms → 1,150ms (-74%)
state + derive + 2 effects: 30,956ms → 20,112ms (-35%)
state write 100 subs: 7,468ms → 4,361ms (-42%)
Full suite total: 67.3s → 43.1s (-36%)
* perf(core): inline no-subscriber write path in set handler
* perf(core): shared singleton handler for hookless states
* test(state): add property-based tests for reactive array mutations
Adds fast-check (v4.5.3) and implements model-based property tests that
verify reactive arrays behave identically to plain Arrays under arbitrary
mutation sequences (push, pop, shift, unshift, splice, sort, reverse).
Three properties tested (300 runs each):
- Content equivalence after arbitrary mutation sequences
- Return value equivalence for value-returning methods
- Batch deduplication (at most 1 effect per batch)
Includes PROPERTY_BASED_TESTING.md documenting 10 PBT opportunities.
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(state): add property-based tests for same-value optimization
Verifies Object.is semantics across the full primitive type space using
fast-check with weighted arbitraries that bias toward edge cases (NaN,
-0, +0, Infinity, null, undefined).
Five properties tested:
- Same value write never triggers effects
- Effect fires iff Object.is(old, new) is false
- N repeated same-value writes produce 0 triggers
- Same-value writes inside batch produce 0 triggers
- Derive skips downstream notification when output is unchanged
Updates PROPERTY_BASED_TESTING.md to mark #1 and #2 as done.
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(batch): add property-based tests for batch effect deduplication
Verifies batch deduplication invariants under arbitrary write sequences
using fast-check: single-property writes, multi-property writes on one
state, multi-state updates, and nested batch depth.
Four properties tested (300 runs each):
- Single-property: at most 1 effect per batch + correct final value
- Multi-property: at most 1 effect + correct final value per key
- Multi-state: at most 1 effect when updating N states in a batch
- Nested batches: effects run 0 times mid-batch, exactly 1 after
Updates PROPERTY_BASED_TESTING.md to mark #3 as done.
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(derive): add property-based tests for derive consistency
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(state): add property-based tests for proxy identity invariants
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(effect): add property-based tests for cleanup completeness
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(effect): add property-based tests for infinite loop detection boundary
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(state): add property-based tests for deep reactivity at arbitrary depths
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(batch): add property-based tests for batch error recovery
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(effect): add property-based tests for dynamic dependency tracking
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(state): add property-based tests for frozen/sealed object reactivity
Verify WeakMap fallback paths (proxyCacheSubs, frozenMethodCache) used
when Object.isExtensible(target) is false. Tests cover proxy identity,
read tracking, cross-effect write notifications, disposal cleanup,
direct value writes, and sealed array method caching.
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* test(state): add real-use-case PBT for frozen children of reactive state
Add 7 properties modeling the actual usage pattern: frozen/sealed objects
as children of extensible parents that get replaced, not mutated. Tests
cover child replacement triggering effects, read-through correctness,
proxy identity stability, derive tracking, batch deduplication, primitive
property readability, and same-reference no-op via Object.is.
https://claude.ai/code/session_0159wAJYHfr72KhPx4kxNu86
* docs(readme): tighten prose — cut filler, fix passive voice, remove duplication
Apply Strunk's rules across both READMEs: omit needless words,
use active voice, prefer specific language over vague puffery.
Remove duplicate Architecture subsections already covered under
Advanced Features. Fix factually wrong browser FAQ.
* docs(core): tighten prose in TECHNICAL_DETAILS, DEVELOPER_GUIDE, CONTRIBUTING
* chore(core): add esbuild, tighten cognitive complexity limit
Add esbuild as dev dependency for tree-shaking verification and
potential uglify-js replacement. Lower Biome maxAllowedComplexity
from 20 to 10.
* fix(core): narrow handler factory return types for exactOptionalPropertyTypes
Wrap return types with NonNullable<> on all five Proxy handler
factories. They always return a function, never undefined — the
previous ProxyHandler indexed-access return type was overly
permissive and broke under exactOptionalPropertyTypes.
* fix(test): add noUncheckedIndexedAccess narrowing to property-based tests
Add type guards for array index access across five PBT files.
tsconfig.lts.json enables noUncheckedIndexedAccess, so arr[i]
returns T | undefined. Each fix extracts the access into a local
variable and narrows with an if-throw guard.
* chore(core): replace uglify-js with esbuild, fix biome scripts
Replace uglify-js with esbuild for postbuild minification. Fix
check:fix to run biome check (not biome format). Tighten cognitive
complexity threshold from 15 to 10.
* chore(core): bump all devDependencies, drop Node 20 scripts and engine
* chore(core): remove TS6-defaulted options from tsconfig.json
* chore(core): remove TS6-defaulted options, target ES2023 for Node 22+
* chore(core): update Biome schema to 2.4.7, fix compatibility
* chore(core): drop Node 20 from CI matrix, keep Node 22 + 24
* chore(core): whitelist handbook files in gitignore
* chore(core): scaffold SvelteKit handbook project
* chore(core): configure static adapter for GitHub Pages
* chore(core): add Tailwind 4 with Beacon design tokens
* chore(core): add self-hosted Merriweather, Merriweather Sans, and Commit Mono fonts
* chore(core): add mdsvex with custom Shiki Beacon theme
* feat(core): add handbook navigation structure
* feat(core): add Sidebar and NavLink components
* feat(core): add TOC component with intersection observer
* feat(core): add copy-code utility for code block copy buttons
* feat(core): wire up three-column layout with DocLayout, Sidebar, and TOC
* feat(core): add hero landing page and 404 error page
* feat(core): add cache-first service worker for offline support
* fix(core): add prerender handleHttpError warn for pending content pages
* docs(core): add Getting Started pages — introduction, installation, quick start
* docs(core): add guide pages — state, effects, derive, batch
* docs(core): add hooks pages — overview, API reference, catalog
* docs(core): add advanced pages — architecture, debugging, performance
* docs(core): add migration guide and links page
* style(core): handbook design polish — typography, code theme, responsive layout, animations
* style(core): responsive grid layout, animated header border, clean up comments
* fix(core): make sidebar backdrop focusable with proper dialog semantics
* chore(core): fix biome errors, exclude generated files, sort keys
* style(core): format svelte and vite config with biome
* fix(core): exclude handbook from root tsconfig to prevent CI build failure
* fix(core): fix exports condition ordering, disable biome key sorting for package.json
* fix(core): remove dead top-level types condition from exports
* feat(core): add handbook versions config
* feat(core): add versioned routing, move all content under /v2000/
* feat(core): add version selector component to header
* docs(core): merge DEVELOPER_GUIDE into CONTRIBUTING
* fix(core): prevent scrollbar layout shift with scrollbar-gutter
* fix(core): normalize heading hierarchy — remove duplicate h1, add prose h1 style
* docs(core): remove migrated source docs — content lives in handbook now
* docs(core): restore HOOKS_CATALOG.md — roadmap, not migrated content
* fix(core): fact-check hooks content — document only shipped hooks
* fix(core): replace hallucinated perf numbers with real benchmark data
* fix(core): clean up landing page and resources page
* docs(core): point READMEs to handbook for documentation
* chore(core): add GitHub Pages deploy workflow for handbook
* style(core): fix biome formatting in versions config
* docs(core): update references to deleted docs — point to handbook
* docs(core): sync AGENTS.md files with CLAUDE.md updates
* fix(core): content fixes — $ prefix, badges, remove stale sections, fact-check
* fix(core): update upload-pages-artifact to v4.0.0 for SHA-pinned transitive deps
* refactor(core): simplify index.ts — remove dead code, deduplicate, fix type safety
- Remove dead `if (silent)` branch in recordEffectRead (unreachable after early return)
- Remove CONFIG wrapper, inline MUTATING_ARRAY_METHODS array directly into Set
- Replace inline try-catch in addPendingEffect with callHookSafe for consistency
- Deduplicate hookless get handler — delegate to getWrappedArrayMethod instead of pre-checking
- Fix disposeChildEffects — snapshot children before iterating to avoid mutation-during-iteration
- Add onDependencyChange to EffectHooks in types.ts, remove unsafe type cast in effect()/derive()
- Deduplicate cleanupEffect — delegate subscriber removal to removeEffectFromSubscribers
- Replace tempDepsMatchPrev with existing depsMatch (identical semantics)
- Delete broken scripts/memory-benchmark.ts (uses removed epoch-1 API)
- Update performance page with fresh benchmark numbers
* perf(core): inline currentEffect check before trackDependency in hooked handler
* test(core): add disjoint-property subscriber benchmark
Adds '100 subs disjoint props' benchmark: 100 effects on 1 state object,
each reading a different property. Measures notification pipeline efficiency
when only 1 of N subscribers cares about the changed property.
* docs(core): update performance page with post-optimization benchmark numbers
* fix(assets): add tabindex to dialog element for a11y focus support
* chore(core): add jsr.json for JSR registry publishing
* chore(core): add version change detection and sync check scripts for CI
* feat(core): add JSR publishing and version-change gating to CI workflow
* chore(core): add jsr as pinned devDependency for version-controlled publishing
* style(core): fix jsr.json key ordering per Biome useSortedKeys
* chore(assets): pin handbook dependencies to exact versions, add save-exact to .npmrc
* chore(core): remove stale planning docs
* docs(core): sync AGENTS.md files with epoch-2 changes
* feat(core): add JSR references across README, handbook, and landing page
* feat(core): add Bun and Deno runtime compatibility testing to CI
Local validation results:
- Node 25.8.1: 193/193 tests pass
- Bun 1.3.10: 192/193 tests pass (deepStrictEqual compat difference)
- Deno 2.7.5: 185/193 tests pass (afterEach not implemented in node:test compat)
CI jobs run with continue-on-error: true (informational, not gating).
* docs(core): add Bun and Deno runtime badges to READMEs and landing page
* docs(core): add all verified package manager install commands to handbook
* docs(core): add all package manager install commands to READMEs
* docs(assets): add package manager badges to handbook landing page
* fix(core): fix Bun and Deno CI test commands
- Bun: use ./tests/ path prefix (bun test treats bare globs as filters)
- Deno: run deno install before tests to resolve npm dependencies
* fix(core): use directory path for bun test (globs are treated as filters)
* fix(core): add bun install step before bun test in CI
* docs(core): clarify Bun and Deno runtime caveats in handbook
* style(assets): tighten landing page spacing, use flat-square badges, fix small screen overflow
* fix(assets): restore pointer cursor on interactive elements
* fix(assets): always show npm and jsr links in header on all screen sizes
* refactor(assets): migrate from deprecated $app/stores to $app/state
* refactor(assets): migrate from deprecated base to resolve() and asset() from $app/paths
* refactor(core): move Bun and Deno tests to separate manual-trigger workflow
* style(assets): add custom scrollbar styling, fix resolve() type errors, simplify handbook internals
- Add thin, transparent-track scrollbars with progressive enhancement
(@supports scrollbar-color for Firefox/Chrome/Safari, webkit fallback)
- Use --color-text-muted for thumb contrast (~4.5:1 vs background)
- Hide TOC scrollbar to eliminate double-scrollbar on long pages
- Add resolveHref() wrapper to fix 9 svelte-check type errors from
SvelteKit's typed resolve() rejecting dynamic strings
- Hoist static allPages to navigation module (avoid per-mount allocation)
- Guard sidebar close effect to skip no-op writes
* perf(core): fix stale rerun state on error, inline hot-path guard, update benchmarks
- Fix bug: add clearRerunState() to error path in runEffectSafely —
previously, if an effect threw during re-run, the 6 module-level
rerun tracking variables retained stale data
- Extract resetEffectTracking() from cleanupEffect/cleanupEffectOnError
to prevent field-reset drift
- Add currentEffect guard in hookless get handler — eliminates a
function call on every property read outside effects (~6% faster)
- Eliminate spread allocation in disposeChildEffects by severing
__children before iterating
- Replace Array.from in runDeferredEffects with index-based iteration
- Update performance page with 10-cycle v1000 vs v2000 benchmarks
* fix(scripts): clarify benchmark output labels (#77)
Print per-sample mean (was computed for sd but never shown) and relabel
aggregate columns to match the summary line style: total, avg/cycle,
total mem, avg mem/cycle.
* chore(core): update CI, docs, and dependencies for epoch-2
* style(assets): fix biome lint and formatting errors
Move regex literals to top-level constants in llm-docs.ts.
Format long destructuring in navigation.ts.
* fix(assets): address CodeQL security alerts in llm-docs
Add case-insensitive flag to script block regex.
Loop script removal until stable to prevent residual tags.
* docs(core): align README badges with handbook landing page
Add JSR badge, drop Bun/Deno runtime badges, switch to flat-square
style, add package manager badges.
* docs(core): drop package manager badge row from README
* docs(core): match README badge layout to handbook landing page
Row 1: small registry badges (npm, JSR, Socket).
Row 2: large tech badges (Node.js, TypeScript, Biome, MIT).
* docs(core): match README badge layout to handbook landing page
Row 1: yarn, pnpm, jsr, vlt, npm version, Socket (flat-square).
Row 2: Node.js, TypeScript, Biome, MIT (for-the-badge).
* fix(assets): handle whitespace in script closing tags
Allow optional whitespace before > in </script> to satisfy
CodeQL js/bad-tag-filter rule.
* fix(assets): handle attributes in script closing tags
Allow arbitrary content between </script and > to match malformed
closing tags like </script\t\n bar>.
nerdalytics
added a commit
that referenced
this pull request
Apr 20, 2026
Upstream v1 retagged to 3c702505 (fix PR #3 removing template syntax from input descriptions that blocked action-manifest loading).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.