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.
- stasima-1.0.0/.gitignore +31 -0
- stasima-1.0.0/ARCHITECTURE.md +109 -0
- stasima-1.0.0/BRAND.md +149 -0
- stasima-1.0.0/CONTENT-MODEL.md +139 -0
- stasima-1.0.0/LICENSE +201 -0
- stasima-1.0.0/NOTICE +12 -0
- stasima-1.0.0/OPERATIONS.md +144 -0
- stasima-1.0.0/PKG-INFO +110 -0
- stasima-1.0.0/README.md +87 -0
- stasima-1.0.0/SETUP.md +109 -0
- stasima-1.0.0/embeddings-build-guide.md +87 -0
- stasima-1.0.0/pyproject.toml +42 -0
- stasima-1.0.0/stasima/__init__.py +4 -0
- stasima-1.0.0/stasima/admin.py +259 -0
- stasima-1.0.0/stasima/airlock.py +217 -0
- stasima-1.0.0/stasima/audit_log.py +179 -0
- stasima-1.0.0/stasima/authz.py +52 -0
- stasima-1.0.0/stasima/canon.py +109 -0
- stasima-1.0.0/stasima/cap_server.py +491 -0
- stasima-1.0.0/stasima/config.py +150 -0
- stasima-1.0.0/stasima/entries.py +46 -0
- stasima-1.0.0/stasima/local_capstore.py +472 -0
- stasima-1.0.0/stasima/map_index.py +279 -0
- stasima-1.0.0/stasima/orientation.py +77 -0
- stasima-1.0.0/stasima.toml.example +46 -0
stasima-1.0.0/.gitignore
ADDED
|
@@ -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.
|