mlx-bun 0.2.0 → 0.3.0
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/README.md +71 -588
- package/docs/README.md +91 -0
- package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
- package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
- package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
- package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
- package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
- package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
- package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
- package/docs/design/batching.md +569 -0
- package/docs/design/decode-speed-program.md +3178 -169
- package/docs/design/dreaming-nightly-pipeline.md +675 -282
- package/docs/design/generic-model-support.md +579 -334
- package/docs/design/kv-cache.md +680 -0
- package/docs/design/orpo-training.md +673 -1239
- package/docs/design/speculative-decoding.md +1627 -0
- package/docs/design/turboquant.md +2102 -0
- package/docs/design/unified-engine-frontier-plan.md +1831 -727
- package/docs/design/web-chat-redesign.md +666 -1083
- package/docs/planning/PRODUCT_ROADMAP.md +34 -1
- package/docs/planning/release-notes-v0.3.0.md +35 -0
- package/docs/planning/video-series.md +2 -2
- package/docs/reference/benchmarks.md +1162 -0
- package/docs/reference/cli.md +394 -159
- package/docs/reference/distribution.md +321 -182
- package/docs/reference/environment.md +348 -0
- package/docs/reference/glossary.md +39 -0
- package/docs/reference/library-api.md +566 -168
- package/docs/reference/memory.md +227 -64
- package/docs/reference/models.md +104 -6
- package/docs/reference/server-api.md +886 -425
- package/docs/reference/server-config.md +638 -330
- package/docs/reference/training.md +393 -254
- package/docs/reference/troubleshooting.md +166 -0
- package/package.json +9 -4
- package/src/audio/decode.ts +2 -2
- package/src/audio/features.ts +2 -2
- package/src/backends/mlx/autoregressive.ts +108 -0
- package/src/backends/mlx/batch-group.ts +1646 -0
- package/src/backends/mlx/diffusion.ts +39 -0
- package/src/backends/mlx/draft-target.ts +47 -0
- package/src/backends/mlx/evaluation.ts +105 -0
- package/src/backends/mlx/fill-append.ts +45 -0
- package/src/backends/mlx/gateway-binding.ts +71 -0
- package/src/backends/mlx/graph.ts +38 -0
- package/src/backends/mlx/memory-client.ts +189 -0
- package/src/backends/mlx/memory-guard.ts +40 -0
- package/src/backends/mlx/methods.ts +90 -0
- package/src/backends/mlx/model-prompt.ts +164 -0
- package/src/backends/mlx/model-serving.ts +79 -0
- package/src/backends/mlx/prefill.ts +33 -0
- package/src/backends/mlx/request-policy.ts +20 -0
- package/src/backends/mlx/rollback.ts +51 -0
- package/src/backends/mlx/serial-executor.ts +273 -0
- package/src/backends/mlx/speculative.ts +114 -0
- package/src/backends/mlx/state-views.ts +26 -0
- package/src/backends/mlx/text-engine.ts +73 -0
- package/src/cli.ts +58 -25
- package/src/client.ts +66 -0
- package/src/config.ts +21 -4
- package/src/contracts/completion.ts +16 -0
- package/src/contracts/execution.ts +49 -0
- package/src/contracts/generation.ts +103 -0
- package/src/contracts/host.ts +7 -0
- package/src/contracts/jobs.ts +66 -0
- package/src/contracts/pi-provider.ts +30 -0
- package/src/contracts/pi.ts +259 -0
- package/src/contracts/resources.ts +18 -0
- package/src/contracts/scheduling.ts +27 -0
- package/src/contracts/tsconfig.json +14 -0
- package/src/diffusion/diffusion-generate.ts +218 -153
- package/src/embed.ts +1 -1
- package/src/engine/admission.ts +59 -0
- package/src/engine/cancellation.ts +38 -0
- package/src/engine/engine.ts +56 -0
- package/src/engine/execution-coordinator.ts +70 -0
- package/src/engine/execution-plan.ts +51 -0
- package/src/engine/resources.ts +42 -0
- package/src/engine/scheduler.ts +67 -0
- package/src/engine/session.ts +247 -0
- package/src/eval/README.md +44 -1
- package/src/eval/kl.ts +236 -3
- package/src/eval/reference-logits.ts +207 -0
- package/src/eval/runner.ts +8 -96
- package/src/fill/echo-index.ts +188 -0
- package/src/fill/fill-session.ts +452 -0
- package/src/fill/proposal.ts +68 -0
- package/src/fill/schema-rows.ts +506 -0
- package/src/fill/tool-boundary.ts +103 -0
- package/src/fit.ts +1 -1
- package/src/generate.ts +656 -268
- package/src/grammar.ts +12 -7
- package/src/harness-pi.ts +14 -33
- package/src/hub-rest.ts +4 -4
- package/src/index.ts +7 -0
- package/src/inference/denoising.ts +17 -0
- package/src/inference/graph.ts +33 -0
- package/src/inference/prefill.ts +39 -0
- package/src/inference/rollback.ts +7 -0
- package/src/jobs/db.ts +4 -0
- package/src/jobs/index.ts +2 -0
- package/src/jobs/job-entry.ts +12 -12
- package/src/jobs/runner.ts +98 -13
- package/src/jobs/task-client.ts +19 -0
- package/src/jobs/types.ts +2 -58
- package/src/kv-store.ts +109 -49
- package/src/lab/README.md +18 -0
- package/src/{assets → lab/curve}/curve-designer.html +2 -2
- package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
- package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +5 -5
- package/src/{model → lab/paged-kv}/paged-kv.ts +9 -6
- package/src/library.ts +40 -0
- package/src/lora.ts +18 -0
- package/src/media-fetch.ts +1 -1
- package/src/memory/article.ts +1 -1
- package/src/memory/chunk.ts +1 -1
- package/src/memory/model.ts +30 -169
- package/src/memory/prompts.ts +1 -1
- package/src/memory/rest.ts +1 -1
- package/src/memory/schedule.ts +1 -1
- package/src/memory/stages.ts +4 -1
- package/src/memory/vault.ts +1 -3
- package/src/mlx/array.ts +9 -10
- package/src/mlx/compile.ts +12 -2
- package/src/mlx/ffi.ts +58 -11
- package/src/mlx/materialize.ts +23 -0
- package/src/mlx/metal-kernel.ts +10 -11
- package/src/mlx/ops.ts +33 -13
- package/src/mlx/quantized-rows.ts +36 -0
- package/src/mlx/token-bitmask.ts +52 -0
- package/src/mlx/turboquant-kv-decode.ts +82 -0
- package/src/mlx/turboquant-kv-inverse.ts +122 -0
- package/src/mlx/turboquant-ops.ts +33 -3
- package/src/mlx/turboquant-tables.ts +2 -2
- package/src/model/batched-mask.ts +8 -2
- package/src/model/batched-quant.ts +1 -1
- package/src/model/batched-rotating-quant.ts +2 -2
- package/src/model/batched-rotating.ts +1 -1
- package/src/model/compiled-decode.ts +1 -1
- package/src/model/diffusion-gemma.ts +8 -8
- package/src/model/factory.ts +76 -33
- package/src/model/fingerprint.ts +1 -1
- package/src/model/flash-attention.ts +3 -3
- package/src/model/gemma4-base.ts +26 -9
- package/src/model/gemma4.ts +6 -6
- package/src/model/generated/gemma4-12b.ts +2 -2
- package/src/model/generated/gemma4-26b.ts +2 -2
- package/src/model/generated/gemma4-e4b.ts +2 -2
- package/src/model/glm52-dsa.ts +13 -9
- package/src/model/glm52-memory.ts +1 -1
- package/src/model/implementation.ts +69 -0
- package/src/model/minicpm5.ts +6 -8
- package/src/model/profile.ts +12 -2
- package/src/model/qwen-append.ts +12 -0
- package/src/model/qwen-conv.ts +52 -0
- package/src/model/qwen3_5-checkpoint.ts +164 -0
- package/src/model/qwen3_5.ts +140 -56
- package/src/model/support.ts +1 -1
- package/src/model/trellis-balanced-scatter.ts +51 -0
- package/src/model/trellis-linear.ts +672 -0
- package/src/model/trellis-shared-m.ts +151 -0
- package/src/model/trellis-shared-scatter.ts +144 -0
- package/src/model/trellis-splitk-prefill.ts +158 -0
- package/src/model/trellis-tiled-prefill.ts +136 -0
- package/src/model/trellis-vector-expand.ts +62 -0
- package/src/model/trellis-wide-prefill.ts +94 -0
- package/src/model/universal/dense.ts +1 -1
- package/src/model/universal/modules.ts +8 -1
- package/src/native-pack.ts +6 -5
- package/src/pi-provider.ts +6 -64
- package/src/pi-web.ts +8 -315
- package/src/prompt-cache.ts +96 -53
- package/src/quantize/allocator.ts +1 -1
- package/src/quantize/config-writer.ts +10 -3
- package/src/quantize/rotate.ts +4 -4
- package/src/quantize/trellis.ts +586 -0
- package/src/responses.ts +28 -1
- package/src/runtime-config.ts +18 -4
- package/src/sampler.ts +4 -4
- package/src/serve/batch-scheduler.ts +8 -1671
- package/src/serve/chat-request.ts +391 -0
- package/src/serve/chat-stage.ts +195 -0
- package/src/serve/checkpoint-identity.ts +64 -0
- package/src/serve/completion-executor.ts +15 -7
- package/src/serve/discovery-routes.ts +12 -13
- package/src/serve/generation-gateway.ts +154 -193
- package/src/serve/http.ts +159 -0
- package/src/serve/inference-request.ts +79 -0
- package/src/serve/isolate.ts +297 -105
- package/src/serve/lab-routes.ts +3 -0
- package/src/serve/lane-registry.ts +2 -1
- package/src/serve/model-admin-routes.ts +7 -5
- package/src/serve/model-binding.ts +43 -0
- package/src/serve/model-host.ts +512 -0
- package/src/serve/openai-wire.ts +103 -0
- package/src/serve/parent-application.ts +56 -0
- package/src/serve/pipeline.ts +33 -0
- package/src/serve/preparation.ts +33 -0
- package/src/serve/request-plan.ts +19 -15
- package/src/serve/request-prep.ts +346 -0
- package/src/serve/response-lease.ts +24 -0
- package/src/serve/responses-client.ts +69 -0
- package/src/serve/session-completion-engine.ts +110 -0
- package/src/serve/session-search.ts +1 -1
- package/src/serve/static-routes.ts +5 -5
- package/src/serve/text-completion-stage.ts +104 -0
- package/src/serve/token-streams.ts +519 -0
- package/src/server.ts +317 -2649
- package/src/spec/assistant-source.ts +10 -44
- package/src/spec/deepspec-source.ts +6 -6
- package/src/spec/dflash-source.ts +8 -8
- package/src/spec/dspark/ab-stats.ts +3 -3
- package/src/spec/dspark/calibration.ts +2 -2
- package/src/spec/dspark/deepspec-module.ts +2 -2
- package/src/spec/dspark/generate-dflash.ts +2 -2
- package/src/spec/dspark/generate.ts +2 -2
- package/src/spec/dspark/loader.ts +1 -1
- package/src/spec/dspark/module-dflash.ts +4 -3
- package/src/spec/dspark/module.ts +3 -3
- package/src/spec/dspark/quantize-drafter.ts +1 -1
- package/src/spec/generate.ts +1 -1
- package/src/spec/glm52-mtp-source.ts +1 -1
- package/src/spec/ngram-source.ts +1 -1
- package/src/spec/prefix-state.ts +45 -0
- package/src/spec/qwen-mtp-source.ts +166 -69
- package/src/spec/serve-loop.ts +154 -156
- package/src/spec/source.ts +42 -10
- package/src/spec/two-model.ts +1 -1
- package/src/ssd-cache.ts +80 -12
- package/src/ssd-durability.ts +25 -13
- package/src/tool-call.ts +51 -14
- package/src/train/flash-cce.ts +2 -2
- package/src/train/forward.ts +6 -0
- package/src/train/loss.ts +1 -1
- package/src/train/prefix-shared.ts +5 -1
- package/src/train/segmented.ts +5 -3
- package/src/train/trainer.ts +6 -6
- package/src/vision/prompt.ts +1 -1
- package/src/vision/qwen3vl-tower.ts +52 -10
- package/src/web/app.html +1 -1
- package/src/web/app.js +5 -3
- package/src/web/src/adapters-panel.ts +3 -3
- package/src/web/src/assistant.ts +2 -36
- package/src/web/src/chat.ts +4 -4
- package/src/web/src/composer.ts +4 -4
- package/src/web/src/hub.ts +1 -1
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +1 -1
- package/src/web/src/model-picker.ts +1 -1
- package/src/web/src/palette.ts +1 -1
- package/src/web/src/protocol.ts +3 -39
- package/src/web/src/sessions.ts +1 -1
- package/src/web/src/ui-catalog.ts +4 -18
- package/src/web-assets.ts +47 -0
- package/src/weights.ts +55 -9
- package/docs/archive/investigations/curve-runs/bisector-route.json +0 -98
- package/docs/archive/investigations/curve-runs/bisector-trace.json +0 -1393
- package/docs/archive/investigations/curve-runs/curve-terrain.json +0 -1179
- package/docs/archive/investigations/curve-runs/curve-terrain.svg +0 -42
- package/docs/archive/investigations/hlg-ab.html +0 -34
- package/docs/archive/investigations/hlg-explorer.html +0 -238
- package/docs/archive/investigations/hlg-figs/cliff.svg +0 -1
- package/docs/archive/investigations/hlg-figs/cross.svg +0 -1
- package/docs/archive/investigations/hlg-figs/edges.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-grids.svg +0 -1
- package/docs/archive/investigations/hlg-figs/k20-peaks.svg +0 -1
- package/docs/archive/investigations/hlg-figs/lw-curve.svg +0 -1
- package/docs/archive/investigations/hlg-figs/terrain.svg +0 -1
- package/docs/archive/investigations/hlg-report.html +0 -262
- package/docs/archive/investigations/hlg-runs/hlg-ab.json +0 -149
- package/docs/archive/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
- package/docs/archive/investigations/hlg-runs/hlg-blind.json +0 -107
- package/docs/archive/investigations/hlg-runs/hlg-cliff.json +0 -197
- package/docs/archive/investigations/hlg-runs/hlg-cross.json +0 -505
- package/docs/archive/investigations/hlg-runs/hlg-edge.json +0 -388
- package/docs/archive/investigations/hlg-runs/hlg-eval1.json +0 -25
- package/docs/archive/investigations/hlg-runs/hlg-frontier.json +0 -86
- package/docs/archive/investigations/hlg-runs/hlg-grid.json +0 -242
- package/docs/archive/investigations/hlg-runs/hlg-grid2.json +0 -343
- package/docs/archive/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
- package/docs/archive/investigations/hlg-runs/hlg-map.json +0 -383
- package/docs/archive/investigations/hlg-runs/run0-original.log +0 -159
- package/docs/archive/investigations/hlg-runs/runA-recommended.log +0 -131
- package/docs/archive/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
- package/docs/archive/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
- package/docs/archive/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
- package/docs/archive/investigations/hlg-runs/runAD-ab-samples.log +0 -8
- package/docs/archive/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
- package/docs/archive/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
- package/docs/archive/investigations/hlg-runs/runAG-eval-config2.log +0 -16
- package/docs/archive/investigations/hlg-runs/runB-gain-variants.log +0 -192
- package/docs/archive/investigations/hlg-runs/runC-pivots.log +0 -162
- package/docs/archive/investigations/hlg-runs/runD-oetf.log +0 -132
- package/docs/archive/investigations/hlg-runs/runE-eotf.log +0 -162
- package/docs/archive/investigations/hlg-runs/runF-shaper-working.log +0 -86
- package/docs/archive/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
- package/docs/archive/investigations/hlg-runs/runH-wsweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runI-asweep.log +0 -176
- package/docs/archive/investigations/hlg-runs/runJ-knobmap.log +0 -49
- package/docs/archive/investigations/hlg-runs/runK-frontier.log +0 -19
- package/docs/archive/investigations/hlg-runs/runL-widemap.log +0 -65
- package/docs/archive/investigations/hlg-runs/runM-frontier-emb.log +0 -15
- package/docs/archive/investigations/hlg-runs/runN-verify.log +0 -116
- package/docs/archive/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
- package/docs/archive/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
- package/docs/archive/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
- package/docs/archive/investigations/hlg-runs/runR-blind-transcript.log +0 -79
- package/docs/archive/investigations/hlg-runs/runS-cross-coherence.log +0 -33
- package/docs/archive/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
- package/docs/archive/investigations/hlg-runs/runU-cross-12b.log +0 -33
- package/docs/archive/investigations/hlg-runs/runV-lw-e4b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runW-lw-12b.log +0 -22
- package/docs/archive/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
- package/docs/archive/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
- package/docs/archive/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
- package/docs/archive/mlx-bun-lab-report.html +0 -275
- package/docs/archive/wwdc-mlx-bun.html +0 -848
- package/docs/design/adapters-end-to-end.md +0 -205
- package/docs/design/batching-perf-path.md +0 -255
- package/docs/design/batching-v2-plan.md +0 -529
- package/docs/design/bucketing-stage.md +0 -197
- package/docs/design/compat-cli-surface-design.md +0 -230
- package/docs/design/docs-reorg-plan.md +0 -165
- package/docs/design/dspark-serving-program.md +0 -371
- package/docs/design/dspark-speculative-decoding.md +0 -318
- package/docs/design/grammar-spec-batching-integration.md +0 -301
- package/docs/design/memory-inference-path.md +0 -422
- package/docs/design/memory-synthesis.md +0 -287
- package/docs/design/memory-system.md +0 -237
- package/docs/design/mlx-lm-serving-execution-seam.md +0 -81
- package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
- package/docs/design/omlx-adoption-map.md +0 -98
- package/docs/design/orpo-dynamic-lambda.md +0 -220
- package/docs/design/orpo-future-enhancements.md +0 -340
- package/docs/design/paged-kv-cache.md +0 -214
- package/docs/design/parallel-slots.md +0 -567
- package/docs/design/parity-tier-dag.md +0 -161
- package/docs/design/repo-cleanup-plan.md +0 -231
- package/docs/design/runtime-isolation.md +0 -263
- package/docs/design/segmented-backward-training.md +0 -543
- package/docs/design/spec-decode-larger-targets.md +0 -229
- package/docs/design/ssd-kv-cold-tier.md +0 -415
- package/docs/design/structured-output.md +0 -484
- package/docs/design/tauri-desktop-app.md +0 -127
- package/docs/design/the-dreaming-master-plan.md +0 -445
- package/docs/design/turboquant-kv.md +0 -235
- package/docs/design/turboquant-weights.md +0 -467
- package/docs/design/w4a16-compute-precision-spike.md +0 -232
- package/docs/design/web-chat-beat-matrix.md +0 -315
- package/docs/design/write-pipeline-entity.md +0 -468
- package/docs/planning/IDEAS.md +0 -69
- package/docs/reference/embedding.md +0 -197
- package/docs/reference/features-matrix.md +0 -101
- package/docs/reference/orpo-quickstart.md +0 -135
- package/src/flags.ts +0 -11
- /package/docs/{design → archive/investigations}/colibri-glm52-port.md +0 -0
- /package/docs/{planning → archive/planning}/chunk-task-roadmap.md +0 -0
- /package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +0 -0
- /package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +0 -0
- /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
- /package/docs/{planning → archive/planning}/release-notes-v0.2.0.md +0 -0
- /package/src/{memory-plan.ts → admission-plan.ts} +0 -0
- /package/{docs/archive/investigations → src/serve/assets}/curve-terrain.html +0 -0
- /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
# The local write pipeline — conversations → entity articles
|
|
2
|
-
|
|
3
|
-
Status: **design**, 2026-06-26. Supersedes the bucket-centric routing in
|
|
4
|
-
[memory-synthesis.md](./memory-synthesis.md) and [bucketing-stage.md](./bucketing-stage.md)
|
|
5
|
-
on **one axis only**: how a chunk reaches an article. Everything else in those
|
|
6
|
-
docs (capacity-by-decomposition, the conservative gate, the pointer DB, stage
|
|
7
|
-
LoRAs, build sequence) stands. This doc is the write side recentered on the
|
|
8
|
-
governing realization:
|
|
9
|
-
|
|
10
|
-
> **Articles are THINGS (entities). Routing is entity-extraction + name-match,
|
|
11
|
-
> Wikipedia-style. Embeddings are at most a test instrument / fallback
|
|
12
|
-
> candidate-narrower — never the routing mechanism.** Notability is personal:
|
|
13
|
-
> a thing is article-worthy because the user engaged with it.
|
|
14
|
-
|
|
15
|
-
The cloud original (Lucien) uses **zero embeddings** and works. Wikipedia has no
|
|
16
|
-
vector index: it routes by named entities, links, and title search. We copy that
|
|
17
|
-
and supply the per-edit labor with local models instead of cloud calls or
|
|
18
|
-
volunteers.
|
|
19
|
-
|
|
20
|
-
## The shift: bucket-vector routing → entity name-match
|
|
21
|
-
|
|
22
|
-
Lucien's `cluster-assign-recent.ts` is the stage this doc rewrites. There, a
|
|
23
|
-
**bucket ≈ an article**: chunks are routed to ~379 buckets by feeding their
|
|
24
|
-
labels (25 at a time) to Opus, which reasons globally over the whole taxonomy
|
|
25
|
-
and emits assignments. `synthesize-update.ts` then feeds an entire bucket's new
|
|
26
|
-
chunks to one Opus call that rewrites the whole article.
|
|
27
|
-
|
|
28
|
-
Two things break when we localize this:
|
|
29
|
-
|
|
30
|
-
1. **No global reasoner.** A 1B model cannot hold 379 buckets in its head and
|
|
31
|
-
assign correctly. (bucketing-stage.md already establishes this and decomposes
|
|
32
|
-
it into M×N binary checks.)
|
|
33
|
-
2. **bucket ≠ article.** The new model says an article is a **thing**
|
|
34
|
-
("Panasonic S5IIX", "Photography", "Donald Trump"), and a chunk is *about
|
|
35
|
-
things*. The natural routing key is therefore **the entity name**, not a
|
|
36
|
-
fuzzy cluster centroid. A chunk that mentions the S5IIX routes to the
|
|
37
|
-
`Panasonic_S5IIX` article by **name match**, exactly as a Wikipedia editor
|
|
38
|
-
files a fact under the page whose title names the thing — no vector cosine
|
|
39
|
-
anywhere on the hot path.
|
|
40
|
-
|
|
41
|
-
The "bucket" survives only as an **optional staging convenience** (a way to let
|
|
42
|
-
thin entities accumulate before they earn a page), not as the routing
|
|
43
|
-
substrate. The routing substrate is the **entity index**: a name→article map the
|
|
44
|
-
pipeline maintains deterministically.
|
|
45
|
-
|
|
46
|
-
## Why the north-star query forces this
|
|
47
|
-
|
|
48
|
-
> "What is the best lens that would give me REALLY long reach, but is not crazy
|
|
49
|
-
> expensive?"
|
|
50
|
-
|
|
51
|
-
To answer, the read agent must traverse: `Panasonic_S5IIX` → (infobox: Mount =
|
|
52
|
-
L-Mount) → `L-Mount` → compatible lenses; PLUS Josh adapts M42/EF (`Lens_Mount_Adaptation`)
|
|
53
|
-
so those qualify; he owns a `Lumix_75-300` so he wants *more* reach than that.
|
|
54
|
-
|
|
55
|
-
That traversal is only possible if the write pipeline produced:
|
|
56
|
-
|
|
57
|
-
- **entity articles** (the S5IIX is its own page, not a paragraph buried in
|
|
58
|
-
"Camera Gear"),
|
|
59
|
-
- **infobox facts** (`Mount: L-Mount` as a queryable key-value, not prose the
|
|
60
|
-
agent has to re-read and re-extract),
|
|
61
|
-
- **wikilinks** (`S5IIX → L-Mount → lenses`),
|
|
62
|
-
- **See also / series** (`Part of a series on Lenses`).
|
|
63
|
-
|
|
64
|
-
The existing corpus proves the gap is real: across 385 Dreaming articles there
|
|
65
|
-
are **378 See-also blocks but 0 infoboxes, 0 series banners, 0 {{Main}} links.**
|
|
66
|
-
Structured facts like "L-Mount" live as prose inside `Anamorphic_Lens_Adapters.md`
|
|
67
|
-
(the S5IIX isn't even its own article — it's a bolded phrase inside
|
|
68
|
-
`Camera_Gear_and_Lenses`). The write pipeline below makes entity-granular
|
|
69
|
-
articles + infoboxes a first-class output, because the read side needs them.
|
|
70
|
-
|
|
71
|
-
## The pipeline (DAG)
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
conversation transcripts
|
|
75
|
-
│
|
|
76
|
-
▼ SEGMENT ··················· local + chunk LoRA (e4b, exists)
|
|
77
|
-
single-topic chunks (+ label)
|
|
78
|
-
│
|
|
79
|
-
▼ ENTITY-EXTRACT ············ local; "what THINGS is this chunk about?"
|
|
80
|
-
chunk → [entity mentions] (the routing key — replaces bucket-vector)
|
|
81
|
-
│
|
|
82
|
-
▼ ROUTE (name-match, deterministic + tiny binary disambiguation)
|
|
83
|
-
each mention → existing article | CREATE new article | drop (trivial)
|
|
84
|
-
│
|
|
85
|
-
▼ SECTION-ROUTE ············· M×N binary, hierarchically pruned
|
|
86
|
-
"does chunk i update section j of article A? yes/no"
|
|
87
|
-
all-no + substantive → new section ; no related article → new article
|
|
88
|
-
│
|
|
89
|
-
▼ PATCH ····················· local + synth LoRA; one (chunk,section) pair
|
|
90
|
-
integrate chunk into section + [^N] citation (bounded in/out)
|
|
91
|
-
│
|
|
92
|
-
▼ NORMALIZE ················· deterministic code (NOT a model)
|
|
93
|
-
footnote bijection · wikilink canonicalize · infobox key sort
|
|
94
|
-
│
|
|
95
|
-
▼ WIKIFY (periodic) ········· local + editor LoRA + structural pass
|
|
96
|
-
per-section improve · summary-style splits · series/See-also/infobox upkeep
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
Compared to memory-synthesis.md's DAG, the change is **CLASSIFY→bucket** is
|
|
100
|
-
replaced by **ENTITY-EXTRACT → ROUTE(name-match)**, and SECTION-ROUTE is lifted
|
|
101
|
-
to a first-class M×N stage rather than a sub-step of SYNTHESIZE.
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Stage 1 — SEGMENT (chunk)
|
|
106
|
-
|
|
107
|
-
**Single task the model performs:** *"Split this one conversation into
|
|
108
|
-
single-topic chunks; give each a 4-10-word specific label."* Unchanged from
|
|
109
|
-
Lucien's `chunk-recent.ts` and already the e4b chunk LoRA's job.
|
|
110
|
-
|
|
111
|
-
- **Prompt shape:** one conversation in (formatted `[sender] (uuid) text`),
|
|
112
|
-
JSON `{chunks:[{start_message_uuid,end_message_uuid,label}]}` out. Meta policy
|
|
113
|
-
(`Chunking.md`, `Topics_to_Ignore.md`) inlined. Ignore-rule spans are simply
|
|
114
|
-
omitted (the substance filter starts here).
|
|
115
|
-
- **LoRA:** **`memory-chunk` (exists, e4b chunk-300).** This is the one stage
|
|
116
|
-
with a trained adapter. Its purity is load-bearing: a chunk fusing two things
|
|
117
|
-
pollutes every entity it routes to. Eval by boundary/label accuracy vs gold,
|
|
118
|
-
not val loss.
|
|
119
|
-
- **Output → DB:** pointer `chunks(id, conv, start, end, label)` (no text copy).
|
|
120
|
-
|
|
121
|
-
A chunk's **label is the entity-extraction input** for the next stage — Lucien
|
|
122
|
-
already classifies on labels, and the label is a clean ~6-word topic string.
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## Stage 2 — ENTITY-EXTRACT (the new routing key)
|
|
127
|
-
|
|
128
|
-
**Single task:** *"What things (entities) is this chunk about? List them as
|
|
129
|
-
canonical names."* This is the stage that **replaces bucket-vector routing.**
|
|
130
|
-
|
|
131
|
-
A "thing" is any nameable entity the user engaged with: a product
|
|
132
|
-
(`Panasonic S5IIX`), a standard (`L-Mount`), a person (`Donald Trump`), a
|
|
133
|
-
project (`Archie`), a domain (`Photography`). Broad-domain entities are legal
|
|
134
|
-
and expected — they capture domain-level engagement; specific-thing entities
|
|
135
|
-
capture the relationship to that exact entity. A chunk yields **0..N entities**
|
|
136
|
-
(many-to-many at the root).
|
|
137
|
-
|
|
138
|
-
- **Prompt shape (atomic, extraction-only — no routing decision here):**
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
A chunk of the user's conversation is below (label + text).
|
|
142
|
-
List the distinct THINGS (entities) it is about — products, people,
|
|
143
|
-
standards, projects, domains. One per line, as the canonical name you'd
|
|
144
|
-
title a wiki article. Include both specific things (e.g. "Panasonic S5IIX")
|
|
145
|
-
and the broad domain (e.g. "Photography") when both are genuinely engaged.
|
|
146
|
-
If it is about nothing nameable/substantive, output NONE.
|
|
147
|
-
|
|
148
|
-
LABEL: {{label}}
|
|
149
|
-
CHUNK: {{text}}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
Output: a short newline list of names. **No JSON object, no batch indices** —
|
|
153
|
-
the failure modes the bucketing critique flagged (multi-item JSON fidelity,
|
|
154
|
-
batch index drift) don't arise. One small list per chunk.
|
|
155
|
-
|
|
156
|
-
- **Why extract is separate from route:** extraction is "read and name"
|
|
157
|
-
(in-context, reliable for a small model); routing is "match against the
|
|
158
|
-
existing index" (a deterministic + tiny-binary step, Stage 3). Keeping them
|
|
159
|
-
separate keeps each task atomic — the capacity-by-decomposition rule.
|
|
160
|
-
|
|
161
|
-
- **LoRA:** likely **base + policy first** (`memory-entity`, train only if the
|
|
162
|
-
base over/under-extracts or won't canonicalize names). NER-style extraction is
|
|
163
|
-
near the easy end for a small instruct model; the binary disambiguation in
|
|
164
|
-
Stage 3 is where errors are cheap to catch. Decision keyed off extraction
|
|
165
|
-
precision/recall vs a gold entity set distilled from the cloud pipeline.
|
|
166
|
-
|
|
167
|
-
- **Output → DB:** `chunk_entities(chunk_id, entity_name, surface_form)` — the
|
|
168
|
-
many-to-many root edge. `entity_name` is the canonicalized title; `surface_form`
|
|
169
|
-
is what the chunk literally said (for the disambiguation step and for never
|
|
170
|
-
losing the user's wording).
|
|
171
|
-
|
|
172
|
-
### Canonicalization is deterministic, with a tiny binary tiebreak
|
|
173
|
-
|
|
174
|
-
Name-match must survive aliasing ("S5IIX" / "S5 IIX" / "Lumix S5IIX" / "the
|
|
175
|
-
Panasonic"). The pipeline keeps an **entity index** — `entities(name,
|
|
176
|
-
aliases[], article_stem)` — built from existing article titles + an `aliases`
|
|
177
|
-
list each article's infobox/lead declares. Matching:
|
|
178
|
-
|
|
179
|
-
1. **Deterministic normalize + alias lookup (no model):** case-fold, collapse
|
|
180
|
-
whitespace, strip articles/possessives; look up in the alias table. Exact or
|
|
181
|
-
alias hit → routed. This is Wikipedia's redirect mechanism.
|
|
182
|
-
2. **Tiny binary disambiguation (model, only on miss/ambiguity):** *"Is
|
|
183
|
-
`{{surface_form}}` (context: `{{label}}`) the same thing as the existing
|
|
184
|
-
article `{{candidate}}` — `{{candidate lead sentence}}`? yes/no."* Run only
|
|
185
|
-
over the few lexically-near candidates (a lexical/trigram shortlist over
|
|
186
|
-
titles+aliases — **lexical, not vector**; embeddings are a *fallback*
|
|
187
|
-
narrower only if lexical recall proves insufficient, measured first).
|
|
188
|
-
3. **No match + substantive → CREATE article** (Stage 4's create branch).
|
|
189
|
-
No match + trivial → drop.
|
|
190
|
-
|
|
191
|
-
This is the entity analogue of bucketing-stage.md's "new-bucket global gate":
|
|
192
|
-
the disambiguation step prevents `Panasonic S5IIX` and `Lumix S5 IIX` becoming
|
|
193
|
-
two pages. The difference from the old design is the candidate set comes from
|
|
194
|
-
**name/alias lexical match, not centroid cosine.**
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Stage 3 — ROUTE: mention → article
|
|
199
|
-
|
|
200
|
-
**No new model task** beyond Stage 2's disambiguation binary. Routing is the
|
|
201
|
-
deterministic join of `chunk_entities` against the `entities` index:
|
|
202
|
-
|
|
203
|
-
- mention resolves to an existing article → enqueue `(chunk, article)` for
|
|
204
|
-
section-routing.
|
|
205
|
-
- mention resolves to nothing, substantive → CREATE candidate (Stage 4).
|
|
206
|
-
- mention trivial / on the ignore list → drop.
|
|
207
|
-
|
|
208
|
-
A single chunk routes to **multiple articles** (it named multiple things) — this
|
|
209
|
-
is where facet extraction falls out: the same S5IIX-anamorphic chunk lands on
|
|
210
|
-
`Panasonic_S5IIX`, `Anamorphic_Lens_Adapters`, and `Lens_Mount_Adaptation`,
|
|
211
|
-
each of which will keep only what's relevant to *it* at patch time.
|
|
212
|
-
|
|
213
|
-
**Bucket's residual role (optional):** a thin entity (1-2 mentions, not yet
|
|
214
|
-
page-worthy) can park its chunks in a lightweight bucket keyed by the entity
|
|
215
|
-
name until it crosses a create-threshold. This is the only thing "buckets"
|
|
216
|
-
still do — a staging queue for sub-notable entities — and it's optional; the
|
|
217
|
-
default is "substantive new thing → create a {{stub}} immediately," matching
|
|
218
|
-
Wikipedia's "a stub is legitimate; coverage earns value" (Article_Conventions.md).
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## Stage 4 — SECTION-ROUTE (the M×N binary core)
|
|
223
|
-
|
|
224
|
-
For each routed `(chunk, article)` pair, decide which **section(s)** the chunk
|
|
225
|
-
touches. This is bucketing-stage.md's M×N binary pattern, now first-class.
|
|
226
|
-
|
|
227
|
-
**Single task (one call per pair):** *"Should this chunk update THIS section?
|
|
228
|
-
yes/no."*
|
|
229
|
-
|
|
230
|
-
```
|
|
231
|
-
ARTICLE: {{title}}
|
|
232
|
-
SECTION: {{heading}} — {{section's first ~2 sentences}}
|
|
233
|
-
CHUNK (label): {{label}}
|
|
234
|
-
CHUNK adds: {{1-line gist or the chunk text if short}}
|
|
235
|
-
Does this chunk add or change information belonging in THIS section? yes/no.
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
Run over the article's *N* TOC sections (from `parseToc`/`extractSection` in
|
|
239
|
-
`vault.ts`). Hierarchical pruning keeps M×N small:
|
|
240
|
-
|
|
241
|
-
- **Coarse gate already passed:** the chunk is here only because it named this
|
|
242
|
-
article's entity (Stage 3), so we never run sections of unrelated articles.
|
|
243
|
-
- **Within the article**, *N* is tiny (a handful of sections). Run all *N*
|
|
244
|
-
binaries; optionally prune with a lexical heading match first. **No vector
|
|
245
|
-
required** — N is small enough to brute-force, which is the whole point of
|
|
246
|
-
local ~free inference.
|
|
247
|
-
|
|
248
|
-
**The uniform growth rule (no-match → create):**
|
|
249
|
-
|
|
250
|
-
- chunk gets **yes** on ≥1 section → those become PATCH pairs.
|
|
251
|
-
- chunk gets **all-no** but is substantive → **CREATE-NEW-SECTION** task:
|
|
252
|
-
*"Name a new section (2-5 words) for this material, or NONE if it's a trivial
|
|
253
|
-
aside."* Mirrors new-article/new-bucket creation.
|
|
254
|
-
- article didn't exist at all (Stage 3 create) → **CREATE-ARTICLE**: this is the
|
|
255
|
-
cold-start flow — sub-cluster the entity's chunks into proto-sections, outline,
|
|
256
|
-
draft each section (memory-synthesis.md's CREATE flow, unchanged), seeded with
|
|
257
|
-
an **infobox** for the entity (below).
|
|
258
|
-
|
|
259
|
-
- **LoRA:** **`memory-section` (train if base misfires).** The binary framing is
|
|
260
|
-
much easier than multi-section JSON; base + policy may clear the bar. Decision
|
|
261
|
-
keyed off per-(chunk,section) yes/no accuracy + per-chunk section-set Jaccard
|
|
262
|
-
vs gold (oracle-shortlist F1 vs real, per bucketing-stage.md's eval design).
|
|
263
|
-
|
|
264
|
-
- **Output → DB:** `chunk_sections(chunk_id, article, section_anchor)` — the
|
|
265
|
-
patch worklist. `synthesized_chunk_sections` is the per-(chunk,section)
|
|
266
|
-
idempotency ledger (fold each chunk into each section exactly once;
|
|
267
|
-
`NOT IN` resumption like Lucien's `synthesized_bucket_chunks`).
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
## Stage 5 — PATCH (the most atomic synthesis)
|
|
272
|
-
|
|
273
|
-
**Single task:** *"Integrate THIS chunk into THIS section. Add a `[^N]`
|
|
274
|
-
citation. Change nothing else."* Bounded text in, bounded text out — the
|
|
275
|
-
opposite of Lucien's whole-article rewrite.
|
|
276
|
-
|
|
277
|
-
- **Prompt shape:** current section markdown + the chunk (with conv UUID, date,
|
|
278
|
-
source slug in the header for the footnote) + the citation rules (the exact
|
|
279
|
-
footnote contract from `synthesize-update.ts` / `Article_Conventions.md`,
|
|
280
|
-
inlined). Output: the rewritten **section only**, plus any new `[^N]:`
|
|
281
|
-
definition lines. **Everything outside the routed section stays
|
|
282
|
-
byte-identical** — the assembler swaps just that section back into the file.
|
|
283
|
-
|
|
284
|
-
- **Conservative write gate (per section, ported from Lucien):** preserve
|
|
285
|
-
prose, ≥70% word-count floor on the section, every pre-existing `conv:`
|
|
286
|
-
citation in that section survives, integrate-don't-overwrite. A weak local
|
|
287
|
-
pass that shrinks/strips the section is gated to **NO-OP** (the chunk stays
|
|
288
|
-
un-synthesized and retries next run) rather than allowed to corrupt the vault.
|
|
289
|
-
This is the inviolable "LoRAs propose, deterministic gates dispose" rule.
|
|
290
|
-
|
|
291
|
-
- **LoRA:** **`memory-synthesis`.** The single most valuable adapter to train,
|
|
292
|
-
distilled from Lucien's cloud synthesis edits — but at **section
|
|
293
|
-
granularity** (one (chunk,section) integration per training example), not
|
|
294
|
-
whole-article. Signal: citation preservation, faithful integration, no
|
|
295
|
-
hallucinated claims.
|
|
296
|
-
|
|
297
|
-
- **Provisional facts (open question, flagged):** the patch should represent
|
|
298
|
-
trajectory ("work set to begin July") so a later chunk cleanly updates it
|
|
299
|
-
("began", "completed"). A lightweight convention (e.g. an `as of YYYY-MM`
|
|
300
|
-
tag in prose tied to the citation date) keeps temporal claims updatable
|
|
301
|
-
rather than contradictory. Deferred; called out so the patch prompt can grow
|
|
302
|
-
into it.
|
|
303
|
-
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
## Stage 6 — WIKIFY (periodic structural pass) + infoboxes
|
|
307
|
-
|
|
308
|
-
Section-patches are greedy and local; over many of them an article drifts
|
|
309
|
-
(sprawl, stale lead, redundant prose, missing structure). WIKIFY is the periodic
|
|
310
|
-
global-but-decomposed pass that keeps articles *good* — and it is where the
|
|
311
|
-
**under-explored Wikipedia conventions** the read side needs get maintained.
|
|
312
|
-
|
|
313
|
-
Two parts (memory-synthesis.md's distinction holds — keep them separate from the
|
|
314
|
-
deterministic NORMALIZE below):
|
|
315
|
-
|
|
316
|
-
**(a) Per-section "improve this section" (local + `memory-editor` LoRA).**
|
|
317
|
-
Atomic, same shape as a patch but no new chunk: *"Tighten this section: remove
|
|
318
|
-
redundancy, keep every citation and every specific detail, don't generalize away
|
|
319
|
-
particulars."* Gated by the same ≥70% floor.
|
|
320
|
-
|
|
321
|
-
**(b) Cheap structural pass over the TOC (local, single small call per article):**
|
|
322
|
-
this is the stage that builds the traversable structure the north-star query
|
|
323
|
-
depends on. It performs, as **atomic sub-tasks**, the conventions Josh flagged:
|
|
324
|
-
|
|
325
|
-
- **Infobox maintenance** — *"From this entity article, extract/refresh the
|
|
326
|
-
structured key-value facts."* For `Panasonic_S5IIX`: `Type: Mirrorless camera`,
|
|
327
|
-
`Mount: [[L-Mount]]`, `Sensor: full-frame`, `Owner-status: owned`. **This is
|
|
328
|
-
the single most load-bearing structural output** — the infobox `Mount` field
|
|
329
|
-
is exactly the queryable fact the lens query traverses, instead of re-reading
|
|
330
|
-
prose. Infobox values that are themselves entities become **wikilinks**, so
|
|
331
|
-
the infobox is part of the link graph. (Corpus today: 0 infoboxes — this stage
|
|
332
|
-
creates them.) The infobox also declares the article's `aliases:` used by the
|
|
333
|
-
Stage-2 entity index — closing the loop.
|
|
334
|
-
|
|
335
|
-
- **Summary-style split (`{{Main}}`)** — *"Has a section outgrown the article?"*
|
|
336
|
-
When `Camera_Gear_and_Lenses` accumulates a full section on the S5IIX, split
|
|
337
|
-
it into a child `Panasonic_S5IIX` article and leave a summary + `{{Main:
|
|
338
|
-
Panasonic_S5IIX}}` link. This is **how specific-thing articles are born from
|
|
339
|
-
broad-domain ones** — the structural complement to Stage-2 entity extraction,
|
|
340
|
-
and exactly what the corpus needs (the S5IIX is currently trapped as a phrase
|
|
341
|
-
inside a gear article).
|
|
342
|
-
|
|
343
|
-
- **Article series** — *"Does this article belong to a series?"* Emit/maintain a
|
|
344
|
-
`Part of a series on [[Lenses]]` banner linking siblings, so the read agent
|
|
345
|
-
can enumerate "all lens articles" by following the series, not by guessing
|
|
346
|
-
titles.
|
|
347
|
-
|
|
348
|
-
- **See also / lead refresh / re-section / split-merge signals** — reorder
|
|
349
|
-
sections, refresh the stale lead, emit Talk-page SPLIT/MERGE/CONTRADICTION
|
|
350
|
-
signals (these *may* use embedding silhouette as a **test/triage instrument**
|
|
351
|
-
— the one sanctioned embedding use, never on the routing hot path).
|
|
352
|
-
|
|
353
|
-
WIKIFY runs **periodically**, not per-chunk (it's the editorial sweep), and is
|
|
354
|
-
decomposed so even the "global" pass is a series of atomic per-section /
|
|
355
|
-
per-convention calls — local-tractable for the same reason synthesis is.
|
|
356
|
-
|
|
357
|
-
---
|
|
358
|
-
|
|
359
|
-
## Stage 7 — NORMALIZE (deterministic, no model)
|
|
360
|
-
|
|
361
|
-
Pure code enforces the invariants AI can't be trusted on (the division of labor:
|
|
362
|
-
**AI judges, code enforces**). Ported from Lucien's `normalize-footnotes.ts` /
|
|
363
|
-
`normalize-wikilinks.ts`; `vault.ts` already has the wikilink resolver.
|
|
364
|
-
|
|
365
|
-
- **Footnote bijection:** every `[^N]` marker ⇔ exactly one `[^N]:` definition;
|
|
366
|
-
renumber 1..k contiguous in first-appearance order; merge duplicate
|
|
367
|
-
`conv:HASH` definitions to one marker. (Patches append; this re-derives the
|
|
368
|
-
canonical numbering.)
|
|
369
|
-
- **Wikilink canonicalization:** resolve `[[Name]]` to the exact on-disk stem
|
|
370
|
-
(underscores, case), repair/flag orphans, never write a spaced target that
|
|
371
|
-
resolves to nothing. Infobox entity-values normalized the same way.
|
|
372
|
-
- **Infobox key normalization:** stable key order/format so infoboxes are
|
|
373
|
-
diff-clean and machine-readable for the read agent.
|
|
374
|
-
- **Structural guards:** `## References` last, `## See also` before it,
|
|
375
|
-
`{{stub}}` marking for thin articles, title = `# H1` = filename stem.
|
|
376
|
-
|
|
377
|
-
NORMALIZE is non-fatal (logs + continues) and runs after every write, before the
|
|
378
|
-
git commit. It cannot corrupt an article — it only canonicalizes.
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
## Stage → task → model → adapter (summary)
|
|
383
|
-
|
|
384
|
-
| stage | single task the model does | prompt shape | model / adapter |
|
|
385
|
-
|---|---|---|---|
|
|
386
|
-
| SEGMENT | split one conv into single-topic chunks + labels | 1 conv → JSON chunks | **memory-chunk (e4b, exists)** |
|
|
387
|
-
| ENTITY-EXTRACT | name the THINGS this chunk is about | label+text → name list | base+policy; `memory-entity` only if needed |
|
|
388
|
-
| ROUTE | (deterministic) name/alias match; binary "same thing?" on miss | tiny yes/no per near candidate | base+policy (disambig binary) |
|
|
389
|
-
| SECTION-ROUTE | "does chunk i update section j?" yes/no, M×N | per (chunk,section) yes/no | `memory-section` if base misfires |
|
|
390
|
-
| PATCH | integrate THIS chunk into THIS section + cite | section+chunk → section | **memory-synthesis (highest value)** |
|
|
391
|
-
| WIKIFY-improve | tighten THIS section | section → section | `memory-editor` |
|
|
392
|
-
| WIKIFY-structure | infobox / split / series / see-also (atomic sub-tasks) | per-convention small calls | `memory-editor` (+ base) |
|
|
393
|
-
| NORMALIZE | — | — | **deterministic code** |
|
|
394
|
-
|
|
395
|
-
**Where a LoRA is genuinely needed vs base+policy:** PATCH (memory-synthesis)
|
|
396
|
-
and SEGMENT (memory-chunk) are the two with the hardest judgment and the most
|
|
397
|
-
to lose — train these. ENTITY-EXTRACT and SECTION-ROUTE are atomic enough that
|
|
398
|
-
**base + inlined Meta policy may clear the bar**; train only on a measured miss,
|
|
399
|
-
per the staged LoRA criteria in bucketing-stage.md (Stage 0 instrument → Stage 1
|
|
400
|
-
base+prompt → Stage 2 train only if it misses). ROUTE's disambiguation is a tiny
|
|
401
|
-
binary that base models do well. WIKIFY-improve/structure can share one
|
|
402
|
-
`memory-editor` adapter or stay base+policy initially.
|
|
403
|
-
|
|
404
|
-
---
|
|
405
|
-
|
|
406
|
-
## Data model deltas (vs bucketing-stage.md / db.ts)
|
|
407
|
-
|
|
408
|
-
Keep the pointer design (memory-synthesis.md). Add the entity layer; demote
|
|
409
|
-
buckets:
|
|
410
|
-
|
|
411
|
-
- **`messages`** — text once, `(conv, position)`.
|
|
412
|
-
- **`chunks`** — pointers + `label` (no text copy).
|
|
413
|
-
- **`entities(name, aliases, article_stem, kind)`** — the **routing index**
|
|
414
|
-
(name→article); `kind` ∈ {thing, person, domain, project, standard}. Built
|
|
415
|
-
from article titles + infobox-declared aliases. *This table replaces
|
|
416
|
-
`buckets` as the routing substrate.*
|
|
417
|
-
- **`chunk_entities(chunk_id, entity_name, surface_form)`** — M:N root edge
|
|
418
|
-
(ENTITY-EXTRACT output), the entity analogue of `chunk_buckets`.
|
|
419
|
-
- **`chunk_sections(chunk_id, article, section_anchor)`** — SECTION-ROUTE
|
|
420
|
-
worklist (already planned).
|
|
421
|
-
- **`synthesized_chunk_sections(chunk_id, article, section_anchor, at)`** —
|
|
422
|
-
per-section idempotency ledger (Lucien's `synthesized_bucket_chunks`, at
|
|
423
|
-
section granularity).
|
|
424
|
-
- **`buckets` / `chunk_buckets`** — kept only as an **optional staging queue**
|
|
425
|
-
for sub-notable entities; not on the routing path. May ship empty.
|
|
426
|
-
- `PRAGMA foreign_keys = ON` + `ON DELETE CASCADE` (fixes Lucien's orphan
|
|
427
|
-
edges). DB is rebuildable cache; truth = vault + git.
|
|
428
|
-
|
|
429
|
-
---
|
|
430
|
-
|
|
431
|
-
## Build sequence (cold-start first — vault is empty)
|
|
432
|
-
|
|
433
|
-
1. **SEGMENT** to the e4b chunk adapter (the one adapter in hand); verify
|
|
434
|
-
single-topic chunks + labels on real pi sessions.
|
|
435
|
-
2. **ENTITY-EXTRACT** base+policy; eval entity precision/recall vs a gold entity
|
|
436
|
-
set distilled from the Lucien corpus (article titles ≈ gold entities).
|
|
437
|
-
3. **ROUTE** — deterministic name/alias index + binary disambiguation; from zero
|
|
438
|
-
every substantive entity → CREATE a {{stub}}.
|
|
439
|
-
4. **CREATE flow** (sub-cluster → outline → per-section draft + **seed
|
|
440
|
-
infobox**) behind the conservative gate — gets us from zero to first entity
|
|
441
|
-
articles, each with a queryable infobox.
|
|
442
|
-
5. **NORMALIZE** (deterministic footnote/wikilink/infobox) — `vault.ts` resolver
|
|
443
|
-
exists.
|
|
444
|
-
6. **SECTION-ROUTE + PATCH** (steady state) once articles exist to update.
|
|
445
|
-
7. **WIKIFY** structural pass (infobox upkeep, summary-style splits, series,
|
|
446
|
-
See-also) once articles accumulate enough to drift — and to retrofit the
|
|
447
|
-
split-out of specific things (S5IIX) from broad ones (Camera Gear).
|
|
448
|
-
|
|
449
|
-
Steps 1-5 are cold-start (zero → first entity articles with infoboxes); 6-7 are
|
|
450
|
-
steady state. The **first verifiable win** is: ingest a camera conversation →
|
|
451
|
-
get a `Panasonic_S5IIX` article whose infobox has `Mount: [[L-Mount]]`, with the
|
|
452
|
-
read agent able to traverse that fact for the north-star lens query.
|
|
453
|
-
|
|
454
|
-
## Open questions (carried + new)
|
|
455
|
-
|
|
456
|
-
- **Domain vs specific granularity:** when ENTITY-EXTRACT should emit only the
|
|
457
|
-
broad domain vs also the specific thing (and when WIKIFY should split a thing
|
|
458
|
-
out of a domain). Heuristic: emit both; let create-threshold + summary-style
|
|
459
|
-
split decide what becomes its own page.
|
|
460
|
-
- **Entity canonicalization recall:** measure lexical-shortlist recall over
|
|
461
|
-
titles+aliases *first* (the bucketing-stage.md "measure the shortlist ceiling"
|
|
462
|
-
discipline, applied to names); only add the embedding fallback narrower if
|
|
463
|
-
lexical recall is insufficient.
|
|
464
|
-
- **Create-vs-strong-model for bootstrap** (carried): is first-creation good
|
|
465
|
-
enough local, or is bootstrap the one place a stronger model earns its cost?
|
|
466
|
-
- **Provisional/temporal facts:** the `as of` convention for trajectory claims.
|
|
467
|
-
- **Infobox schema per entity-kind:** a small set of templates (camera, lens,
|
|
468
|
-
person, project) so infobox fields are consistent enough to query.
|
package/docs/planning/IDEAS.md
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# Ideas
|
|
2
|
-
|
|
3
|
-
Framing, positioning, and vision notes for mlx-bun — the "what is this, really"
|
|
4
|
-
captures. Technical prototype theses live in [ResearchTopics.md](ResearchTopics.md);
|
|
5
|
-
work in flight lives in [PLAN.md](../../PLAN.md).
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Positioning: what mlx-bun is becoming
|
|
10
|
-
|
|
11
|
-
### The finite-matrix local AI appliance
|
|
12
|
-
|
|
13
|
-
`mlx-bun` can be a local AI product in a way generic LLM runtimes cannot. On
|
|
14
|
-
MLX, the hardware universe is Apple Silicon Macs: a finite list of real shipped
|
|
15
|
-
chip/RAM/bandwidth combinations. The supported model universe is curated, and
|
|
16
|
-
the runtime usually knows the task mode: chat, tool use, vision, eval,
|
|
17
|
-
training, adapter routing, or background automation.
|
|
18
|
-
|
|
19
|
-
That means the default path can be a table of measured choices instead of a
|
|
20
|
-
pile of user-facing knobs:
|
|
21
|
-
|
|
22
|
-
```text
|
|
23
|
-
physical Mac SKU + model checksum + task mode -> optimized execution plan
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
The plan can choose the model, context budget, KV policy, adapter policy,
|
|
27
|
-
kernel route, compile route, and memory envelope before the user has to care.
|
|
28
|
-
The user runs `mlx-bun`; the system gives them the most useful local assistant
|
|
29
|
-
their Mac can comfortably run. Power users still get the stick-shift controls,
|
|
30
|
-
but the product default is curated.
|
|
31
|
-
|
|
32
|
-
This is also why optimization work belongs in the product vision, not just the
|
|
33
|
-
lab notebook. Loop unrolling, branch deletion, DAG extraction, custom kernels,
|
|
34
|
-
compiled graph tables, Cut Cross Entropy, Liger-style fused heads, and
|
|
35
|
-
ORPO-trained adapters matter when they move a real device/model profile from
|
|
36
|
-
"cute demo" to "leave it running because it is useful."
|
|
37
|
-
|
|
38
|
-
### Local in the deeper sense
|
|
39
|
-
|
|
40
|
-
Two phrases that capture the thesis — especially **mlx-bun × Lucien**:
|
|
41
|
-
|
|
42
|
-
1. **"A truly local model in a deeper sense."**
|
|
43
|
-
Not just local *compute* (runs on your Mac, nothing leaves it) — local to
|
|
44
|
-
*you*: grounded in your own context and memory, not only your hardware.
|
|
45
|
-
|
|
46
|
-
2. **"The best model at being yours."**
|
|
47
|
-
Not the best model in the absolute / benchmark sense — the best at *being
|
|
48
|
-
yours*. A small local model, fine-tuned and wired to your personal memory,
|
|
49
|
-
can lose every general benchmark and still win the only one that matters here.
|
|
50
|
-
|
|
51
|
-
**The connection — Lucien × mlx-bun.** Lucien (the Dreaming) is the synthesized,
|
|
52
|
-
persistent memory of *you*; mlx-bun is the local, private model runtime.
|
|
53
|
-
Combined: a model that runs entirely on your machine **and** is continuously
|
|
54
|
-
grounded in your own accumulated context — local in both senses, and yours in a
|
|
55
|
-
way no hosted frontier model can be.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
## Library/app split (idea only — NOT planned, Josh 2026-07-05)
|
|
59
|
-
|
|
60
|
-
Two pulls: "one executable, everything you want to do with local AI" (the
|
|
61
|
-
product's charm) vs "some people just want a JS ML library — do they need
|
|
62
|
-
the rest?" The runtime-isolation work (2026-07-05) drew the exact boundary
|
|
63
|
-
either future needs: the engine child = the GPU stuff (src/model, src/mlx,
|
|
64
|
-
caches, scheduler, generate); the parent = the app (serve/UI/registry/
|
|
65
|
-
jobs/proxy). If a split ever happens it is a PACKAGING decision, not a
|
|
66
|
-
refactor — e.g. npm subpath exports (mlx-bun/model vs the full CLI bundle)
|
|
67
|
-
so library users import only the core. Library usage is unaffected by
|
|
68
|
-
isolation today (in-process generate(), no server involved). Revisit only
|
|
69
|
-
if Josh decides; both directions stay open from the current structure.
|