Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
838d839
guard against machine-local paths in tracked files (dee-88da)
deepfates Jul 8, 2026
2e2669e
dee-v8rh: make README Ninety-Second Story runnable from a clone
deepfates Jul 8, 2026
931fcf7
fix(core): model idb-log storage arrays instead of unknown[] / any-cast
deepfates Jul 8, 2026
336975f
lync: prep @lync/core + @lync/cli for public npm publish
deepfates Jul 8, 2026
fd9d963
fix(core): keep node builtins off the browser lore path (dee-mm7n)
deepfates Jul 8, 2026
98af3a0
merge wave-dee-mm7n into lync wave
deepfates Jul 9, 2026
4c43cd6
merge wave-dee-m2jm into lync wave
deepfates Jul 9, 2026
1e96441
merge wave-dee-3lot into lync wave
deepfates Jul 9, 2026
6b03865
merge wave-dee-v8rh into lync wave
deepfates Jul 9, 2026
ff1ac91
merge wave-dee-88da into lync wave
deepfates Jul 9, 2026
d5a335a
rename packages to unscoped lync-core / lync-cli (owner ruling 2026-0…
deepfates Jul 9, 2026
f031705
README: state plainly which packages are published vs in-repo pre-rel…
deepfates Jul 9, 2026
087d41a
client: never hang silently on an incomplete peer handshake
deepfates Jul 9, 2026
d8d74d2
cutover: one vocabulary, one complete product
deepfates Jul 9, 2026
92ac354
sync: native line-sync ships — lync serve + lync sync [--follow]
deepfates Jul 9, 2026
17949b4
embedded reactive sync: the browser story, on the native protocol
deepfates Jul 9, 2026
0f856a2
lync-server: the embeddable relay package
deepfates Jul 9, 2026
489a793
server: relay/serve shutdown never hangs
deepfates Jul 9, 2026
780eabf
relay: durability failures are loud and non-wedging (adversarial revi…
deepfates Jul 9, 2026
ee75841
test: alias lync-server and lync-client to src for build-less CI
deepfates Jul 9, 2026
25abf5e
fix: codex gauntlet findings — cursor integrity + conflict-sidecar ho…
deepfates Jul 10, 2026
a48fdc7
docs+spec+writers: publish-readiness fixes from the review pass
deepfates Jul 10, 2026
737c0ee
pacts: codify import (transcription) and export (projection) law
deepfates Jul 10, 2026
0eec60c
polish: make the npm storefronts truthful and complete
deepfates Jul 12, 2026
cef2267
check-readme-examples: the README is the contract, no out-of-band plan
deepfates Jul 13, 2026
4bceb0e
core: linear-time, order-independent parent-cycle detection
deepfates Jul 13, 2026
91834d8
core: leaderboard sums in sorted-annotation-id order; selection refer…
deepfates Jul 13, 2026
ded690d
consolidate: lync ships as ONE package, lync-core 0.3.0, zero depende…
deepfates Jul 13, 2026
2081462
gitignore: packed tarballs
deepfates Jul 13, 2026
4e85991
docs: ROADMAP and pacts speak the one-package truth (no five-package …
deepfates Jul 13, 2026
f055355
rename: the package is @deepfates/lync (bin stays lync; format vocabu…
deepfates Jul 13, 2026
43034ce
relay: log-generation id — a cursor is only meaningful inside the gen…
deepfates Jul 13, 2026
e65c5bd
synced-store: await + inspect every union BEFORE the cursor advances …
deepfates Jul 13, 2026
39a30d4
synced-store: surface every relay-side error, never silently drop it …
deepfates Jul 13, 2026
48e4690
test: the loss-free trial — milestone-6 durability proof (dee-i1wc)
deepfates Jul 13, 2026
f9bb1c4
relay: converge the on-disk log without a restart (dee-1pfp)
deepfates Jul 13, 2026
e2b22e3
relay: add read-only status() surface (dee-aic5)
deepfates Jul 13, 2026
cca6baa
readme: lead with what lync is and why, in plain words
deepfates Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ dist/
/VERDICT-*.md
/.tickets/
/FRESHREAD*.md

# packed tarballs
*.tgz
39 changes: 22 additions & 17 deletions FORMAT.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# The lync format — files of lore
# The lync format

Status: v0 draft. Conventional extension: `.lync`.

Expand Down Expand Up @@ -43,7 +43,7 @@ One shape. Everything is an instance of it.
| Field | Required | Type | Meaning |
|---|---|---|---|
| `v` | yes | int | Envelope version. Writers never invent top-level fields; readers tolerate unknown ones as future-version diagnostics. |
| `id` | yes | string; UUIDv7 is a writer obligation | Identity of the event, not the content. Two identical generations are two events. The embedded timestamp is untrusted input; `at` and `marked` carry time claims. Readers compare ids as opaque decoded strings and validate nothing about their shape. |
| `id` | yes | string; UUID is a writer obligation | Identity of the event, not the content. Generators mint UUIDv7 (two identical generations are two events); importers transcribing pre-existing events may instead derive a deterministic UUIDv8 from source identity, so re-importing the same source is a union no-op and an upstream edit surfaces as a same-id conflict. The embedded timestamp is untrusted input; `at` and `marked` carry time claims. Readers compare ids as opaque decoded strings and validate nothing about their shape. |
| `kind` | yes | string, `namespace/name` | What sort of event this is. Opaque to the protocol. Must contain at least one `/`; the part before the first `/` is the namespace and the rest is the name, both non-empty. The name may itself contain `/`. The namespace tells you whose pact defines it; the protocol never interprets it and there is no registry. |
| `at` | yes | RFC 3339 | When the content came into being, as claimed by the author. A claim, not a proof. |
| `author` | yes | object | Provenance: who made this, under whose responsibility, through what. |
Expand Down Expand Up @@ -283,20 +283,20 @@ agree on. A pact binds its signatories; the protocol binds everyone.
Where a community has already converged, borrow; mint only where you are
genuinely first. Current recommendations:

- `lore/artifact`: a thing someone produced from prior things, such as prose,
- `lync/artifact`: a thing someone produced from prior things, such as prose,
code, a prediction, a tool result, an imported message, or a computed excerpt.
`parents` are what it was made from, in order.
- `lore/annotation`: an authored claim about one or more events. `parents` are
- `lync/annotation`: an authored claim about one or more events. `parents` are
the targets. Scores, critiques, rewards, receipts, labels, and selections are
relations-as-events.
- `lore/pointer`: a named reference that moves without mutating. Payload
- `lync/pointer`: a named reference that moves without mutating. Payload
`{"name": "...", "target": "<id>"}`; live value is newest per actor and name.
Older pointers are history.
- `lore/tombstone`: retraction, written `critical: true` so rule 3 binds even
- `lync/tombstone`: retraction, written `critical: true` so rule 3 binds even
readers that have never heard of tombstones. `parents[0]` is the target.

Historical namespace spellings are frozen wire vocabulary. Shipped kind strings
such as `lore/annotation`, `lore/artifact`, `lync/turn`, and `lync/loom` are
such as `lync/annotation`, `lync/artifact`, `lync/turn`, and `lync/loom` are
exact-match data in stored files; the lync brand does not rename shipped kinds.

Annotation labels may include `selection`, `score`, `decision`, `no-train`,
Expand Down Expand Up @@ -370,19 +370,28 @@ Ordering for a live multiplayer world is its own pact. If a world needs a
global sequence, it carries `seq` in payload. Who may fork it is governance,
not data.

Absent from the format does not mean absent from the toolbox — it means
layered above it. The reference implementation ships a sync relay and a sync
client beside this spec; they are tools that happen to move `.lync` lines,
not part of the format. Because events are immutable and merge is set union
by id, any transport that delivers canonical line bytes converges the same
files: a WebSocket relay, `rsync`, an email attachment, or a USB stick are
all conformant sync mechanisms. An implementation of this document is
complete without implementing any of them.

## Worked Example

Five events: a paragraph, two alternatives, a judge's score, and a declared
choice. Non-normative shorthand: ids are shown as `A` to `E` and digests are
elided for readability only. Conforming writers mint UUIDv7 ids and should
elided for readability only. Conforming generators mint UUIDv7 ids (importers may derive deterministic UUIDv8 — see the `id` row) and should
splice digests per "Bytes Are Canonical."

```jsonl
{"v":1,"id":"A","kind":"lore/artifact","at":"2026-07-06T04:10:00Z","author":{"actor":"deepfates"},"parents":[],"payload":{"text":"The bear stood at the lip of the falls."}}
{"v":1,"id":"B","kind":"lore/artifact","at":"2026-07-06T04:10:09Z","author":{"actor":"claude-haiku-4-5","operator":"deepfates","via":"textile@0.9"},"parents":["A"],"payload":{"text":"It did not move for an hour, and the river brought it everything.","ordinal":0}}
{"v":1,"id":"C","kind":"lore/artifact","at":"2026-07-06T04:10:09Z","author":{"actor":"claude-haiku-4-5","operator":"deepfates","via":"textile@0.9"},"parents":["A"],"payload":{"text":"Downstream, the younger bears fought over shallows.","ordinal":1}}
{"v":1,"id":"D","kind":"lore/annotation","at":"2026-07-06T04:10:11Z","author":{"actor":"witness-panel-v3"},"parents":["B"],"payload":{"label":"score","value":0.91}}
{"v":1,"id":"E","kind":"lore/annotation","at":"2026-07-06T04:10:15Z","author":{"actor":"deepfates"},"parents":["B","C"],"payload":{"label":"selection","chosen":["B"],"shown":["B","C"],"basis":"human pick"}}
{"v":1,"id":"A","kind":"lync/artifact","at":"2026-07-06T04:10:00Z","author":{"actor":"deepfates"},"parents":[],"payload":{"text":"The bear stood at the lip of the falls."}}
{"v":1,"id":"B","kind":"lync/artifact","at":"2026-07-06T04:10:09Z","author":{"actor":"claude-haiku-4-5","operator":"deepfates","via":"textile@0.9"},"parents":["A"],"payload":{"text":"It did not move for an hour, and the river brought it everything.","ordinal":0}}
{"v":1,"id":"C","kind":"lync/artifact","at":"2026-07-06T04:10:09Z","author":{"actor":"claude-haiku-4-5","operator":"deepfates","via":"textile@0.9"},"parents":["A"],"payload":{"text":"Downstream, the younger bears fought over shallows.","ordinal":1}}
{"v":1,"id":"D","kind":"lync/annotation","at":"2026-07-06T04:10:11Z","author":{"actor":"witness-panel-v3"},"parents":["B"],"payload":{"label":"score","value":0.91}}
{"v":1,"id":"E","kind":"lync/annotation","at":"2026-07-06T04:10:15Z","author":{"actor":"deepfates"},"parents":["B","C"],"payload":{"label":"selection","chosen":["B"],"shown":["B","C"],"basis":"human pick"}}
```

Event `E` exists because nothing was extended yet, so the graph alone cannot
Expand All @@ -397,9 +406,5 @@ walks every parent, and lies about nothing.

## Ambiguity Notes

The public vocabulary has moved to lync, but the current TypeScript package
still exposes some legacy import paths and identifier names. Those names are
not wire-format semantics.

Reserved top-level field names such as `digest` and `sig` are wire-format
semantics and are not renamed.
Loading
Loading