Worth another bounded experiment, not a production concept index yet. Subjective review: 4 useful topical glosses, 4 partial glosses and 1 poor gloss beyond its first label. This is one model, one hand-picked dictionary and nine non-blind examples, not a benchmark. There is some promise in coarse labels, but no demonstration that subtraction recovers a note's meaning or improves on simple cosine ranking.
Run: 2026-09-18. Sources captured at 2026-09-18T15:23:23.759259+00:00 through the public notes REST API. All nine suggested sample keys were used. Model: text-embedding-3-small; 1536 dimensions; one request, 11,535 input tokens. At the documented $0.02 per million tokens, estimated embedding charge $0.0002307 (not a billing verification). No private-store notes were used.
API/model documentation: OpenAI model documentation; embedding guide.
Embedded each candidate and each note once. Input is the original content wording rendered from JSONHTL: headings, paragraphs, code, list items, table cells and visible link labels. JSON syntax, link destinations and top-level metadata are excluded. No stemming, lemmatization, summarisation or truncation. Exact source snapshots, input text, SHA-256 hashes and returned vectors are retained locally.
72 candidates were frozen before seeing results, informally selected from corpus keys/topics; fast/faster/fastest were added as explicit degree controls. Seven plural variants were merged to singular representatives, leaving 65 atoms. Full pairwise analysis covers all 2,556 unordered pairs. This is manual dictionary curation, not an automatic vocabulary-learning method.
Atoms are normalized to unit length. On each step choose the largest positive cosine against the current residual; record w = residual dot atom; subtract w * atom. Retain the original note-vector scale. Allow repeat selections; stop after at most 3 steps or residual/original norm < 0.5 (also stop if no positive projection). No orthogonal refitting. Weights are sequential projection coefficients, not probabilities or validated semantic salience.
Five mathematical/text-extraction tests pass: exact orthogonal recovery, threshold stopping, selection against the residual, nonorthogonal projection subtraction, and preservation of negation/degree/code/link text. Every live analysis step checks energy reduction equals weight squared and immediate orthogonality to the just-selected atom. Offline reruns use the cached embeddings.
Retained atoms: programming, philosophy, exception, error handling, logging, testing, correctness, simplicity, software design, note, documentation, metadata, hypertext, link, orphaning, information loss, versioning, concurrency, database, storage, JSON, API, command line, rendering, Python, concept, embedding, matching pursuit, retrieval, index, navigation, representation, language, meaning, memory, reasoning, artificial intelligence, agent, workflow, planning, email, gathering, summarising, security, infrastructure, authentication, backup, deployment, exercise, demonstration, coaching, fitness, assessment, GPS, location, tracking, accuracy, journey, timetable, astronomy, poetry, music, fast, faster, fastest.
| Merge | Cosine |
|---|---|
| exceptions → exception | 0.8728 |
| notes → note | 0.8740 |
| links → link | 0.8533 |
| concepts → concept | 0.5874 |
| embeddings → embedding | 0.7135 |
| indices → index | 0.6803 |
| agents → agent | 0.8752 |
Returned vector norms across all candidates and notes range 0.999413–1.000683; they carry no useful magnitude distinction in this run. Exact candidate norms are in pairs.json.
There was no numeric auto-merge threshold. The explicit working rule was to collapse grammatical number where it seemed topically dispensable, while keeping semantic neighbours separate. This merged even concept/concepts at 0.5874 and index/indices at 0.6803; it kept documentation/database at 0.6585, correctness/accuracy at 0.6193, and storage/memory at 0.6183 because their meanings differ. Degree variants stayed separate: fast/faster 0.6509, fast/fastest 0.6574, faster/fastest 0.7186. None was selected. The results do not establish linear grammatical directions.
Important sensitivity finding: using all 72 cached candidates changes 7 of 9 output sequences (including simple spelling changes). For concept-factorisation, the unmerged gloss is concepts 0.3587, versioning 0.2472, notes 0.1290; after merging it is versioning, hypertext, matching pursuit. Representation-not-language begins with embeddings 0.3341 instead of embedding 0.2706. Envoy and orphaning also switch leading labels. These are material changes, but do not establish that grammatical plurality itself is the cause; polysemy and model-specific word-form geometry are alternatives. The plural-collapse default is not harmless here.
| Note | Labels and projection weights | Residual norm ratio | Review |
|---|---|---|---|
| PROGRAMMING_RULES/philosophy | correctness 0.3654; philosophy 0.2388; Python 0.1533 | 0.8865 | Useful |
| PROGRAMMING_RULES/exceptions | error handling 0.5014; Python 0.1710; exception 0.0591 | 0.8461 | Partial; polarity lost |
| ideas/concept-factorisation | versioning 0.3423; hypertext 0.2097; matching pursuit 0.1387 | 0.9053 | Partial; misleading leading label |
| first-thoughts/representation-not-language | embedding 0.2706; matching pursuit 0.1954; reasoning 0.1344 | 0.9330 | Partial; mechanism over thesis |
| gdata-server/notes/design | note 0.3165; API 0.1850; software design 0.0818 | 0.9268 | Useful |
| envoy/design-phases | workflow 0.3389; versioning 0.2155; summarising 0.1408 | 0.9049 | Partial; one misleading label |
| README/orphaning | versioning 0.3710; note 0.2169; orphaning 0.1371 | 0.8924 | Useful, with emphasis caveat |
| TFG/exercise-demo-protocol | exercise 0.3840; demonstration 0.1999; coaching 0.1371 | 0.8910 | Useful |
| using-gps-data | GPS 0.4126; matching pursuit 0.1898; versioning 0.1355 | 0.8806 | Poor beyond the first label |
Source note; captured version 4; input SHA-256 c70609036f51e7a46696368526f0c03f53250ac580d8d55460df2eb3cb1304cc.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | correctness | 0.365379 | 0.365419 | 0.930843 |
| 2 | philosophy | 0.238834 | 0.256606 | 0.899675 |
| 3 | Python | 0.153262 | 0.170371 | 0.886522 |
Useful: Correctness and philosophy capture the explicit Right Thing argument; Python is a relevant implementation context. Simplicity and exception discipline are omitted, but the three labels are a defensible topical gloss.
No-subtraction baseline (top three original-vector cosines): correctness, philosophy, error handling.
Unmerged dictionary check: correctness 0.3654; philosophy 0.2388; Python 0.1533.
Source note; captured version 1; input SHA-256 0607dbdb76e6a766a2b6cb11f9fc772e84e9bf59d26d52edfb3e2aba023dff86.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | error handling | 0.501414 | 0.501360 | 0.865239 |
| 2 | Python | 0.170977 | 0.197585 | 0.848181 |
| 3 | exception | 0.059117 | 0.069691 | 0.846119 |
Partial; polarity lost: Error handling, Python and exception identify the subject. They cannot distinguish this note's instruction to let exceptions propagate from advice to suppress them. The smallest coefficient is exception (0.0591), despite its centrality: sequential weights are not calibrated importance. No negation correction or sign-flipping was applied. This is a gloss expressiveness failure; without contrastive sentence experiments it does not prove that this model's embedding itself discarded negation.
No-subtraction baseline (top three original-vector cosines): error handling, exception, Python.
Unmerged dictionary check: error handling 0.5014; Python 0.1710; exceptions 0.0914.
Source note; captured version 3; input SHA-256 69199aa59a4c44f8a423cf5ff772c39f3793f801ffd034ca01151bda84e660a0.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | versioning | 0.342318 | 0.342318 | 0.939584 |
| 2 | hypertext | 0.209734 | 0.223219 | 0.915877 |
| 3 | matching pursuit | 0.138659 | 0.151395 | 0.905320 |
Partial; misleading leading label: Hypertext and matching pursuit are directly relevant. Versioning is not the main topic, and the concept-index/retrieval purpose is obscured. This fails as a faithful three-label summary even though two labels are useful. The unmerged dictionary instead leads with concepts: this is a concrete warning about dictionary construction.
No-subtraction baseline (top three original-vector cosines): versioning, concept, note.
Unmerged dictionary check: concepts 0.3587; versioning 0.2472; notes 0.1290.
Source note; captured version 3; input SHA-256 871232bf3f48180056a6670ecfe5818ff8cb97243974ffe861109217658f5d94.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | embedding | 0.270609 | 0.270613 | 0.962688 |
| 2 | matching pursuit | 0.195380 | 0.202956 | 0.942653 |
| 3 | reasoning | 0.134414 | 0.142594 | 0.933020 |
Partial; mechanism over thesis: Embedding, matching pursuit and reasoning occur in the argument, but the result misses the main claim about representation versus language and the zone framing. Matching pursuit is a supporting analogy, not the whole thesis. The dictionary lacks zone and translation; representation and language were available but not selected.
No-subtraction baseline (top three original-vector cosines): embedding, meaning, concept.
Unmerged dictionary check: embeddings 0.3341; matching pursuit 0.1736; versioning 0.1254.
Source note; captured version 1; input SHA-256 4eb4c6415982a27a76fed8e029c09836d377b2952886ddc3eeb6c8e76be28d74.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | note | 0.316469 | 0.316459 | 0.948606 |
| 2 | API | 0.184954 | 0.194968 | 0.930402 |
| 3 | software design | 0.081763 | 0.087877 | 0.926803 |
Useful: Note, API and software design describe the thin notes client accurately. Command line and Python would be more specific, but the result is sensible. This very short note also retains most of its vector energy, so large residuals are not confined to long notes.
No-subtraction baseline (top three original-vector cosines): note, API, documentation.
Unmerged dictionary check: notes 0.3232; API 0.1682; software design 0.0807.
Source note; captured version 1; input SHA-256 6c0173a669f6552838bf584e1c0c571ad53c3a819cb31ed98861d6b54583ee4c.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | workflow | 0.338925 | 0.338924 | 0.940814 |
| 2 | versioning | 0.215550 | 0.229109 | 0.915789 |
| 3 | summarising | 0.140756 | 0.153699 | 0.904907 |
Partial; one misleading label: Workflow and summarising describe the phase-aware processing design. Versioning does not capture its state machine/context-bundle focus. State machine and context bundle are absent from this small dictionary; email and agent were present but lost. The unmerged result becomes notes/versioning/workflow, showing material sensitivity to the noun-form choice.
No-subtraction baseline (top three original-vector cosines): workflow, versioning, note.
Unmerged dictionary check: notes 0.3469; versioning 0.2055; workflow 0.1190.
Source note; captured version 5; input SHA-256 ee1120b836daeebf2e44093e45bd05e6a8a0e74915af5ee35394a5174753744f.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | versioning | 0.371028 | 0.371115 | 0.928587 |
| 2 | note | 0.216937 | 0.233675 | 0.902879 |
| 3 | orphaning | 0.137077 | 0.151857 | 0.892408 |
Useful, with emphasis caveat: Versioning, note and orphaning all describe substantial content. Version preservation occupies much of the source, which plausibly explains its dominance, but discoverability/link preservation is the main purpose. Link and information loss were available. Unmerged extraction leads with notes and promotes orphaning to second.
No-subtraction baseline (top three original-vector cosines): versioning, note, orphaning.
Unmerged dictionary check: notes 0.3849; orphaning 0.2336; versioning 0.1464.
Source note; captured version 1; input SHA-256 2ada40489cde8aaa2c5b8a2d2e2f23b0bd29552a02ff77bf47502309a4218905.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | exercise | 0.383994 | 0.383859 | 0.923392 |
| 2 | demonstration | 0.199888 | 0.216395 | 0.901513 |
| 3 | coaching | 0.137066 | 0.151986 | 0.891040 |
Useful: Exercise, demonstration and coaching are a clean description of the per-exercise teaching protocol. The plain top-three cosine baseline gives the same labels, so this success does not establish a benefit from subtraction.
No-subtraction baseline (top three original-vector cosines): exercise, demonstration, coaching.
Unmerged dictionary check: exercise 0.3840; demonstration 0.1999; coaching 0.1371.
Source note; captured version 8; input SHA-256 77f00a4577fe1d59daf8118fb03fe7234c9b089acebdccaba2da9921aaeb8a5e.
| Step | Atom | Projection weight | Residual cosine | Residual/original norm |
|---|---|---|---|---|
| 1 | GPS | 0.412568 | 0.412570 | 0.910926 |
| 2 | matching pursuit | 0.189790 | 0.208349 | 0.890935 |
| 3 | versioning | 0.135469 | 0.152053 | 0.880576 |
Poor beyond the first label: GPS is correct. Matching pursuit is not the procedure taught by this note, and versioning is not a useful summary label. A possible explanation is residual selection latching onto point-matching language and notes-system vocabulary, but that is a hypothesis. The original-vector baseline GPS/tracking/navigation is substantially more sensible. Missing gazetteer/PostGIS atoms may hurt coverage, but suitable broad alternatives already existed.
No-subtraction baseline (top three original-vector cosines): GPS, tracking, navigation.
Unmerged dictionary check: GPS 0.4126; matching pursuit 0.1898; notes 0.1481.
Dictionary: improve vocabulary coverage and test canonicalization before committing to a lattice. Open extraction followed by canonical labelling is worth comparing, but this experiment did not implement it and cannot select a winner. Keep word-form candidates during extraction for the next comparison; map their output labels afterward as a separate measured step. Do not pick a universal cosine threshold from these examples. Add state machine, context bundle, gazetteer and PostGIS only in a separately recorded follow-up, rather than tuning this run's dictionary after seeing its failures.
Subtraction: plain pursuit sometimes gives useful diversity (note/API/software design), but can degrade a good baseline (GPS/tracking/navigation). No atom was selected twice within three steps. Nevertheless later correlated atoms leave nonzero projections on previously selected ones: for the exercise note, final residual dot exercise is -0.1424. This is expected for plain pursuit and means the coefficients are order-dependent. OMP is worth testing as a numerical control; it cannot repair missing labels, a misleading first pick, or polarity by itself. No OMP experiment was performed here, so superiority is unproven.
Residuals: all nine hit the three-step cap; none reaches 0.5. Final norm ratios are 0.8461–0.9330, leaving 71.6–87.1% of squared vector norm. The geometric reconstruction is weak. Neither residual norm nor removed vector energy measures a percentage of meaning recovered. Also, for the specified stop rule, increasing the threshold stops earlier with fewer labels; decreasing it generally permits more iterations. The opposite wording in the design note's coarse/fine explanation should not be used to implement the algorithm.
Negation: the exception note loses its prescriptive direction in the labels. Representation-not-language also loses its contrastive thesis, and the orphaning label cannot say whether to prevent or cause orphaning. Bag-of-labels output should remain navigation metadata, never a substitute for reading instructions. A next experiment could use explicit contrast pairs and phrase atoms, but neither was added to this pass.
Workspace: /home/john/py/gloss. prototype.py performs prepare/embed/analyse; test_prototype.py checks the math and extraction; make_report.py assembles this reviewed report. requirements.txt lists numpy, requests and openai. API credentials are read from the environment and never written into artifacts. The prototype does not write notes itself; this report was published separately through the Notes connector and linked from gloss.
cd /home/john/py/gloss
python -m unittest -v
# Offline, no API charge:
python prototype.py analyse
# New capture/embedding run, separate directory:
python prototype.py prepare --directory artifacts/new-run
python prototype.py embed --directory artifacts/new-run
python prototype.py analyse --directory artifacts/new-run
Artifacts under artifacts/2026-09-18/: keys.json (corpus inventory), inputs.json (sources, text and hashes), embeddings.json (cached vectors/model/usage), pairs.json (all candidate-pair cosines and norms), results.json (weights, residuals, baseline and merge sensitivity), report.json (this note). Preserve these to reproduce this run even if source notes or model aliases change.
Parent: Gloss; specification: Handover to Codex; design: Concept Factorisation.