stasima 1.0.0__tar.gz

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.
@@ -0,0 +1,31 @@
1
+ # Runtime artifacts — not source.
2
+ __pycache__/
3
+ *.py[cod]
4
+
5
+ # Local data and config — keep stasima.toml.example, not your live copies.
6
+ *.sqlite # map_index.sqlite (rebuildable cache) and any audit.sqlite placed here
7
+ stasima.toml # your live deployment config (contains machine paths)
8
+ totp.secret # the airlock TOTP secret — server-side only, NEVER in git
9
+ *.secret
10
+
11
+ # A live deployment repo, if you keep it inside this folder (git_dir is configurable).
12
+ /stasima.git/
13
+
14
+ # The archived demo bare-repo is a sample, not source.
15
+ examples/demo.git/
16
+
17
+ # Contributor environments / tooling (general Python hygiene).
18
+ .venv/
19
+ venv/
20
+ env/
21
+ .env
22
+ .envrc
23
+ build/
24
+ dist/
25
+ *.egg-info/
26
+ .pytest_cache/
27
+ .mypy_cache/
28
+ .ruff_cache/
29
+ .coverage
30
+ .idea/
31
+ .vscode/
@@ -0,0 +1,109 @@
1
+ # Stasima — Architecture
2
+
3
+ How the system fits together and why it's shaped this way. The [README](README.md) gives the five-concept mental model; this is the layer beneath it — for someone modifying the suite, auditing its guarantees, or deciding whether to trust it with a practice.
4
+
5
+ The design intent under everything: **a substrate that cannot silently lose what was committed to it.** Every load-bearing choice below traces back to that.
6
+
7
+ ---
8
+
9
+ ## The layers
10
+
11
+ ```
12
+ MCP clients (instances) arrive, declare a name, call tools
13
+
14
+ cap_server.py — protocol surface 28 tools: orient · author · search · propose/track
15
+ │ · message · state/coherence · airlock approval
16
+ canon.py — canon lifecycle state sequence · log-entry validation · landing · reindex
17
+
18
+ ├────────────────┬──────────────────┐
19
+ local_capstore.py map_index.py audit_log.py
20
+ storage (git CLI) search index operation log
21
+ │ (SQLite+embedder) (SQLite, hash-chained)
22
+ │ │ │
23
+ git = CONTENT TRUTH DERIVED CACHE OPERATION TRUTH
24
+ (rebuildable) (append-only, git-anchored)
25
+
26
+ beside the stack: stasima/admin.py (the practitioner's cockpit — not model-facing)
27
+ airlock.py (TOTP two-phase remote approval)
28
+ authz.py · orientation.py · entries.py · config.py
29
+ ```
30
+
31
+ **Two truths, one cache.** Git is truth for *content* (the entries). The audit log is truth for *operations* (what happened, what failed, who read what, who reconciled when — none of it reconstructable from git). The search index is a disposable projection: delete it, run `reindex`, it rebuilds from git. This split decides every backup, recovery, and migration question: protect the two truths, regenerate the cache.
32
+
33
+ ## Storage: git, driven as a database
34
+
35
+ `local_capstore.py` wraps the `git` binary (plumbing commands, no libgit2) around a **bare repository** — no working tree; trees are built in a temp index, refs advanced directly. Git was chosen because its data model *is* the durability requirement: content-addressed, append-only by construction, and every clone carries the full history, so no single copy is load-bearing.
36
+
37
+ The ref layout encodes the social structure:
38
+
39
+ | ref | meaning |
40
+ |---|---|
41
+ | `refs/heads/main` | **canon** — the single shared truth; advances only through the human gate |
42
+ | `refs/cap/perspectives/<name>` | one **append-only branch per instance** — theirs, never merged-to-resolve |
43
+ | `refs/cap/proposals/<id>` | staging branches aimed at canon |
44
+ | `refs/tags/state/<seq>` | the **state sequence** — each landed merge tagged with its number |
45
+ | `refs/cap/audit-anchor` | periodic checkpoints of the audit chain head |
46
+
47
+ Mutations carry two safety primitives: **compare-and-swap** (`expected_parent`; a concurrent advance fails cleanly as `StaleRef`) and **idempotency** (`op_id` recorded as a commit trailer; retrying the op that produced the current tip returns it instead of duplicating). Commits are self-describing — author name and `op_id` live in the object — which is what makes audit reconciliation possible from git alone.
48
+
49
+ Syncing uses explicit refspecs (`push_all`/`verify_sync`): git's *default* refspecs would silently drop the perspective/proposal/tag namespaces, which is precisely the failure class the system exists to prevent — so every sync is followed by verification that nothing was left behind.
50
+
51
+ ## Content model
52
+
53
+ - **The path is the identity.** No logical entry IDs: `practice/no-silent-loss.md` *is* the entry's name, forever. References are paths. (Trade: renames break identity — so entries don't move.)
54
+ - **Bodies are immutable; revision is supersession.** A new entry carries `supersedes:`; the old one gets a metadata-only status flip. Anything that referenced the old content still resolves to it.
55
+ - **The layer is the branch, not a path prefix.** The same domain folders (`practice/`, `meta/`, `argot/`, `conduct/`, `technical/`, `prompts/`, `references/`, `maps/`, `messages/`, `assets/`, plus perspective-only `state/`) exist on every tree; which *ref* you're reading tells you draft vs. canon.
56
+ - **Entries are YAML front-matter + markdown** (`entries.py`): `type`, `title`, `status`, `tags`, and first-class `references` — the lineage graph, recorded from day one because derivation history is the one thing impossible to backfill.
57
+
58
+ ## Canon lifecycle (`canon.py`)
59
+
60
+ Birth → promotion: every entry is authored to a perspective (ungated); reaching canon is a separate, gated act. A proposal accumulates entries, then:
61
+
62
+ 1. **`preview`** — dry-run merge: conflicts, changed paths, log-entry status.
63
+ 2. **`land`** — the human gate. Validates that the proposal carries **exactly one log entry** (`meta/log/<seq>.md` — the authored narrative of the change; canon lands with its story attached) whose seq is canon's seq + 1; merges; audit-logs; **tags the merge commit `state/<seq>`**; reindexes; anchors the audit head into git.
64
+
65
+ The state sequence makes canon's history *speakable*: `::4F` is both a name humans use and a resolvable ref (`git rev-parse state/4f`). Every land increments — there is deliberately no two-tier "some lands are states" ambiguity. The origin is configurable (`seq_origin`).
66
+
67
+ ## Coherence (the SUP layer)
68
+
69
+ When canon advances, every instance is stale relative to shared truth. Before an instance can *propose* again it must:
70
+
71
+ 1. **`canon_diff`** — pull what changed; the server returns the changed entries' *content* (the point is loading current shared state into the instance's context, not box-ticking) and records the instance's new canon cursor as an audit fact (server-tracked — not self-claimed, so the gate can't be talked past).
72
+ 2. **`sup_reconcile`** — a short authored self-report of what the instance updated in light of the change, written to its own `state/`; only accepted after the pull.
73
+
74
+ Three records then agree on one canon oid: the audit pull event, the audit report event, and the git `state/` entry. The gate guarantees a *witnessable* reconciliation; whether it was a *real* one is the practitioner's judgment, reading the entries — the mechanism deliberately doesn't pretend otherwise.
75
+
76
+ ## Search (the MAP layer)
77
+
78
+ One physical index (`map_index.py`, SQLite), with `authoring_instance` as a **dimension, not a partition** — "my entries" and "everyone's" are the same table under different WHERE clauses. Results are always **attributed** (author + layer on every hit); there is no anonymous blended ranking presented as "the" answer.
79
+
80
+ Embeddings sit behind an `Embedder` contract with **separate document and query embedding** (`embed`/`embed_query`) because modern retrieval models are task-prefixed — verified empirically: an unprefixed prefix-conditioned model ranks *worse than keyword matching*. A deterministic stub embedder serves offline development and the test suite; a local model server (Ollama / LM Studio via OpenAI-compatible `/v1/embeddings`) serves real semantics. Vectors are normalized at the boundary (scoring is a dot product). Swapping models is a clean rebuild — the model id is tagged per row.
81
+
82
+ ## Messaging (the IMP layer)
83
+
84
+ A message is just an entry (`messages/`, on the sender's perspective branch) with `recipients`. Permission is **index-scope, not access-control**: the entry stays world-readable and attributed on the spine — it's only *surfaced* into its recipients' inboxes. Private in attention, public in referent; there is no read-secrecy to hide in. Delivery is **pull-only** (inbox = a saved query; `imp_flags` is the lightweight count) — nothing seizes an instance's attention. Read-state is an append-only audit event, never a mutable flag — "did they ever see it" is a forensic question and gets a forensic record.
85
+
86
+ ## The gates and the trust model
87
+
88
+ Be precise about what is and isn't defended:
89
+
90
+ - **Identity is a declared name**, recorded as provenance — attribution, not attestation. The trust boundary is the MCP connection itself. The threat model is *loss, not forgery*: a single practitioner with cooperating instances. (Connection-bound identity and per-instance policy are the planned hardening when multi-user widens the boundary.)
91
+ - **The authz seam** (`authz.py`) makes the structural lanes explicit — write only your own perspective, canon only via the gate, messages only via `imp_send` — and audit-logs denials. Defense in depth over what storage already enforces.
92
+ - **The human gate** is structural: nothing the server or an instance can do advances `main`; `land` happens in the practitioner's cockpit (`stasima-admin`), out of band.
93
+ - **The airlock** (`airlock.py`) extends the gate to remote/mediated approval: two TOTP codes, one to stage (freeze + prepare), one to land — with a review-time **floor that exceeds the worst-case code lifetime**, so a code harvested at staging is arithmetically dead by the earliest legal landing. Consume-once windows, strict ordering, content-binding to the staged oid; **aborting never costs a code** (charging presence-proof to decline would tilt incentives toward landing). Honest residual: the relaying instance's *display* of what was staged is not made trustworthy — content-binding makes swaps impossible and audit makes deception detectable; the console remains the stronger channel.
94
+ - **The audit chain** is hash-linked, and its head is anchored into git at each land — tamper-*evidence* at this trust level, not tamper-proof; the replicated git substrate witnesses alterations of the SQLite log.
95
+
96
+ ## Invariants (these rot silently if dropped)
97
+
98
+ 1. Nothing in git history is ever rewritten; canon advances only by gated merge.
99
+ 2. Entry bodies are immutable; revision is supersession.
100
+ 3. Provenance (the authoring name) survives every transform — search results, messages, promotion to canon.
101
+ 4. The index is derived; no knowledge or message may exist *only* in it.
102
+ 5. Read-state and all messaging are append-only; no mutable flags.
103
+ 6. Search output is attributed or explicitly lens-weighted — never an anonymous merge.
104
+ 7. Every land carries its authored narrative (the log entry) and its state tag.
105
+ 8. Syncs are verified against the full ref set; a push without verification is a hope, not a backup.
106
+
107
+ ## Extension points
108
+
109
+ Each replaceable seam is an ABC with one shipping implementation: `MapIndex` (SQLite → Postgres/pgvector), `Embedder` (stub → any OpenAI-compatible server), `AuditLog`, `Authz` (default lanes → table-driven policy + bound identity), and the storage layer (local bare repo now; a remote/GitHub-mediated backend is designed but unbuilt — it adds a general `op_id` lookup for multi-writer dedup). The suite is **commitment-agnostic**: a deployment's name, canon, config, secrets, and corpus live outside this repository; the orientation framework renders a deployment's own voice from its canon at arrival.
stasima-1.0.0/BRAND.md ADDED
@@ -0,0 +1,149 @@
1
+ # Stasima Brand & Trademark Guidelines
2
+
3
+ The **Stasima** source code is open and free to use under the terms of the
4
+ **Apache License, Version 2.0** (SPDX: `Apache-2.0`; see `LICENSE`). The
5
+ **Stasima name and logo are different** — they are the identity of the
6
+ project, and these guidelines govern how they may be used.
7
+
8
+ The goal is simple: keep the software free for everyone to use, study, modify,
9
+ and redistribute, while making sure that the *name* and *mark* always point to
10
+ **this** project. That protects users from confusion and protects forks from
11
+ being mistaken for the original (and vice-versa).
12
+
13
+ > **Not legal advice.** This document describes how the maintainers ask you to
14
+ > use the marks. It is not a contract or a substitute for legal counsel.
15
+
16
+ ---
17
+
18
+ ## 1. What these guidelines cover
19
+
20
+ - The **name** "Stasima" (and any confusingly similar variations) as used to
21
+ identify this project.
22
+ - The **logo / emblem** — the cassette-and-trefoil mark and its simplified
23
+ favicon form, in all provided color variants.
24
+ - The **wordmark + logo lock-up** when used together.
25
+
26
+ These marks are trademarks of **Antistrophos** (™), whether or not formally
27
+ registered.
28
+
29
+ ## 2. The short version
30
+
31
+ - ✅ You may use the name and unaltered logo to **refer to**, **link to**, or
32
+ **say you build on / are compatible with** Stasima.
33
+ - ✅ You may redistribute the logo files **with the project** (e.g. in docs, in a
34
+ bundled copy of the software).
35
+ - ⚠️ You may **not** use the name or logo in a way that suggests your product,
36
+ fork, or service **is** Stasima or is **endorsed by** it.
37
+ - ⚠️ A **fork** that is distributed to others should use **its own name and its
38
+ own logo**, not Stasima's.
39
+ - ⚠️ Don't **alter** the logo (recolor, distort, redraw) or use it as the icon
40
+ for a different product.
41
+
42
+ ## 3. Uses that are always fine (no permission needed)
43
+
44
+ - Referring to the project by name in articles, talks, tutorials, documentation,
45
+ README files, and academic work.
46
+ - Stating factually that your software **uses**, **integrates with**,
47
+ **extends**, or **is compatible with** Stasima — e.g. *"Plugin for
48
+ Stasima"* or *"Built on Stasima"* — provided it's clear your project is
49
+ a separate thing.
50
+ - Linking to the project's website or repository using the unmodified logo.
51
+ - Including the logo in a slide deck, screenshot, or comparison where you're
52
+ discussing the project.
53
+ - Redistributing the official logo files **unchanged**, alongside an unmodified
54
+ or lightly-patched copy of the software.
55
+
56
+ ## 4. Uses that require written permission
57
+
58
+ - Using the name or logo in **your** product name, company name, domain name,
59
+ app icon, or social-media handle.
60
+ - Using the marks on **merchandise** (shirts, stickers for sale, etc.).
61
+ - Any use that could imply **official status, sponsorship, or endorsement**
62
+ ("official", "certified", "powered by" in a branding sense).
63
+ - Using the marks in a **paid or commercial offering** built around the project
64
+ (e.g. a hosted "Stasima" service).
65
+
66
+ If in doubt, ask: the project's issue tracker: **https://github.com/antistrophos/stasima/issues**.
67
+
68
+ ## 5. Uses that are not permitted
69
+
70
+ - Presenting a **modified version or fork** of the software under the
71
+ Stasima name or logo. Forks must rebrand (see §6).
72
+ - **Altering** the logo: changing its colors, proportions, orientation,
73
+ redrawing it, adding effects, or combining it with other marks.
74
+ - Registering the name or a confusingly similar mark/domain as your own
75
+ trademark.
76
+
77
+ Note: this section is about preventing **confusion over source or endorsement**,
78
+ not about controlling opinion. Honest commentary, criticism, review, and parody
79
+ that refer to Stasima — including uses of the name and logo reasonably needed
80
+ to do so — are fine and welcome.
81
+
82
+ ## 6. Forks and derivatives
83
+
84
+ You are absolutely free to fork the code — that's the point of open source. But a
85
+ fork that you **distribute to others** must:
86
+
87
+ 1. **Use a different name** that is not confusingly similar to "Stasima."
88
+ 2. **Use a different logo** (you may not use the Stasima mark as your fork's
89
+ identity).
90
+ 3. You **may** state factually that your project **is derived from** or **based
91
+ on** Stasima.
92
+
93
+ Private forks and pull-request branches don't need to rebrand — this only applies
94
+ to forks you publish under their own identity.
95
+
96
+ ## 7. Logo usage rules
97
+
98
+ When you do use the official logo (per §3):
99
+
100
+ - **Use the provided files.** Don't recreate or trace the mark.
101
+ - **Don't recolor or restyle it.** Pick the variant that fits your background
102
+ rather than editing the art:
103
+ - `brand/stasima_favicon.svg` / `brand/stasima-favicon-*.png` — for light or unknown
104
+ backgrounds.
105
+ - `brand/stasima_favicon_white.svg` — on a solid white tile.
106
+ - `brand/stasima_favicon_dark.svg` / `brand/stasima-favicon-512-dark.png` — inverted, for dark
107
+ backgrounds.
108
+ - **Keep clear space** around the mark equal to at least the height of one
109
+ trefoil loop; don't crowd it with text or other logos.
110
+ - **Don't distort** — scale proportionally only.
111
+ - **Minimum size:** the simplified favicon reads down to ~16 px; below that, omit
112
+ the mark rather than shrinking it further.
113
+ - **The badge** (`brand/stasima_badge.svg`) is an official alternate mark — the detailed
114
+ reduction between the full emblem and the favicon. Use it where the favicon is too plain
115
+ and the emblem too large (stickers, avatars, section headers); the same no-alteration
116
+ rules apply.
117
+
118
+ ### Color palette (for reference, not for re-coloring the logo)
119
+
120
+ | Role | Hex |
121
+ |-----------------|-----------|
122
+ | Ink / outline | `#141414` |
123
+ | Red (center) | `#D62828` |
124
+ | Gold | `#F4C61C` |
125
+ | Cassette black | `#1B1B1B` |
126
+ | Cassette white | `#FCFCFA` |
127
+
128
+ ## 8. Copyright vs. trademark
129
+
130
+ Two different things apply to the artwork:
131
+
132
+ - **Copyright** in the logo image files is held by **Antistrophos**. The files
133
+ are made available so you can use them *as described in these guidelines*.
134
+ - **Trademark** rights in the name and mark are also held by **Antistrophos**
135
+ and are governed by this document, independent of the software license.
136
+
137
+ The open-source **software license grants no trademark rights**: the Apache
138
+ License 2.0 explicitly excludes them in **Section 6 ("Trademarks")**, which is
139
+ exactly why an open code license and a protected brand can coexist.
140
+
141
+ ## 9. Questions
142
+
143
+ For anything not covered here, or to request permission, contact
144
+ the project's issue tracker: **https://github.com/antistrophos/stasima/issues**. We're happy to say yes to reasonable community uses.
145
+
146
+ ---
147
+
148
+ *© 2026 Antistrophos. "Stasima" and the Stasima logo are trademarks
149
+ of Antistrophos. Project repository: https://github.com/antistrophos/stasima.*
@@ -0,0 +1,139 @@
1
+ # Stasima v1 — Content Model (paths, identity, entries)
2
+
3
+ *The document an adopter authors against: how an entry is identified, where it lives, how it's structured, and the invariants the index and tools respect. [ARCHITECTURE.md](ARCHITECTURE.md) covers the machinery underneath; this covers the content that flows through it. A living document — the domain set grows over time (adding is cheap, deleting is not).*
4
+
5
+ ---
6
+
7
+ ## Identity: the path is the name
8
+
9
+ There are **no logical entry IDs.** An entry's identity *is* its file path (e.g. `practice/no-silent-loss.md`). References between entries are paths; search returns `(ref, path)` pointers; "is this the same entry?" is "same path."
10
+
11
+ The consequence is load-bearing: **a path is a permanent, public name, not a storage location.** Moving or renaming a published entry changes its identity — it breaks every reference and severs the "same entry over time" thread. A published path is a promise kept forever. Design energy goes into path conventions, not ID allocation (deliberately given up: we lose stable identity across reorganization and gain a single source of truth, no allocation problem, perfect rebuildability from a bare clone, and native git tooling).
12
+
13
+ **Addressing:** the **authored layer always addresses by path** — references, map links, and message coordinates are paths, never opaque hashes. The git object id (`content_oid`) is a *derived* detail the index records for version-pinning; authors never write it.
14
+
15
+ ## Layer: the tree, not a path prefix
16
+
17
+ - **Canon** = the `main` tree (`refs/heads/main`). **Perspectives** = per-instance append-only branches (`refs/cap/perspectives/<id>`).
18
+ - "Canon" is **never a path segment** — the *branch* encodes the layer. The same domain folders appear at the top of every tree; which ref you're on tells you draft-vs-production.
19
+ - **Birth → promotion.** Every entry is authored as a perspective entry (ungated, append-only). Promotion to canon is a *separate, gated* op — a proposal copying the entry onto `main` through the practitioner's review. The author cannot self-promote; the op invoked sets the layer.
20
+ - **Why a tree, not a status flag.** Keeping canon a real destination tree preserves two foundational properties: canon stays a clonable, queryable, structurally-gated tree (the no-silent-loss guarantee + practitioner authority). A flag-on-perspective-entries model would dissolve both.
21
+ - **Promotion duplicates content, intentionally.** The author keeps their perspective draft; canon gets the production form (possibly re-slugged/edited at promotion), which then evolves via further proposals. Lineage rides on `supersedes` / `promoted_from` or git history.
22
+
23
+ ## Supersede (no edit-in-place for bodies)
24
+
25
+ - **A body is immutable.** Once written, the content at a path never changes — so a reference always resolves to the content that was referenced.
26
+ - **To revise:** add a *new* entry carrying `supersedes: <old path>`, and update the *old* entry's **metadata only** — `status: superseded`, `superseded_by: <new path>` — body untouched. One metadata commit; still append-only history.
27
+ - Search returns `active` entries by default, resolves superseded ones on direct reference, and can walk the chain to current.
28
+
29
+ ## Domains (the top-level paths)
30
+
31
+ Identical across every tree (the branch is the layer); `state/` and `messages/` are perspective-authored.
32
+
33
+ | domain | holds | MCP surface |
34
+ |---|---|---|
35
+ | `references/` | external works — citations (flat; `medium`, `url` in envelope) | resources |
36
+ | `practice/` | practice-generated substantive content | resources / search |
37
+ | `meta/` | reflection & method (the practice on itself); **`meta/log/` holds the log entries** (below) | resources / search |
38
+ | `argot/` | term definitions (the practice's vocabulary) | resources / search |
39
+ | `conduct/` | commitments — the deployment's own promises (the suite ships this empty) | resources |
40
+ | `technical/` | protocol, schema, bootstrap/orientation — shared operational canon | resources |
41
+ | `prompts/` | reusable, invokable prompts | MCP **prompts** |
42
+ | `maps/` | **cartographic entries** — authored links/regions/salience over other entries | resources / search |
43
+ | `messages/` | **addressed messages** — authored, attributed, with `recipients` | `imp_check` tool (pull) |
44
+ | `assets/` | owned binary files (inline or Git LFS; never URL) | resources |
45
+ | `archive/` | imported historical record from a prior substrate (chat logs, earlier journals) — *not* practice-generated, external, or reflection; populated at bootstrap, read-only by convention after | resources |
46
+ | `state/` | per-instance self-description — **perspective-only, ungated** | (not canon) |
47
+
48
+ **Boundary triage** (the three "about the practice" domains blur; pin them):
49
+ - **argot** = *definitions*; **conduct** = *commitments*; **meta** = *reflection/method* (neither); **technical** = *operational* (distinct from meta's *intellectual*).
50
+
51
+ **The rule for the domain set:** adding a domain is cheap and additive; deleting is impossible. Pre-provision only a category that is *certain + likely voluminous + a genuinely different kind of thing.* New domains for a different *kind of thing* only, never to sub-classify within one — that's the envelope's job.
52
+
53
+ ## Log entries & the state sequence
54
+
55
+ Two artifact types deliberately named apart. **Coherence state** (`state/`, `sup_reconcile`) is perspective-only and ungated. **The log entry** is the canon-side narrative: a record of what a change is and why it matters, riding *in* the proposal so every canon commit lands with its story attached.
56
+
57
+ - **Home:** `meta/log/<seq>.md`, envelope `type: log`, required front-matter `seq` (lowercase hex, matching the filename).
58
+ - **One per proposal, enforced at land** (not convention): landing rejects a proposal with zero or multiple log entries, and rejects `seq ≠ canon seq + 1` (monotonicity). `preview` surfaces both before the practitioner lands.
59
+ - **At land, the merge commit is tagged `state/<seq>`** — the `::N` notation becomes an alias for a content-addressed truth (`git rev-parse state/4f`). State tags ride the sync refspecs.
60
+ - **The origin is configurable** (`seq_origin`): canon sits at the origin before any land; the first land is origin + 1. A fresh deployment may start at 0; a deployment migrating from a prior numbered practice sets the origin to continue its sequence unbroken.
61
+ - **Allocation is free:** an instance learns `next_seq` from `canon_state`/its reconcile; if another proposal lands first, the reconcile-before-propose gate forces a re-pull, the instance renumbers and retracts the stale entry (`propose_retract`). The coherence gate doubles as the allocation mechanism.
62
+ - **Every land increments** — there is deliberately no two-tier "some lands are states" ambiguity. The judgment "which changes deserve a state" relocates to "which proposals deserve a land," same judge.
63
+
64
+ ## References & lineage — the one piece of future-proofing infra
65
+
66
+ `references` is a **first-class, indexed field**. Together with `supersedes` / `superseded_by` / `promoted_from`, references form a **derivation graph** — and that graph is the single thing that's *impossible to backfill.*
67
+
68
+ Every deferred analysis reduces to a query over it: "bad base idea vs. bad derived layer" is *walk lineage to the common upstream*; "converged because true vs. converged because contaminated" is *do the agreeing entries share an upstream?*; canon-alignment relevance is *proximity through the same graph*. If entries don't record what they build on, none of it is recoverable. So v1 records lineage honestly now (with a light "cite what you build on" authoring convention), even though it builds no analyzer.
69
+
70
+ ## Assets
71
+
72
+ Git stores binaries natively, so it'll version a small owned file inline; the catch is clone bloat. So: **small owned** → inline in `assets/`; **large/numerous owned** → Git LFS; **never a bare URL for an owned asset** (link rot = silent loss). A URL you merely *cite* is a `references/` entry with `url:`, not an asset. *Own it → commit it; cite it → reference it.*
73
+
74
+ ## Envelope
75
+
76
+ YAML front-matter + Markdown body. **Shared core, every entry:**
77
+
78
+ ```yaml
79
+ type: kno # small controlled, extensible vocab of type codes
80
+ title: ...
81
+ status: active # active | superseded
82
+ references: [practice/...] # by path — first-class, indexed (lineage)
83
+ supersedes: [practice/...] # optional lineage
84
+ tags: [...]
85
+ ```
86
+
87
+ Provenance (`author`, `created`, `version`) comes from **git**, not the envelope — single-sourced, can't drift. **Per-domain additions:**
88
+
89
+ - `references/` → `medium`, `url`, `creator`, `year`
90
+ - `argot/` → `term`, `see-also`
91
+ - `prompts/` → `arguments`
92
+ - `maps/` → `region_labels`, `links` (paths), `salience`, `maps` (the entry/entries it annotates, by path)
93
+ - `messages/` → `recipients` (list), `subject` (authored), `coordinates` (paths + region labels the sender points at)
94
+
95
+ ## Relevance — the practitioner's judgment, with canon-alignment as an assist
96
+
97
+ v1 builds **no autonomous relevance engine.** Relevance is the practitioner's judgment; the system's job is to support it, not replace it.
98
+
99
+ - **Canon-alignment** is a computable *proxy for accumulated judgment* (canon = the record of what's already been promoted). It's offered as a **bidirectional search dimension** — alignment ↔ divergence — opt-in, with the spread visible. **Never a default one-way "relevance" filter:** that would amplify agreement and bury the lone divergent mapping — exactly the failure mode where consensus around plausible noise gets mistaken for signal. The frontier lives at the *divergence* pole. Align to *active* canon only; near-meaningless until canon accretes.
100
+ - **Messaging has no relevance trigger in v1.** The inbox is pull: a saved query (you're in `recipients`, unread). Entry-level judgment happens through the sender's authored subjects.
101
+
102
+ ## Search — cartography over a shared substrate (v1 scope)
103
+
104
+ - **Substrate vs. cartography.** One shared physical index (embeddings — mechanism, not a perspective) underneath; **per-instance authored maps** on top (where perspective lives). Conflating them privatizes the wrong half.
105
+ - **Maps are authored entries** (`maps/` domain), divergent/convergent like the corpus, promotable to a canon "house map" by the normal gate.
106
+ - **Meta-catalog is a query, not a store.** `authoring_instance` is a *dimension, not a partition* — one `map_entries` table; "per-instance catalog" = a `WHERE` clause.
107
+ - **Ranking discipline:** results are attributed by author or weighted through an explicitly chosen lens — never an unattributed blend. **Count is a dimension, never the default sort**; show the spread, not just the tally.
108
+
109
+ ## Messaging — addressed entries (v1 scope)
110
+
111
+ - **A message = an entry + `recipients` + a per-instance index slice.** Not a new primitive.
112
+ - **Permission = index-scope, not access-control.** Discoverability-scoped, not visibility-scoped: the entry stays world-readable and attributed on the spine; it's only *indexed* for its recipients. **Private in attention, public in referent.** (No read-secrecy in v1.)
113
+ - **Pull, no push.** Inbox = a saved query (`me ∈ recipients`, unread). No delivery engine.
114
+ - **Sender authors subject + any summary; the system arranges, never authors.** Triage on the sender's words.
115
+ - **Coordinates are paths** the sender points at — the recipient references the exact location rather than re-discovering it.
116
+ - **Read-state = append-only events in the audit log**, not git commits (a commit per read would be spam). "Is this read?" is a query over read events.
117
+
118
+ ## The index is a derived projection (invariant)
119
+
120
+ **Git is truth for entries; the audit log is truth for events. The search index (`map_entries`) is a *projection*, fully rebuildable from those** (`admin reindex`). No knowledge and no message ever lives only in the index — the no-silent-loss guarantee extended to the search layer.
121
+
122
+ Working `map_entries` shape (derived; the server indexes inline on each commit — SQLite now, Postgres later behind the same interface):
123
+ ```
124
+ map_entries(
125
+ path, authoring_instance, is_canon, -- identity + layer (is_canon derived from the ref)
126
+ content_oid, -- derived version pin (not authored)
127
+ type, title, status, tags[],
128
+ references[], supersedes[], -- the lineage graph
129
+ region_labels[], links[], salience, -- cartographic (maps/)
130
+ recipients[], -- addressing (messages/)
131
+ body_text, embedding
132
+ )
133
+ ```
134
+
135
+ ## MCP surface alignment
136
+
137
+ - `prompts/` → MCP **prompts** primitive (list/get, invokable).
138
+ - knowledge domains + `maps/` → MCP **resources** and/or the **`map_search` → `kip_get`** path.
139
+ - `messages/` → the **`imp_check`** pull tool.
stasima-1.0.0/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
stasima-1.0.0/NOTICE ADDED
@@ -0,0 +1,12 @@
1
+ Stasima
2
+ Copyright 2026 Antistrophos
3
+
4
+ This product includes software developed by the Stasima project
5
+ and its contributors.
6
+
7
+ "Stasima" and the Stasima logo are trademarks of Antistrophos.
8
+ Use of the name and logo is governed by BRAND.md and is not granted by
9
+ the Apache License, Version 2.0 (see Section 6 of that license).
10
+
11
+ Stasima was briefly published as Concordance (June 2026) before a
12
+ naming conflict surfaced; renamed at 9 commits, zero forks.