ashlr-plugin 1.36.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +39 -0
- package/.claude-plugin/plugin.json +36 -0
- package/.codex/agents/README.md +9 -0
- package/.codex/agents/ashlr-explorer.md +36 -0
- package/.codex/agents/ashlr-worker.md +38 -0
- package/.codex-plugin/plugin.json +45 -0
- package/.mcp.json +14 -0
- package/LICENSE +21 -0
- package/README.md +311 -0
- package/agents/ashlr-code.md +69 -0
- package/agents/ashlr-explore.md +44 -0
- package/agents/ashlr-plan.md +54 -0
- package/bench/fixtures/notebook-large.ipynb +660 -0
- package/bench/fixtures/notebook-small.ipynb +39 -0
- package/bench/fixtures/tasklist-closed.json +62 -0
- package/bench/fixtures/tasklist-large-mixed.json +27 -0
- package/bench/fixtures/tasklist-sprint-open.json +79 -0
- package/bench/fixtures/websearch-bun-runtime.json +32 -0
- package/bench/fixtures/websearch-react-hooks-patterns.json +32 -0
- package/bench/fixtures/websearch-typescript-generics.json +38 -0
- package/bench/refs/node-sdk/.refrev +1 -0
- package/bench/refs/node-sdk/README.md +17 -0
- package/bench/refs/node-sdk/src/agent/agent.ts +163 -0
- package/bench/refs/node-sdk/src/agent/create-agent-ui-stream.ts +83 -0
- package/bench/refs/node-sdk/src/agent/tool-loop-agent.ts +238 -0
- package/bench/refs/node-sdk/src/embed/embed-many.ts +409 -0
- package/bench/refs/node-sdk/src/embed/embed-result.ts +50 -0
- package/bench/refs/node-sdk/src/embed/embed.ts +257 -0
- package/bench/refs/node-sdk/src/error/invalid-argument-error.ts +34 -0
- package/bench/refs/node-sdk/src/error/invalid-tool-input-error.ts +33 -0
- package/bench/refs/node-sdk/src/error/no-object-generated-error.ts +70 -0
- package/bench/refs/node-sdk/src/generate-image/generate-image-result.ts +42 -0
- package/bench/refs/node-sdk/src/generate-image/generate-image.ts +362 -0
- package/bench/refs/node-sdk/src/generate-object/generate-object-result.ts +67 -0
- package/bench/refs/node-sdk/src/generate-object/generate-object.ts +501 -0
- package/bench/refs/node-sdk/src/generate-object/inject-json-instruction.ts +30 -0
- package/bench/refs/node-sdk/src/generate-object/output-strategy.ts +415 -0
- package/bench/refs/node-sdk/src/generate-object/repair-text.ts +12 -0
- package/bench/refs/node-sdk/src/generate-object/stream-object.ts +960 -0
- package/bench/refs/node-sdk/src/generate-speech/generate-speech.ts +191 -0
- package/bench/refs/node-sdk/src/generate-text/generate-text.ts +1484 -0
- package/bench/refs/node-sdk/src/generate-text/stream-text.ts +2708 -0
- package/bench/refs/node-sdk/src/generate-text/tool-call.ts +59 -0
- package/bench/refs/node-sdk/src/generate-text/tool-result.ts +36 -0
- package/bench/refs/node-sdk/src/telemetry/create-telemetry-dispatcher.ts +146 -0
- package/bench/refs/node-sdk/src/telemetry/telemetry-registry.ts +15 -0
- package/bench/refs/node-sdk/src/telemetry/telemetry.ts +223 -0
- package/bench/refs/node-sdk/src/util/async-iterable-stream.ts +94 -0
- package/bench/refs/node-sdk/src/util/consume-stream.ts +31 -0
- package/bench/refs/node-sdk/src/util/create-stitchable-stream.ts +112 -0
- package/bench/refs/node-sdk/src/util/download/download.ts +74 -0
- package/bench/refs/node-sdk/src/util/error-handler.ts +1 -0
- package/bench/refs/node-sdk/src/util/fix-json.ts +401 -0
- package/bench/refs/node-sdk/src/util/merge-objects.ts +79 -0
- package/bench/refs/python-lib/.refrev +1 -0
- package/bench/refs/python-lib/README.md +18 -0
- package/bench/refs/python-lib/pandas/core/_numba/executor.py +249 -0
- package/bench/refs/python-lib/pandas/core/_numba/extensions.py +586 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/mean_.py +198 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/min_max_.py +178 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/sum_.py +255 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/var_.py +251 -0
- package/bench/refs/python-lib/pandas/core/accessor.py +520 -0
- package/bench/refs/python-lib/pandas/core/api.py +138 -0
- package/bench/refs/python-lib/pandas/core/array_algos/masked_accumulations.py +97 -0
- package/bench/refs/python-lib/pandas/core/array_algos/masked_reductions.py +252 -0
- package/bench/refs/python-lib/pandas/core/array_algos/putmask.py +150 -0
- package/bench/refs/python-lib/pandas/core/array_algos/quantile.py +232 -0
- package/bench/refs/python-lib/pandas/core/array_algos/replace.py +159 -0
- package/bench/refs/python-lib/pandas/core/array_algos/take.py +609 -0
- package/bench/refs/python-lib/pandas/core/arraylike.py +534 -0
- package/bench/refs/python-lib/pandas/core/arrays/_arrow_string_mixins.py +434 -0
- package/bench/refs/python-lib/pandas/core/arrays/_mixins.py +630 -0
- package/bench/refs/python-lib/pandas/core/arrays/_ranges.py +276 -0
- package/bench/refs/python-lib/pandas/core/arrays/_utils.py +77 -0
- package/bench/refs/python-lib/pandas/core/arrays/arrow/accessors.py +521 -0
- package/bench/refs/python-lib/pandas/core/arrays/arrow/extension_types.py +174 -0
- package/bench/refs/python-lib/pandas/core/arrays/boolean.py +454 -0
- package/bench/refs/python-lib/pandas/core/arrays/floating.py +192 -0
- package/bench/refs/python-lib/pandas/core/arrays/integer.py +296 -0
- package/bench/refs/python-lib/pandas/core/arrays/masked.py +2140 -0
- package/bench/refs/python-lib/pandas/core/arrays/numeric.py +305 -0
- package/bench/refs/python-lib/pandas/core/arrays/numpy_.py +701 -0
- package/bench/refs/python-lib/pandas/core/arrays/period.py +1586 -0
- package/bench/refs/python-lib/pandas/core/arrays/sparse/accessor.py +505 -0
- package/bench/refs/python-lib/pandas/core/arrays/sparse/scipy_sparse.py +208 -0
- package/bench/refs/rust-project/.refrev +1 -0
- package/bench/refs/rust-project/README.md +17 -0
- package/bench/refs/rust-project/tokio/src/doc/os.rs +68 -0
- package/bench/refs/rust-project/tokio/src/fs/dir_builder.rs +129 -0
- package/bench/refs/rust-project/tokio/src/fs/file.rs +1113 -0
- package/bench/refs/rust-project/tokio/src/fs/mocks.rs +176 -0
- package/bench/refs/rust-project/tokio/src/fs/mod.rs +324 -0
- package/bench/refs/rust-project/tokio/src/fs/open_options.rs +856 -0
- package/bench/refs/rust-project/tokio/src/fs/read.rs +80 -0
- package/bench/refs/rust-project/tokio/src/fs/read_dir.rs +357 -0
- package/bench/refs/rust-project/tokio/src/fs/write.rs +99 -0
- package/bench/refs/rust-project/tokio/src/future/maybe_done.rs +123 -0
- package/bench/refs/rust-project/tokio/src/future/try_join.rs +82 -0
- package/bench/refs/rust-project/tokio/src/io/async_buf_read.rs +117 -0
- package/bench/refs/rust-project/tokio/src/io/async_read.rs +133 -0
- package/bench/refs/rust-project/tokio/src/io/async_seek.rs +96 -0
- package/bench/refs/rust-project/tokio/src/io/async_write.rs +402 -0
- package/bench/refs/rust-project/tokio/src/io/blocking.rs +339 -0
- package/bench/refs/rust-project/tokio/src/io/interest.rs +345 -0
- package/bench/refs/rust-project/tokio/src/io/join.rs +130 -0
- package/bench/refs/rust-project/tokio/src/io/mod.rs +308 -0
- package/bench/refs/rust-project/tokio/src/io/poll_evented.rs +319 -0
- package/bench/refs/rust-project/tokio/src/io/read_buf.rs +344 -0
- package/bench/refs/rust-project/tokio/src/io/ready.rs +322 -0
- package/bench/refs/rust-project/tokio/src/io/split.rs +166 -0
- package/bench/refs/rust-project/tokio/src/io/stderr.rs +148 -0
- package/bench/refs/rust-project/tokio/src/io/stdin.rs +98 -0
- package/bench/refs/rust-project/tokio/src/io/stdio_common.rs +222 -0
- package/bench/refs/rust-project/tokio/src/io/stdout.rs +197 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_reader.rs +311 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_stream.rs +207 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_writer.rs +310 -0
- package/bench/refs/rust-project/tokio/src/io/util/chain.rs +144 -0
- package/commands/_spawn-patterns.json +32 -0
- package/commands/ashlr-allow.md +21 -0
- package/commands/ashlr-benchmark.md +53 -0
- package/commands/ashlr-brief.md +97 -0
- package/commands/ashlr-budget.md +76 -0
- package/commands/ashlr-compact.md +54 -0
- package/commands/ashlr-dashboard.md +37 -0
- package/commands/ashlr-doctor.md +56 -0
- package/commands/ashlr-eco-mode.md +92 -0
- package/commands/ashlr-genome-init.md +24 -0
- package/commands/ashlr-genome-keygen.md +36 -0
- package/commands/ashlr-genome-loop.md +118 -0
- package/commands/ashlr-genome-push.md +36 -0
- package/commands/ashlr-genome-rewrap.md +48 -0
- package/commands/ashlr-genome-team-init.md +67 -0
- package/commands/ashlr-handoff.md +23 -0
- package/commands/ashlr-help.md +86 -0
- package/commands/ashlr-hook-timings.md +30 -0
- package/commands/ashlr-leaderboard.md +50 -0
- package/commands/ashlr-ollama-setup.md +39 -0
- package/commands/ashlr-orchestrate-status.md +72 -0
- package/commands/ashlr-orchestrate.md +83 -0
- package/commands/ashlr-parallelize.md +63 -0
- package/commands/ashlr-report-crash.md +33 -0
- package/commands/ashlr-resume.md +72 -0
- package/commands/ashlr-savings.md +24 -0
- package/commands/ashlr-settings.md +50 -0
- package/commands/ashlr-spawn.md +61 -0
- package/commands/ashlr-start.md +60 -0
- package/commands/ashlr-status.md +64 -0
- package/commands/ashlr-team-invite.md +47 -0
- package/commands/ashlr-tier.md +122 -0
- package/commands/ashlr-tour.md +60 -0
- package/commands/ashlr-update.md +155 -0
- package/commands/ashlr-upgrade.md +96 -0
- package/commands/goal.md +58 -0
- package/commands/loop.md +40 -0
- package/docs/CNAME +1 -0
- package/docs/PRO_TIER.md +104 -0
- package/docs/README.md +21 -0
- package/docs/architecture.md +415 -0
- package/docs/ashlr-pipe.md +161 -0
- package/docs/assets/logo.svg +19 -0
- package/docs/assets/og.png +0 -0
- package/docs/assets/og.svg +41 -0
- package/docs/benchmarks-v2.json +355 -0
- package/docs/benchmarks.json +102 -0
- package/docs/benchmarks.md +211 -0
- package/docs/billing.md +185 -0
- package/docs/cloud-genome.md +155 -0
- package/docs/competitive-wozcode.md +92 -0
- package/docs/deploy.md +325 -0
- package/docs/email-templates.md +113 -0
- package/docs/embed-tuning.md +103 -0
- package/docs/genome.md +120 -0
- package/docs/github-oauth-onboarding.md +127 -0
- package/docs/hero-video-script.md +129 -0
- package/docs/index.html +2262 -0
- package/docs/install-prompt.md +78 -0
- package/docs/install-windows.md +132 -0
- package/docs/install.ps1 +171 -0
- package/docs/install.sh +146 -0
- package/docs/launch/README.md +114 -0
- package/docs/launch/hn.md +49 -0
- package/docs/launch/reddit.md +45 -0
- package/docs/launch/x.md +65 -0
- package/docs/launch-post.md +112 -0
- package/docs/legal.md +78 -0
- package/docs/llm-providers.md +99 -0
- package/docs/multi-host-mcp.md +217 -0
- package/docs/multi-turn-architecture.md +108 -0
- package/docs/operations/deployment.md +108 -0
- package/docs/operations/error-monitoring.md +70 -0
- package/docs/operations/weekly-digest.md +70 -0
- package/docs/operations.md +494 -0
- package/docs/platform-support.md +133 -0
- package/docs/policy-packs.md +188 -0
- package/docs/press-kit/fact-sheet.md +78 -0
- package/docs/press-kit/founder-bio.md +3 -0
- package/docs/press-kit/logo.svg +33 -0
- package/docs/press-kit/screenshots.md +146 -0
- package/docs/pricing.md +251 -0
- package/docs/pro-backend-architecture.md +523 -0
- package/docs/producthunt.md +52 -0
- package/docs/router-migration.md +110 -0
- package/docs/session-log-schema.md +68 -0
- package/docs/social.md +95 -0
- package/docs/team-genome.md +528 -0
- package/docs/telemetry.md +194 -0
- package/docs/test-isolation.md +100 -0
- package/docs/upgrade.md +159 -0
- package/hooks/_hook-errors.ts +87 -0
- package/hooks/_hook-perf-emit.ts +113 -0
- package/hooks/_hook-timing-ledger.ts +1133 -0
- package/hooks/_nudge-throttle.ts +127 -0
- package/hooks/_recent-blocks.ts +127 -0
- package/hooks/audit-upload.ts +86 -0
- package/hooks/codex-hooks.json +171 -0
- package/hooks/commit-attribution.ts +179 -0
- package/hooks/edit-batching-nudge.ts +154 -0
- package/hooks/genome-scribe-hook.ts +219 -0
- package/hooks/hooks.json +294 -0
- package/hooks/orient-nudge-hook.ts +242 -0
- package/hooks/policy-enforce.ts +214 -0
- package/hooks/post-tool-use-embedding.ts +93 -0
- package/hooks/post-tool-use-genome.sh +37 -0
- package/hooks/post-tool-use-genome.ts +69 -0
- package/hooks/posttooluse-correlate.ts +122 -0
- package/hooks/posttooluse-dedupe-output.ts +241 -0
- package/hooks/posttooluse-genome-refresh.ts +223 -0
- package/hooks/posttooluse-native-nudge.ts +205 -0
- package/hooks/posttooluse-stale-result.ts +277 -0
- package/hooks/pretooluse-bash.ts +63 -0
- package/hooks/pretooluse-budget-guard.ts +318 -0
- package/hooks/pretooluse-common.ts +985 -0
- package/hooks/pretooluse-eco-router.ts +196 -0
- package/hooks/pretooluse-edit.sh +93 -0
- package/hooks/pretooluse-edit.ts +197 -0
- package/hooks/pretooluse-glob.ts +70 -0
- package/hooks/pretooluse-grep.sh +85 -0
- package/hooks/pretooluse-grep.ts +96 -0
- package/hooks/pretooluse-notebookedit.ts +121 -0
- package/hooks/pretooluse-read.sh +118 -0
- package/hooks/pretooluse-read.ts +118 -0
- package/hooks/pretooluse-task.ts +130 -0
- package/hooks/pretooluse-webfetch.ts +66 -0
- package/hooks/pretooluse-websearch.ts +85 -0
- package/hooks/pretooluse-write.ts +128 -0
- package/hooks/pulse-emit.ts +197 -0
- package/hooks/session-end-consolidate.sh +35 -0
- package/hooks/session-end-consolidate.ts +188 -0
- package/hooks/session-end-stats-gc.ts +80 -0
- package/hooks/session-log-append.sh +94 -0
- package/hooks/session-log-append.ts +116 -0
- package/hooks/session-start.ts +993 -0
- package/hooks/sessionend-hook-health-nudge.ts +451 -0
- package/hooks/sessionend-savings-nudge.ts +318 -0
- package/hooks/sessionend-status-line-nudge.ts +296 -0
- package/hooks/sessionstart-brief.ts +140 -0
- package/hooks/sessionstart-cost-refactor.ts +95 -0
- package/hooks/sessionstart-efficient.ts +110 -0
- package/hooks/sessionstart-genome-author.ts +93 -0
- package/hooks/sessionstart-lean-tools.ts +98 -0
- package/hooks/sessionstart-search.ts +97 -0
- package/hooks/stop-accounting.ts +152 -0
- package/hooks/subagent-stop-rollup.ts +162 -0
- package/hooks/userpromptsubmit-brief-trigger.ts +156 -0
- package/package.json +56 -0
- package/ports/README.md +108 -0
- package/ports/cursor/mcp.json +11 -0
- package/ports/goose/recipe.yaml +26 -0
- package/scripts/ashlr-mcp.ts +40 -0
- package/scripts/auto-update.ts +177 -0
- package/scripts/baseline-scan.ts +831 -0
- package/scripts/bench-orchestrate.ts +377 -0
- package/scripts/benchmark-refs.ts +292 -0
- package/scripts/bootstrap.mjs +100 -0
- package/scripts/brief-eval.ts +234 -0
- package/scripts/bump-version.ts +82 -0
- package/scripts/bun-resolve.d.mts +11 -0
- package/scripts/bun-resolve.mjs +59 -0
- package/scripts/calibrate-grep.ts +467 -0
- package/scripts/capture-grep-workload.ts +260 -0
- package/scripts/check-tier.ts +61 -0
- package/scripts/check-version-sync.ts +97 -0
- package/scripts/cli-orchestrate-status.ts +386 -0
- package/scripts/cli-orchestrate.ts +303 -0
- package/scripts/cli.ts +478 -0
- package/scripts/cloud-smoke-test.ts +313 -0
- package/scripts/coach-report.ts +373 -0
- package/scripts/context-db-migrate.ts +137 -0
- package/scripts/context-status.ts +43 -0
- package/scripts/demo-run.ts +255 -0
- package/scripts/deploy-smoke.sh +140 -0
- package/scripts/doctor.ts +992 -0
- package/scripts/embed-file-worker.ts +104 -0
- package/scripts/embed-tune.ts +308 -0
- package/scripts/errors-report.ts +428 -0
- package/scripts/find-test-leak.ts +69 -0
- package/scripts/generate-badge.ts +357 -0
- package/scripts/genome-auto-consolidate.ts +533 -0
- package/scripts/genome-auto-propose.ts +578 -0
- package/scripts/genome-cloud-pull.ts +363 -0
- package/scripts/genome-cloud-push.ts +382 -0
- package/scripts/genome-cloud-sync.ts +587 -0
- package/scripts/genome-commit-watcher.ts +295 -0
- package/scripts/genome-init.ts +986 -0
- package/scripts/genome-key.ts +233 -0
- package/scripts/genome-keygen.ts +168 -0
- package/scripts/genome-link.ts +59 -0
- package/scripts/genome-refresh-worker.ts +364 -0
- package/scripts/genome-rewrap.ts +90 -0
- package/scripts/genome-synthesizer.ts +679 -0
- package/scripts/genome-team-init.ts +312 -0
- package/scripts/handoff-pack.ts +438 -0
- package/scripts/hook-bootstrap.mjs +75 -0
- package/scripts/hook-timing-reader.ts +371 -0
- package/scripts/hook-timings-report.ts +554 -0
- package/scripts/install-genome-hooks.ts +196 -0
- package/scripts/install-onnx-model.ts +154 -0
- package/scripts/install-permissions.ts +276 -0
- package/scripts/install-status-line.ts +150 -0
- package/scripts/mcp-entrypoint.sh +78 -0
- package/scripts/mcp-entrypoint.ts +130 -0
- package/scripts/mdx-angle-bracket-lint.ts +152 -0
- package/scripts/measure-cold-start.ts +126 -0
- package/scripts/migrate-stats-to-sqlite.ts +86 -0
- package/scripts/ollama-setup.ts +498 -0
- package/scripts/onboarding-wizard.ts +1691 -0
- package/scripts/orchestrate-emit-telemetry.ts +177 -0
- package/scripts/orchestrate-expand.ts +517 -0
- package/scripts/orchestrate-run.ts +744 -0
- package/scripts/print-legend.ts +50 -0
- package/scripts/product-metadata.ts +38 -0
- package/scripts/prune-old-memories.ts +208 -0
- package/scripts/publish.sh +88 -0
- package/scripts/read-calibration.ts +122 -0
- package/scripts/report-crash.ts +226 -0
- package/scripts/run-benchmark.ts +750 -0
- package/scripts/run-root-tests.ts +28 -0
- package/scripts/savings-dashboard.ts +1258 -0
- package/scripts/savings-report-extras.ts +447 -0
- package/scripts/savings-status-line.ts +873 -0
- package/scripts/session-event-emit.ts +266 -0
- package/scripts/session-greet.ts +686 -0
- package/scripts/session-log-report.ts +551 -0
- package/scripts/session-resume.ts +614 -0
- package/scripts/set-hook-mode.ts +83 -0
- package/scripts/smoke-cross-platform.ts +117 -0
- package/scripts/smoke-realtime.ts +257 -0
- package/scripts/smoke-tools.ts +21 -0
- package/scripts/stats-cloud-pull.ts +213 -0
- package/scripts/stats-cloud-sync.ts +261 -0
- package/scripts/telemetry-flush.ts +160 -0
- package/scripts/telemetry-status.ts +266 -0
- package/scripts/timing-budget.ts +35 -0
- package/scripts/ui-animation.ts +120 -0
- package/scripts/ui.ts +431 -0
- package/scripts/upgrade-flow.ts +775 -0
- package/scripts/weekly-digest.ts +394 -0
- package/servers/_accounting.ts +78 -0
- package/servers/_ask-router.ts +84 -0
- package/servers/_ast-chunker.ts +434 -0
- package/servers/_ast-helpers.ts +183 -0
- package/servers/_ast-languages.ts +153 -0
- package/servers/_ast-refactor/_shared.ts +221 -0
- package/servers/_ast-refactor/cross-file-rename.ts +560 -0
- package/servers/_ast-refactor/extract-function.ts +357 -0
- package/servers/_ast-refactor/file-local-rename.ts +172 -0
- package/servers/_ast-refactor.ts +41 -0
- package/servers/_ast-skeleton.ts +107 -0
- package/servers/_bash-summarizers-registry.ts +1096 -0
- package/servers/_crash-dump.ts +210 -0
- package/servers/_cwd-clamp.ts +342 -0
- package/servers/_edit-log.ts +28 -0
- package/servers/_edit-match.ts +236 -0
- package/servers/_edit-validate.ts +196 -0
- package/servers/_embed-calibration.ts +123 -0
- package/servers/_embedding-cache.ts +401 -0
- package/servers/_embedding-model.ts +329 -0
- package/servers/_events.ts +113 -0
- package/servers/_genome-cache.ts +154 -0
- package/servers/_genome-commits.ts +172 -0
- package/servers/_genome-crypto-v2.ts +242 -0
- package/servers/_genome-crypto.ts +259 -0
- package/servers/_genome-discoveries.ts +140 -0
- package/servers/_genome-embed-populator.ts +216 -0
- package/servers/_genome-freshness.ts +134 -0
- package/servers/_genome-issues.ts +171 -0
- package/servers/_genome-live.ts +263 -0
- package/servers/_genome-prs.ts +188 -0
- package/servers/_genome-search.ts +479 -0
- package/servers/_genome-sync.ts +297 -0
- package/servers/_history-tracker.ts +279 -0
- package/servers/_http-helpers.ts +151 -0
- package/servers/_identity-hash.ts +151 -0
- package/servers/_llm-providers/anthropic.ts +132 -0
- package/servers/_llm-providers/cloud.ts +195 -0
- package/servers/_llm-providers/index.ts +350 -0
- package/servers/_llm-providers/local.ts +127 -0
- package/servers/_llm-providers/onnx.ts +393 -0
- package/servers/_llm-providers/types.ts +27 -0
- package/servers/_manifest-v2.ts +447 -0
- package/servers/_mcp-host.ts +93 -0
- package/servers/_nudge-events.ts +451 -0
- package/servers/_orchestrate-executor.ts +316 -0
- package/servers/_prefetch.ts +435 -0
- package/servers/_pricing.ts +256 -0
- package/servers/_pro.ts +381 -0
- package/servers/_read-cache.ts +44 -0
- package/servers/_router-handlers.ts +46 -0
- package/servers/_router.ts +55 -0
- package/servers/_run-with-timeout.ts +173 -0
- package/servers/_savings-render.ts +214 -0
- package/servers/_stats-sqlite.ts +640 -0
- package/servers/_stats.ts +1183 -0
- package/servers/_status-line-cells.ts +469 -0
- package/servers/_streaks.ts +162 -0
- package/servers/_summarize.ts +208 -0
- package/servers/_task-graph-render.ts +217 -0
- package/servers/_task-graph.ts +545 -0
- package/servers/_telemetry.ts +719 -0
- package/servers/_test-parsers.ts +530 -0
- package/servers/_test-watch.ts +626 -0
- package/servers/_text-helpers.ts +37 -0
- package/servers/_token-measure.ts +160 -0
- package/servers/_tool-base.ts +248 -0
- package/servers/_weekly-digest.ts +391 -0
- package/servers/ask-server-handlers.ts +49 -0
- package/servers/ask-server.ts +174 -0
- package/servers/bash-server-handlers.ts +138 -0
- package/servers/bash-server.ts +1136 -0
- package/servers/bench.ts +186 -0
- package/servers/diff-semantic-server-handlers.ts +39 -0
- package/servers/diff-semantic-server.ts +566 -0
- package/servers/diff-server-handlers.ts +317 -0
- package/servers/diff-server.ts +20 -0
- package/servers/edit-server-handlers.ts +31 -0
- package/servers/edit-server.ts +209 -0
- package/servers/edit-structural-server-handlers.ts +322 -0
- package/servers/efficiency-server-handlers.ts +161 -0
- package/servers/efficiency-server.ts +1135 -0
- package/servers/flush-server-handlers.ts +21 -0
- package/servers/flush-server.ts +19 -0
- package/servers/genome-server-handlers.ts +118 -0
- package/servers/genome-server.ts +397 -0
- package/servers/github-server-handlers.ts +187 -0
- package/servers/github-server.ts +856 -0
- package/servers/glob-server-handlers.ts +233 -0
- package/servers/glob-server.ts +20 -0
- package/servers/grep-server-handlers.ts +61 -0
- package/servers/grep-server.ts +564 -0
- package/servers/http-server-handlers.ts +36 -0
- package/servers/http-server.ts +149 -0
- package/servers/logs-server-handlers.ts +42 -0
- package/servers/logs-server.ts +359 -0
- package/servers/ls-server-handlers.ts +166 -0
- package/servers/ls-server.ts +20 -0
- package/servers/multi-edit-server-handlers.ts +51 -0
- package/servers/multi-edit-server.ts +422 -0
- package/servers/notebook-edit-server-handlers.ts +34 -0
- package/servers/notebook-edit-server.ts +181 -0
- package/servers/orient-server-handlers.ts +52 -0
- package/servers/orient-server.ts +436 -0
- package/servers/pipe-server-handlers.ts +68 -0
- package/servers/pipe-server.ts +300 -0
- package/servers/read-server-handlers.ts +42 -0
- package/servers/read-server.ts +206 -0
- package/servers/rename-file-server-handlers.ts +67 -0
- package/servers/rename-file-server.ts +699 -0
- package/servers/savings-server-handlers.ts +27 -0
- package/servers/savings-server.ts +54 -0
- package/servers/search-replace-regex-server-handlers.ts +96 -0
- package/servers/search-replace-regex-server.ts +751 -0
- package/servers/sql-server-handlers.ts +58 -0
- package/servers/sql-server.ts +505 -0
- package/servers/task-server-handlers.ts +358 -0
- package/servers/task-server.ts +24 -0
- package/servers/test-server-handlers.ts +351 -0
- package/servers/test-server.ts +20 -0
- package/servers/tree-server-handlers.ts +503 -0
- package/servers/tree-server.ts +20 -0
- package/servers/webfetch-server-handlers.ts +166 -0
- package/servers/webfetch-server.ts +20 -0
- package/servers/websearch-server-handlers.ts +215 -0
- package/servers/websearch-server.ts +19 -0
- package/servers/write-server-handlers.ts +27 -0
- package/servers/write-server.ts +97 -0
- package/skills/ashlr-brief/SKILL.md +80 -0
- package/skills/ashlr-codex-doctor/SKILL.md +21 -0
- package/skills/ashlr-codex-efficient-tools/SKILL.md +17 -0
- package/skills/ashlr-codex-genome-refresh/SKILL.md +20 -0
- package/skills/ashlr-codex-parallel-explore/SKILL.md +20 -0
- package/skills/ashlr-codex-savings/SKILL.md +17 -0
- package/skills/ashlr-cost-refactor/SKILL.md +50 -0
- package/skills/ashlr-efficient/SKILL.md +64 -0
- package/skills/ashlr-genome-author/SKILL.md +43 -0
- package/skills/ashlr-lean-tools/SKILL.md +43 -0
- package/skills/ashlr-search/SKILL.md +46 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# ashlr-plugin Token-Savings Benchmarks
|
|
2
|
+
|
|
3
|
+
> **Latest run:** v1.36.0 (`docs/benchmarks-v2.json`)
|
|
4
|
+
> **Headline:** `−57%` cross-language mean on real open-source codebases
|
|
5
|
+
> (TS/vercel-ai `−62%`, Python/pandas `−65%`, Rust/tokio `−44%`)
|
|
6
|
+
>
|
|
7
|
+
> _Prior self-repo figure (`−74%`) is preserved in `docs/benchmarks-v2.json`
|
|
8
|
+
> under `aggregate.overall.mean` but is no longer the headline — it reflects
|
|
9
|
+
> the plugin's own repo which includes large generated JSON and media files._
|
|
10
|
+
|
|
11
|
+
## How the numbers are produced
|
|
12
|
+
|
|
13
|
+
`scripts/run-benchmark.ts` measures real byte/token reduction by calling the
|
|
14
|
+
handler functions directly — no MCP layer, no Claude Code in the loop. For
|
|
15
|
+
each tool, we sample representative inputs from a target repo, run them
|
|
16
|
+
through the canonical compression pipeline, and report:
|
|
17
|
+
|
|
18
|
+
- `rawBytes` / `rawTokens` — what the native tool would have shipped
|
|
19
|
+
- `ashlrBytes` / `ashlrTokens` — what the ashlr handler returned
|
|
20
|
+
- `ratio` — `ashlrBytes / rawBytes` (lower is better)
|
|
21
|
+
|
|
22
|
+
The output is a stable JSON shape (`docs/benchmarks-v2.json`) that downstream
|
|
23
|
+
tools (dashboard, README badges) can read without re-running the bench.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Run against the current repo
|
|
27
|
+
bun run scripts/run-benchmark.ts
|
|
28
|
+
|
|
29
|
+
# Run against another repo (must be a git checkout)
|
|
30
|
+
bun run scripts/run-benchmark.ts --repo /path/to/other-repo --out /tmp/other.json
|
|
31
|
+
|
|
32
|
+
# Dry-run: print results, don't write JSON
|
|
33
|
+
bun run scripts/run-benchmark.ts --dry-run
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## What the headline number actually means
|
|
37
|
+
|
|
38
|
+
`overall.mean = arithmetic mean of all sample ratios across read/grep/edit.`
|
|
39
|
+
|
|
40
|
+
This is **a specific number for a specific repo and a specific tool mix**.
|
|
41
|
+
It is NOT a marketing estimate; it is what the compression layer measured on
|
|
42
|
+
actual files. Three things shape it:
|
|
43
|
+
|
|
44
|
+
1. **File mix.** A repo full of large source files (well-suited to read
|
|
45
|
+
compression) will show higher savings than a repo full of media or
|
|
46
|
+
generated artifacts. The ashlr-plugin's own repo includes `hero.mp4`,
|
|
47
|
+
`bench/refs/`, `docs/benchmarks-v2.json` itself (large) — these drag
|
|
48
|
+
`ashlr__read` mean savings down vs a typical user codebase.
|
|
49
|
+
|
|
50
|
+
2. **Tool mix.** Read and grep typically save 80-95%. Edit savings depend on
|
|
51
|
+
*where* the edit lives:
|
|
52
|
+
- Small edits (≤ 80 chars combined old+new) skip the redirect entirely
|
|
53
|
+
in real use (Track A `ASHLR_EDIT_MIN_CHARS` guard) — but the bench
|
|
54
|
+
calls handlers directly and so reports the negative-savings the guard
|
|
55
|
+
prevents in practice. Treat the edit headline as a ceiling for
|
|
56
|
+
"redirect-eligible edits," not a typical-user number.
|
|
57
|
+
- Medium edits (20-200 LOC range) save ~50%.
|
|
58
|
+
- Large edits (> 200 LOC) save 90%+.
|
|
59
|
+
|
|
60
|
+
3. **Workload shape.** A user who reads many files but edits few will see
|
|
61
|
+
higher savings than a user who edits constantly with small touches.
|
|
62
|
+
|
|
63
|
+
## Per-tool savings (measured 2026-04-26)
|
|
64
|
+
|
|
65
|
+
| Tool | Mean savings | Notes |
|
|
66
|
+
|---------------------|--------------|-------|
|
|
67
|
+
| `ashlr__read` | **−82.1%** | snipCompact head/tail + LLM summarization for >16KB files |
|
|
68
|
+
| `ashlr__grep` | **−92.8%** | Genome-RAG when available; ripgrep-summarize fallback |
|
|
69
|
+
| `ashlr__edit` | **~0%** raw bench | But hook now skips micro-edits below `ASHLR_EDIT_MIN_CHARS=80`, so real-world is ≥0 |
|
|
70
|
+
| `ashlr__multi_edit` | not in bench | Track B baseline fix (v1.22) — was 5-10× over-credited |
|
|
71
|
+
| `ashlr__websearch` | not in bench | Estimated 60-80% (per fixture inspection) |
|
|
72
|
+
| `ashlr__task_list` | not in bench | Estimated 70-85% (per fixture inspection) |
|
|
73
|
+
| `ashlr__notebook_edit` | not in bench | Estimated 65-75% on multi-cell notebooks |
|
|
74
|
+
| `ashlr__write` | not in bench | Identical to `ashlr__edit` for existing files |
|
|
75
|
+
|
|
76
|
+
**Future work**: extend `scripts/run-benchmark.ts` to include the new tool
|
|
77
|
+
families using `bench/fixtures/{websearch,tasklist,notebook}-*.{json,ipynb}`
|
|
78
|
+
+ a curated multi-repo reference set (Node SDK, Python lib, Rust project).
|
|
79
|
+
|
|
80
|
+
## Reproducing the numbers
|
|
81
|
+
|
|
82
|
+
The bench is deterministic given a repo + commit SHA. To verify a number:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git checkout <sha> # the commit you want to reproduce
|
|
86
|
+
bun install
|
|
87
|
+
bun run scripts/run-benchmark.ts --dry-run
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The bench seeds its file sampler with the commit SHA (when run in a clean
|
|
91
|
+
checkout) so two people on the same SHA get the same sample set.
|
|
92
|
+
|
|
93
|
+
## Multi-repo reference set
|
|
94
|
+
|
|
95
|
+
### Why a multi-repo headline?
|
|
96
|
+
|
|
97
|
+
The ashlr-plugin's own repo contains `hero.mp4`, large generated JSON
|
|
98
|
+
(`docs/benchmarks-v2.json`), the `.ashlrcode/genome/` knowledge base, and
|
|
99
|
+
`site/tsconfig.tsbuildinfo`. These files make the self-repo benchmark
|
|
100
|
+
non-representative — they inflate `ashlr__read` savings beyond what a typical
|
|
101
|
+
user codebase would see.
|
|
102
|
+
|
|
103
|
+
### The three reference repos
|
|
104
|
+
|
|
105
|
+
| Key | Language | Upstream | Sampled commit | Files |
|
|
106
|
+
|-----|----------|----------|----------------|-------|
|
|
107
|
+
| `node-sdk` | TypeScript | [vercel/ai](https://github.com/vercel/ai) | `0498012` | 32 TS files from `packages/ai/src/` |
|
|
108
|
+
| `python-lib` | Python | [pandas-dev/pandas](https://github.com/pandas-dev/pandas) | `be0642f` | 30 Py files from `pandas/core/` |
|
|
109
|
+
| `rust-project` | Rust | [tokio-rs/tokio](https://github.com/tokio-rs/tokio) | `6c03e03` | 31 Rs files from `tokio/src/` |
|
|
110
|
+
|
|
111
|
+
Each ref directory lives in `bench/refs/<key>/` and is itself a git repo.
|
|
112
|
+
A `.refrev` file records the upstream commit SHA sampled from.
|
|
113
|
+
|
|
114
|
+
**Why these three?** TypeScript + Python + Rust are the top three languages in
|
|
115
|
+
the ashlr-plugin user base (based on install telemetry). Each project is a
|
|
116
|
+
well-maintained OSS library with realistic file size distributions: small
|
|
117
|
+
utilities, medium modules, and large implementation files. They collectively
|
|
118
|
+
represent agentic AI SDK code, data-science library internals, and systems
|
|
119
|
+
async runtime code — meaningfully different workloads.
|
|
120
|
+
|
|
121
|
+
### Results (measured 2026-04-26)
|
|
122
|
+
|
|
123
|
+
| Repo | Overall | Read | Grep | Edit |
|
|
124
|
+
|------|---------|------|------|------|
|
|
125
|
+
| `node-sdk` (TS) | **−61.6%** | −75.3% | −66.1% | ~0%* |
|
|
126
|
+
| `python-lib` (Py) | **−64.9%** | −78.8% | −67.9% | ~0%* |
|
|
127
|
+
| `rust-project` (Rs) | **−43.6%** | −70.0% | −17.2% | ~0%* |
|
|
128
|
+
| **Cross-language mean** | **−57%** | **−75%** | **−50%** | ~0%* |
|
|
129
|
+
|
|
130
|
+
_*Edit savings at ~0% in the bench reflects the synthetic small-edit overhead
|
|
131
|
+
(see edit caveat above). Real-world medium/large edits save 50-96%._
|
|
132
|
+
|
|
133
|
+
**Note on grep for Rust:** ripgrep patterns `import`, `TODO`, `class`, and
|
|
134
|
+
`interface` have low match rates in Rust source (Rust uses `use`, `//TODO:`,
|
|
135
|
+
struct/enum, and traits instead). This suppresses the grep headline for the
|
|
136
|
+
rust-project repo. With Rust-idiomatic patterns (`fn `, `use `, `impl `, etc.)
|
|
137
|
+
savings would be comparable to TS/Py. The bench intentionally uses
|
|
138
|
+
language-agnostic patterns to expose this; the genome-RAG path (not measured
|
|
139
|
+
here) adapts to file content automatically.
|
|
140
|
+
|
|
141
|
+
### How the aggregate is computed
|
|
142
|
+
|
|
143
|
+
`crossLanguageMean = arithmetic mean of the 3 repo overall.mean values`
|
|
144
|
+
|
|
145
|
+
The per-repo mean is itself the pooled mean across all individual read/grep/edit
|
|
146
|
+
sample ratios (same as the per-repo bench). See `scripts/benchmark-refs.ts` for
|
|
147
|
+
the exact computation.
|
|
148
|
+
|
|
149
|
+
### Running the multi-repo bench yourself
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Run all three ref repos and merge into docs/benchmarks-v2.json
|
|
153
|
+
bun run scripts/benchmark-refs.ts
|
|
154
|
+
|
|
155
|
+
# Dry run (no file write)
|
|
156
|
+
bun run scripts/benchmark-refs.ts --dry-run
|
|
157
|
+
|
|
158
|
+
# Write to a different output path
|
|
159
|
+
bun run scripts/benchmark-refs.ts --out /tmp/my-bench.json
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Extending with your own repo
|
|
163
|
+
|
|
164
|
+
You can add your own codebase to the reference set:
|
|
165
|
+
|
|
166
|
+
1. Create a directory under `bench/refs/<your-key>/` and populate it with
|
|
167
|
+
source files (must be a git checkout — `git init && git add . && git commit`).
|
|
168
|
+
2. Add a `.refrev` file with the upstream commit SHA.
|
|
169
|
+
3. Add your config to the `REFS` array in `scripts/benchmark-refs.ts`.
|
|
170
|
+
|
|
171
|
+
The bench uses `git ls-files` to enumerate tracked files, so you control
|
|
172
|
+
exactly which files are measured by what you commit to the ref repo.
|
|
173
|
+
|
|
174
|
+
## Trust pass — what `v1.22` fixed in the math
|
|
175
|
+
|
|
176
|
+
Per the v1.22 audit (`~/.claude/plans/ultrathink-deploy-agents-to-jazzy-hoare.md`),
|
|
177
|
+
four bugs distorted reported savings prior to this release:
|
|
178
|
+
|
|
179
|
+
1. **Edit micro-edit penalty.** Sub-80-char edits on >5KB files were
|
|
180
|
+
redirected through the diff round-trip and produced *negative* savings
|
|
181
|
+
(~−150% at p90 in `docs/benchmarks-v2.json`). Track A added an
|
|
182
|
+
`ASHLR_EDIT_MIN_CHARS` guard that passes those through to native Edit.
|
|
183
|
+
|
|
184
|
+
2. **Multi-edit baseline inflation.** `ashlr__multi_edit` baseline was
|
|
185
|
+
`original.length + updated.length` per file (full file twice) — the
|
|
186
|
+
pre-v1.18 formula. Track A aligned it with single-edit:
|
|
187
|
+
`Σ hunk.search.length + hunk.replace.length`. Removed 5-10× over-credit.
|
|
188
|
+
|
|
189
|
+
3. **Pricing map.** Default model was `sonnet-4.5` ($3/MTok). Track A
|
|
190
|
+
added `sonnet-4.6` ($2.5) as new default plus `opus-4.7` ($18 in / $90 out).
|
|
191
|
+
Opus users were under-priced ~2× before.
|
|
192
|
+
|
|
193
|
+
4. **`tool_noop` mislabeling.** Low-confidence paths emitted `tool_noop`
|
|
194
|
+
events even when content WAS shipped. Track A renamed to
|
|
195
|
+
`tool_low_confidence_shipped` so the savings-accounting signal is
|
|
196
|
+
accurate. `tool_noop` now reserved for actual zero-bytes-shipped no-ops.
|
|
197
|
+
|
|
198
|
+
## Telemetry that grounds the bench in real usage
|
|
199
|
+
|
|
200
|
+
v1.22 Track G adds dashboard sections that show real-world data:
|
|
201
|
+
|
|
202
|
+
- **"Where savings come from"** — per-mechanism breakdown
|
|
203
|
+
(snipCompact / LLM-anthropic / LLM-onnx / LLM-local / genome / embed-cache /
|
|
204
|
+
structured-render).
|
|
205
|
+
- **"Adoption funnel"** — blocks emitted vs blocks → ashlr-call rate (7-day
|
|
206
|
+
rolling). Run `/ashlr-dashboard` to see it.
|
|
207
|
+
- **`/ashlr-status`** — LLM provider availability + embed-cache hit rate +
|
|
208
|
+
genome fire-rate + 24h block→ashlr-call ratio.
|
|
209
|
+
|
|
210
|
+
These are the numbers worth tracking weekly. The bench is a calibration
|
|
211
|
+
tool; the telemetry is the live feedback loop.
|
package/docs/billing.md
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# ashlr billing
|
|
2
|
+
|
|
3
|
+
ashlr uses Stripe for subscription billing. This document covers the tiers,
|
|
4
|
+
the integration architecture, and what happens at each lifecycle event.
|
|
5
|
+
|
|
6
|
+
## Tiers
|
|
7
|
+
|
|
8
|
+
| Tier | Price | Features |
|
|
9
|
+
|------|-------|----------|
|
|
10
|
+
| Free | $0 | Full local plugin, 40 MCP tools, 34 slash commands, Codex workflow skills, local genome scribe loop |
|
|
11
|
+
| Pro | $12/mo or $120/yr | Everything in Free + cloud LLM summarizer, cross-machine stats sync, hosted retrieval, live auto-updating badge |
|
|
12
|
+
| Team | $24/user/mo or $240/user/yr | Everything in Pro + shared team genome sync, team dashboard, priority support (min 3 users) |
|
|
13
|
+
|
|
14
|
+
Free users who attempt to use gated endpoints receive HTTP 403 with
|
|
15
|
+
`{ "error": "This feature requires a paid plan.", "upgrade_url": "/billing/checkout" }`.
|
|
16
|
+
|
|
17
|
+
## How users get access
|
|
18
|
+
|
|
19
|
+
The fastest way to upgrade is `/ashlr-upgrade` — a terminal-native flow that
|
|
20
|
+
takes under 90 seconds without leaving Claude Code. See [upgrade.md](upgrade.md)
|
|
21
|
+
for the full walkthrough.
|
|
22
|
+
|
|
23
|
+
Users can also sign up and sign in through a passwordless magic-link flow:
|
|
24
|
+
|
|
25
|
+
1. Visit `/signin` on the site and enter an email address.
|
|
26
|
+
2. The backend creates a user record (if new) and sends a one-time link via
|
|
27
|
+
[SendGrid](https://sendgrid.com). The link is valid for 15 minutes.
|
|
28
|
+
3. Clicking the link calls `POST /auth/verify`, which issues a permanent API
|
|
29
|
+
token and stores it in the user's browser (`localStorage`). The token is
|
|
30
|
+
used as a `Bearer` credential for all subsequent API calls.
|
|
31
|
+
4. To upgrade to Pro or Team, the user visits `/pricing` and completes a
|
|
32
|
+
Stripe Checkout session. The webhook at `POST /billing/webhook` promotes the
|
|
33
|
+
user's tier in the database.
|
|
34
|
+
|
|
35
|
+
**Rate limit:** The `/auth/send` endpoint accepts at most 5 requests per email
|
|
36
|
+
address per hour. The 6th request returns HTTP 429.
|
|
37
|
+
|
|
38
|
+
**Self-serve:** There is no longer a manual CLI provisioning step for new users.
|
|
39
|
+
The `bun run src/cli/issue-token.ts <email>` CLI is retained for internal use
|
|
40
|
+
and emergency provisioning only.
|
|
41
|
+
|
|
42
|
+
## Stripe integration
|
|
43
|
+
|
|
44
|
+
### Products and prices
|
|
45
|
+
|
|
46
|
+
The `stripe-setup` CLI creates two Stripe products ("ashlr Pro" and "ashlr Team")
|
|
47
|
+
with four prices (monthly and annual for each). IDs are stored in the
|
|
48
|
+
`stripe_products` database table so the runtime never hard-codes them.
|
|
49
|
+
|
|
50
|
+
To bootstrap a new environment:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
STRIPE_SECRET_KEY=sk_live_... bun run src/cli/stripe-setup.ts
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The script is idempotent — re-running it skips any prices already in the DB.
|
|
57
|
+
|
|
58
|
+
### Checkout flow
|
|
59
|
+
|
|
60
|
+
1. Authenticated user POSTs to `POST /billing/checkout` with `{ tier, seats? }`.
|
|
61
|
+
2. Server creates a Stripe Checkout Session and returns `{ url }`.
|
|
62
|
+
3. Client redirects user to `url`.
|
|
63
|
+
4. On success, Stripe redirects to `/billing/return?session={CHECKOUT_SESSION_ID}`
|
|
64
|
+
and fires a `checkout.session.completed` webhook.
|
|
65
|
+
5. Webhook handler creates the subscription record and upgrades `users.tier`.
|
|
66
|
+
|
|
67
|
+
### Customer portal
|
|
68
|
+
|
|
69
|
+
`GET /billing/portal` creates a Stripe Customer Portal session for the
|
|
70
|
+
authenticated user. The portal lets them update their payment method, view
|
|
71
|
+
invoices, change plan, or cancel. Returns `{ url }` for a client-side redirect.
|
|
72
|
+
|
|
73
|
+
Users without a billing record receive 404.
|
|
74
|
+
|
|
75
|
+
### Subscription status
|
|
76
|
+
|
|
77
|
+
`GET /billing/status` returns:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"tier": "pro",
|
|
82
|
+
"seats": 1,
|
|
83
|
+
"renewsAt": "2026-05-17T00:00:00.000Z",
|
|
84
|
+
"cancelAt": null
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Free users with no subscription record receive `{ "tier": "free", ... }`.
|
|
89
|
+
|
|
90
|
+
## Webhook events
|
|
91
|
+
|
|
92
|
+
The webhook endpoint is `POST /billing/webhook`. Register it in the Stripe
|
|
93
|
+
dashboard pointing at `https://api.ashlr.ai/billing/webhook`.
|
|
94
|
+
|
|
95
|
+
Events handled:
|
|
96
|
+
|
|
97
|
+
| Event | Action |
|
|
98
|
+
|-------|--------|
|
|
99
|
+
| `checkout.session.completed` | Creates subscription record, sets `users.tier` to the purchased tier |
|
|
100
|
+
| `customer.subscription.updated` | Updates `current_period_end`, `seats`, and `status`; reactivates tier if status returns to `active` |
|
|
101
|
+
| `customer.subscription.deleted` | Sets subscription `status` to `canceled`, downgrades `users.tier` to `free` |
|
|
102
|
+
| `invoice.payment_failed` | Sets subscription `status` to `past_due`; tier remains for the 7-day grace period while Stripe retries |
|
|
103
|
+
|
|
104
|
+
Webhook idempotency is enforced via the `stripe_events` table. Duplicate
|
|
105
|
+
`event.id` deliveries return 200 immediately without re-processing.
|
|
106
|
+
|
|
107
|
+
All events are verified via `stripe.webhooks.constructEvent` using the
|
|
108
|
+
`STRIPE_WEBHOOK_SECRET` environment variable. Invalid signatures return 400.
|
|
109
|
+
|
|
110
|
+
## What happens on cancellation
|
|
111
|
+
|
|
112
|
+
When a user cancels, Stripe fires `customer.subscription.deleted` at the end
|
|
113
|
+
of the paid period. The webhook handler downgrades `users.tier` to `free`.
|
|
114
|
+
The subscription record is retained for auditing with `status = 'canceled'`.
|
|
115
|
+
|
|
116
|
+
Users on an annual plan who cancel mid-year retain access until the period end
|
|
117
|
+
(`current_period_end`). Refunds are handled through the Stripe dashboard.
|
|
118
|
+
|
|
119
|
+
## Dispute policy
|
|
120
|
+
|
|
121
|
+
Disputes should be handled through the Stripe dashboard. Contact
|
|
122
|
+
support@ashlr.ai for billing questions before initiating a chargeback.
|
|
123
|
+
|
|
124
|
+
## Environment variables
|
|
125
|
+
|
|
126
|
+
| Variable | Required | Description |
|
|
127
|
+
|----------|----------|-------------|
|
|
128
|
+
| `STRIPE_SECRET_KEY` | Yes (production) | Stripe secret key (`sk_live_...` or `sk_test_...`) |
|
|
129
|
+
| `STRIPE_WEBHOOK_SECRET` | Yes (production) | Signing secret from Stripe webhook dashboard (`whsec_...`) |
|
|
130
|
+
| `BASE_URL` | No | Base URL for success/return redirects (default: `https://api.ashlr.ai`) |
|
|
131
|
+
| `SITE_URL` | No | Site URL for cancel redirect (default: `https://plugin.ashlr.ai`) |
|
|
132
|
+
| `TESTING` | Tests only | Set to `1` to stub Stripe client; no real API calls are made |
|
|
133
|
+
|
|
134
|
+
## Database tables
|
|
135
|
+
|
|
136
|
+
Three tables support billing:
|
|
137
|
+
|
|
138
|
+
- **`subscriptions`** — one row per Stripe subscription; tracks tier, status,
|
|
139
|
+
seats, `current_period_end`, and `cancel_at`.
|
|
140
|
+
- **`stripe_events`** — event IDs from processed webhook deliveries; prevents
|
|
141
|
+
double-processing on Stripe retries.
|
|
142
|
+
- **`stripe_products`** — caches Stripe product and price IDs seeded by the
|
|
143
|
+
`stripe-setup` CLI; keyed by `pro`, `pro-annual`, `team`, `team-annual`.
|
|
144
|
+
|
|
145
|
+
The `users` table has a `tier` column (`free` | `pro` | `team`) that is the
|
|
146
|
+
single source of truth for access control checks at request time.
|
|
147
|
+
|
|
148
|
+
## Audit log and policy packs (team tier)
|
|
149
|
+
|
|
150
|
+
Both features require the **team** tier or higher. Free and Pro users receive
|
|
151
|
+
HTTP 403 if they attempt to call these endpoints.
|
|
152
|
+
|
|
153
|
+
### Policy packs
|
|
154
|
+
|
|
155
|
+
Team admins can upload YAML/JSON allow-deny-confirm rule sets via
|
|
156
|
+
`POST /policy/upload`. The server stores each upload as an immutable versioned
|
|
157
|
+
snapshot. Members fetch the current pack via `GET /policy/current` (cached
|
|
158
|
+
5 minutes via ETag). Admins can roll back to any prior version via
|
|
159
|
+
`POST /policy/rollback`. See `docs/policy-packs.md` for rule syntax and
|
|
160
|
+
examples.
|
|
161
|
+
|
|
162
|
+
Only users with `org_role = "admin"` can upload or roll back. Members can
|
|
163
|
+
read the current pack. Free and Pro users are rejected at the tier gate before
|
|
164
|
+
org-role checks run.
|
|
165
|
+
|
|
166
|
+
### Audit log
|
|
167
|
+
|
|
168
|
+
The `POST /audit/event` endpoint accepts tool-call events from the
|
|
169
|
+
`audit-upload` hook. Events are written to `audit_events` in an append-only
|
|
170
|
+
fashion — no updates or deletes are issued outside of explicit admin purges.
|
|
171
|
+
|
|
172
|
+
Paths and cwds in event arguments are replaced with a 16-char SHA-256
|
|
173
|
+
fingerprint before storage. File contents are never stored. This satisfies
|
|
174
|
+
GDPR path-data minimisation while preserving correlation for compliance audits.
|
|
175
|
+
|
|
176
|
+
Org admins can query events with filters (`GET /audit/events`) or export the
|
|
177
|
+
full log as NDJSON (`GET /audit/export`). Non-admin members are blocked at the
|
|
178
|
+
org-role gate with 403.
|
|
179
|
+
|
|
180
|
+
### Database tables (Phase 4)
|
|
181
|
+
|
|
182
|
+
- **`policy_packs`** — immutable versioned snapshots; unique on `(org_id, name, version)`.
|
|
183
|
+
- **`policy_current`** — one row per org; points to the active pack.
|
|
184
|
+
- **`audit_events`** — append-only event log; indexed by `(org_id, at)` and `(user_id, at)`.
|
|
185
|
+
- **`users.org_id`** / **`users.org_role`** — org membership and role columns added in Phase 4 migration.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Cloud Genome Pipeline
|
|
2
|
+
|
|
3
|
+
Architecture reference for the server-side genome build, encryption, and client pull pipeline introduced in v1.13.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
User CLI (session start)
|
|
11
|
+
│
|
|
12
|
+
│ hooks/session-start.ts
|
|
13
|
+
│ └─ scripts/genome-cloud-pull.ts
|
|
14
|
+
│ parse cwd git remote
|
|
15
|
+
│ canonicalize repo URL
|
|
16
|
+
│ GET /genome/personal/find?repo_url=<canon>
|
|
17
|
+
│ ├─ found: download sections
|
|
18
|
+
│ └─ not found: skip silently
|
|
19
|
+
│ decrypt sections (user genome key)
|
|
20
|
+
│ write to ~/.ashlr/genomes/<projectHash>/
|
|
21
|
+
│ write .ashlr-cloud-genome marker
|
|
22
|
+
│
|
|
23
|
+
▼
|
|
24
|
+
ashlr__grep retrieval chain
|
|
25
|
+
├─ 1. local .ashlrcode/genome/ (always wins if present)
|
|
26
|
+
├─ 2. ~/.ashlr/genomes/<hash>/ (cloud cache, via findParentGenome)
|
|
27
|
+
└─ 3. ripgrep full-tree fallback
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The cloud genome supplements local genomes — it never replaces them. If `.ashlrcode/genome/` exists in the project, it is used exclusively and the cloud cache is ignored for that session.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## File locations
|
|
35
|
+
|
|
36
|
+
| Path | Purpose |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `~/.ashlr/genomes/<projectHash>/` | Per-project cloud genome cache directory |
|
|
39
|
+
| `~/.ashlr/genomes/<projectHash>/.ashlr-cloud-genome` | Marker file; presence indicates a cloud genome is loaded |
|
|
40
|
+
| `~/.ashlr/genome-key` | Per-user master genome decryption key, mode `0o600`. Fetched once from `GET /user/genome-key` and cached locally. |
|
|
41
|
+
| `~/.ashlr/genome-cloud-pull.log` | Pull log: timestamps, section counts, errors |
|
|
42
|
+
|
|
43
|
+
`<projectHash>` is a SHA-256 of the canonical repo URL (e.g. `github.com/owner/repo`), truncated to 16 hex chars.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Build pipeline
|
|
48
|
+
|
|
49
|
+
Source: `server/src/services/genome-build.ts`
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
POST /genome/build { userId, owner, repo }
|
|
53
|
+
│
|
|
54
|
+
▼
|
|
55
|
+
buildGenomeFromGitHub(userId, owner, repo)
|
|
56
|
+
│
|
|
57
|
+
├─ tier check: free tier → visibility must be "public"
|
|
58
|
+
│ live check via api.github.com/repos/<owner>/<repo>
|
|
59
|
+
│ (server-enforced; client cannot bypass)
|
|
60
|
+
│
|
|
61
|
+
├─ git clone --depth 1 (60s timeout)
|
|
62
|
+
│
|
|
63
|
+
├─ bun run scripts/genome-init.ts --minimal (120s timeout)
|
|
64
|
+
│ produces: architecture.md, conventions.md, decisions.md
|
|
65
|
+
│ + top-level file index
|
|
66
|
+
│
|
|
67
|
+
├─ per-section AES-GCM encrypt
|
|
68
|
+
│ key: users.genome_encryption_key_encrypted (auto-generated on first build)
|
|
69
|
+
│
|
|
70
|
+
└─ upsertSection → genomes table
|
|
71
|
+
sets build_status = "ready", last_built_at = now()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Rate limit: 5 builds per user per hour (`POST /genome/build`).
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Tier gating
|
|
79
|
+
|
|
80
|
+
| Tier | Repo visibility | Enforcement |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| Free | Public repos only | Server performs live `api.github.com` check on every build request. `repo_visibility` stored in `genomes` table for audit. |
|
|
83
|
+
| Pro | Public + private | `repo` scope step-up consent required. Server verifies token has `repo` scope before cloning. |
|
|
84
|
+
|
|
85
|
+
The client cannot fake visibility. The live API check is performed server-side regardless of what the client reports.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Encryption
|
|
90
|
+
|
|
91
|
+
### Per-user genome key
|
|
92
|
+
|
|
93
|
+
Each user has a `genome_encryption_key_encrypted` column in the `users` table. This is a random 32-byte key, itself encrypted with the server's `ASHLR_MASTER_KEY`. The key is auto-generated on first private-repo build (or first genome build for Pro users).
|
|
94
|
+
|
|
95
|
+
`GET /user/genome-key` returns the decrypted key over TLS. The client caches it at `~/.ashlr/genome-key` with mode `0o600`. This file is never included in git history or synced.
|
|
96
|
+
|
|
97
|
+
### Section encryption
|
|
98
|
+
|
|
99
|
+
Each genome section is encrypted individually with AES-256-GCM:
|
|
100
|
+
- Random 12-byte IV per section
|
|
101
|
+
- Auth tag appended
|
|
102
|
+
- Implementation: `servers/_genome-crypto.ts`
|
|
103
|
+
|
|
104
|
+
The server stores ciphertext; plaintext never touches disk on the server after the build completes.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Webhook-driven delta rebuild
|
|
109
|
+
|
|
110
|
+
Source: `server/src/routes/webhooks.ts`
|
|
111
|
+
|
|
112
|
+
GitHub push events trigger incremental re-indexing of affected genome sections rather than a full rebuild.
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
GitHub push event → POST /webhooks/github
|
|
116
|
+
│
|
|
117
|
+
├─ verify HMAC-SHA256 signature (timingSafeEqual)
|
|
118
|
+
│ header: X-Hub-Signature-256
|
|
119
|
+
│ secret: GITHUB_WEBHOOK_SECRET
|
|
120
|
+
│
|
|
121
|
+
├─ deduplicate by X-GitHub-Delivery header (idempotency)
|
|
122
|
+
│
|
|
123
|
+
├─ extract changed file paths from commits[].added/modified/removed
|
|
124
|
+
│
|
|
125
|
+
├─ map paths → genome sections (by path prefix)
|
|
126
|
+
│
|
|
127
|
+
└─ re-run genome-init --section <name> for each affected section
|
|
128
|
+
upsertSection → update last_built_at
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Signature verification is at `server/src/routes/webhooks.ts:28-35`. Deliveries are stored by delivery ID; a duplicate delivery is acknowledged with 200 and skipped.
|
|
132
|
+
|
|
133
|
+
To register the webhook on your repo: `github.com/<owner>/<repo>/settings/hooks` → Payload URL: `https://api.ashlr.ai/webhooks/github`, content type: `application/json`, events: `push`.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Kill switch
|
|
138
|
+
|
|
139
|
+
Set `ASHLR_CLOUD_GENOME_DISABLE=1` in your shell environment (or in `~/.claude/settings.json` under `env`) to disable the cloud genome pull entirely. `ashlr__grep` will skip the `~/.ashlr/genomes/` cache and fall through to ripgrep.
|
|
140
|
+
|
|
141
|
+
This is useful if you are on a slow connection, working offline, or want to force the local-only code path for testing.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## When `ashlr__grep` consults the cloud cache
|
|
146
|
+
|
|
147
|
+
The retrieval order in `servers/_genome-cache.ts:findParentGenome`:
|
|
148
|
+
|
|
149
|
+
1. Walk up from `cwd` looking for `.ashlrcode/genome/`. If found, use it — done.
|
|
150
|
+
2. Compute `projectHash` from the git remote of `cwd`.
|
|
151
|
+
3. Check `~/.ashlr/genomes/<projectHash>/.ashlr-cloud-genome` exists.
|
|
152
|
+
4. If yes, load sections from that directory and run TF-IDF retrieval.
|
|
153
|
+
5. If no match or `ASHLR_CLOUD_GENOME_DISABLE=1`, fall through to ripgrep.
|
|
154
|
+
|
|
155
|
+
The local genome always wins. Cloud is a supplement, not a replacement.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# WozCode Competitive Learnings
|
|
2
|
+
|
|
3
|
+
> Internal strategy doc — last updated 2026-06-01.
|
|
4
|
+
> Source: public site/repo analysis (minified), benchmark pages, pricing docs.
|
|
5
|
+
> Treat WozCode's self-reported numbers with skepticism (see Caveats).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
WozCode is a closed-source, account-gated Claude Code efficiency plugin (~182 GitHub stars). It competes directly with Ashlr on token reduction. Their headline claim is "80% token reduction," but their own benchmark pages show internally inconsistent numbers. Ashlr's measured, per-tool savings data is a stronger trust signal.
|
|
12
|
+
|
|
13
|
+
Three technical capabilities are worth adopting or beating. One pricing model (pay-for-performance) is defensible for Ashlr and worth studying. Several growth surfaces (llms.txt, leaderboard, benchmark blog) are low-effort wins.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Capability Comparison
|
|
18
|
+
|
|
19
|
+
| Capability | WozCode | Ashlr |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| AST-truncated reads (stub bodies, keep signatures) | Yes — default-on for large files | Not yet |
|
|
22
|
+
| Fuzzy edit matching (Levenshtein + whitespace tolerance) | Yes | Not yet |
|
|
23
|
+
| Post-edit syntax validation loop (Tree-sitter/tsc) | Yes | Not yet |
|
|
24
|
+
| Genome / RAG context retrieval | No | Yes |
|
|
25
|
+
| Per-tool measured savings | No (aggregate self-report) | Yes |
|
|
26
|
+
| Open source + auditable | No (minified, account-gated) | Yes |
|
|
27
|
+
| Opt-in telemetry | No (PostHog on-by-default, hardcoded token) | Yes |
|
|
28
|
+
| Tool breadth | Narrow (deliberate) | 40 tools, 33 commands |
|
|
29
|
+
| `llms.txt` | Yes | No |
|
|
30
|
+
| Public savings leaderboard | Yes (gamified) | No |
|
|
31
|
+
| Multi-surface install (VS Code / Cursor / Windows) | Yes | macOS/Linux primary |
|
|
32
|
+
| Plain-English settings UI (`/woz-settings`) | Yes | Partial (`/ashlr-settings`) |
|
|
33
|
+
| Benchmark blog post | Yes | No |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Prioritized Learnings
|
|
38
|
+
|
|
39
|
+
### P0 — Product (implement to close capability gap)
|
|
40
|
+
|
|
41
|
+
**1. AST-truncated reads** (highest per-call token win)
|
|
42
|
+
WozCode stubs out function bodies on large file reads, returning only signatures, types, and exports. This is their biggest single-call saving. For Ashlr: extend `ashlr__read` to detect large files (>N LOC) and emit an AST-truncated view by default, with `bypassSummary:true` to get full content. Tree-sitter or `@ast-grep/napi` are viable. Make it default-on — users should not need to opt in.
|
|
43
|
+
|
|
44
|
+
**2. Fuzzy edit matching**
|
|
45
|
+
WozCode applies Levenshtein distance + whitespace/unicode normalization before failing an edit. Today Ashlr's `ashlr__edit` fails on whitespace drift, forcing a costly retry round-trip. Adding a fuzzy fallback (with a diff preview so the model can confirm) eliminates that class of second-turn errors entirely.
|
|
46
|
+
|
|
47
|
+
**3. Post-edit syntax validation loop**
|
|
48
|
+
After each edit, WozCode runs a fast syntax check (Tree-sitter for parse errors, `tsc --noEmit` for TypeScript, file-type-appropriate linter) and feeds failures back in the same turn. This prevents bad edits from reaching a second model round-trip. For Ashlr: add an optional `validate: true` flag to `ashlr__edit` / `ashlr__multi_edit` that runs the cheapest applicable checker and returns inline errors.
|
|
49
|
+
|
|
50
|
+
### P1 — Positioning + Pricing
|
|
51
|
+
|
|
52
|
+
**Pay-for-performance pricing model**
|
|
53
|
+
WozCode Enterprise: `$50/seat + 10% of measured savings`. This is actually *more* defensible for Ashlr than for WozCode because Ashlr's savings are **measured per-tool** (not self-reported aggregate). A pay-for-performance tier aligns incentives perfectly and turns Ashlr's measurement advantage into a pricing advantage. Study structure: base seat fee covers fixed costs; the savings share creates a shared-upside relationship.
|
|
54
|
+
|
|
55
|
+
**Savings cap on free tier**
|
|
56
|
+
WozCode offers a free tier capped at $100/mo in savings rather than feature-gating. This is a better acquisition model than feature-gating: users experience the full product, and heavy users naturally convert. Consider adopting for Ashlr's free tier.
|
|
57
|
+
|
|
58
|
+
**Lean into WozCode's benchmark inconsistency**
|
|
59
|
+
WozCode's TerminalBench numbers differ across their own pages: 80.2%/69% vs 68%/58% vs "17% on their blog." These are internally inconsistent and unverifiable. Ashlr should publish a transparent, reproducible benchmark methodology with per-tool breakdowns — this is already partially done via `benchmarks.md` / `benchmarks-v2.json`. A short benchmark blog post with methodology and raw data is a credibility differentiator.
|
|
60
|
+
|
|
61
|
+
### P2 — Growth + DX
|
|
62
|
+
|
|
63
|
+
**`llms.txt`** — Add `site/public/llms.txt` listing Ashlr's tools, commands, and genome format. WozCode has one; it improves AI-driven discovery and is a 30-minute task.
|
|
64
|
+
|
|
65
|
+
**Public savings leaderboard** — Opt-in leaderboard showing top savers (anonymized or named). WozCode uses this for social proof. Ashlr already collects savings data; surfacing it publicly turns a telemetry feature into a growth loop.
|
|
66
|
+
|
|
67
|
+
**Benchmark blog post** — A single authoritative post with methodology, per-tool numbers, and comparison. Addresses the credibility gap vs WozCode's (flawed) benchmarks. Publish to the marketing site; link from README and llms.txt.
|
|
68
|
+
|
|
69
|
+
**Multi-surface install matrix** — Document and test install on VS Code (with MCP), Cursor, Windows (PowerShell). `docs/install-windows.md` and `docs/install.ps1` already exist — surface them more prominently. WozCode's multi-surface presence expands their addressable audience.
|
|
70
|
+
|
|
71
|
+
**Plain-English settings** — `/ashlr-settings` should describe each setting in one plain sentence with a concrete example. Reduces friction for non-power users.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Where Ashlr Already Wins
|
|
76
|
+
|
|
77
|
+
Message these proactively in docs, README, and the benchmark blog:
|
|
78
|
+
|
|
79
|
+
- **Open source + auditable.** WozCode is minified and requires account creation to inspect behavior. Ashlr is fully open — every tool, hook, and genome interaction is readable.
|
|
80
|
+
- **Measured savings, not self-reported.** Ashlr tracks per-tool token and cost savings with a verifiable methodology. WozCode's numbers are inconsistent across their own pages.
|
|
81
|
+
- **Opt-in telemetry.** WozCode ships PostHog with a hardcoded token, on by default. Ashlr's telemetry is opt-in and documented.
|
|
82
|
+
- **Breadth.** 40 tools, 33 commands, genome RAG, `/ashlr-brief`, `/ashlr-efficient`. WozCode's surface is deliberately narrow.
|
|
83
|
+
- **No account required.** Ashlr installs with one curl command and one slash command. WozCode requires account creation before the plugin is functional.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Caveats
|
|
88
|
+
|
|
89
|
+
1. **Benchmark numbers are unverifiable.** All WozCode efficiency claims are self-reported. Their own pages show inconsistent figures (TerminalBench: 80.2/69 vs 68/58 vs "17%"). Do not treat these as ground truth.
|
|
90
|
+
2. **Internals are inferred.** The WozCode repo is minified and obfuscated. Technical capabilities above (AST truncation, fuzzy matching, syntax validation) are inferred from public documentation, changelogs, and behavior — not audited source.
|
|
91
|
+
3. **Third-party reputation is thin.** 182 GitHub stars, low HN engagement, no independent benchmark reproductions as of 2026-06-01. This is an opening: Ashlr can establish the credibility standard before WozCode does.
|
|
92
|
+
4. **Competitive landscape moves fast.** Re-verify these findings before any public messaging; capabilities may have changed.
|