AtlatestRepositoryfolio
1
#lang folio/doc3
@project["projects/folio-sigil-doc" title: "Folio as a semantic Sigil Doc workspace" status: active tags: (list "folio" "sigil-doc" "knowledge-graph")]5
Turn Folio from a Markdown-convention server into a local-first semantic6
knowledge workspace whose canonical source is @code{(folio doc model)}8
@related[document: "procedures/plan-driven-execution-loop" kind: follows-procedure]{the plan-driven execution loop}10
@related[document: "topics/folio-architecture" node: "t-arch01" kind: governed-by-workflow]12
@term["source-of-truth" name: "source of truth"]13
@emph{Authored source files} are authoritative, and every derived table is14
disposable: deleting the index and rebuilding it must produce the same graph.15
@end term17
@milestone["m-first-edition" title: "First edition of the semantic workspace" status: active]19
@phase["p-freeze-estate" title: "Freeze the current estate and safety baseline" status: done order: 1]21
@task["t-f0a1" status: done priority: high tags: (list "inventory") due: "2026-08-09"]{Produce the canonical corpus manifest}23
@update["u-f0review" timestamp: "2026-08-10T09:14:00Z" author: "fable" commit: "3a7a0eb"]24
Independent re-execution in a detached worktree reproduced every recorded count.25
@end update27
@end phase29
@phase["p-freeze-model" title: "Freeze the folio/doc semantic model" status: active order: 2]31
The vocabulary frozen in this phase is deliberately small, because a universal32
ontology is not a first-edition deliverable.34
@task["t-f1a01" status: active priority: high tags: (list "model" "freeze")]{Immutable records for the whole vocabulary}36
@related[node: "t-f1a02" kind: blocks]38
@end task40
@task["t-f1a02" status: ready priority: medium tags: (list "reader")]{Build the profile reader and prove delegation parity}42
@task["t-f1a03" status: blocked priority: low]{Wire the passive inspector into the index}44
@related[document: "topics/sigil-doc-passive-parse-api" kind: depends-on]46
@end task48
@task["t-f1a04" status: inbox]{Decide whether a phase may carry a due date}50
@task["t-f1a05" status: cancelled]{Fork the prose grammar for folio}52
@decision["d-profile" title: "folio/doc is a prelude and profile, not a new language" status: accepted]54
Reusing one surface grammar is what makes a single toolchain pay off in five55
different places at once.57
@related[document: "topics/folio-sigil-doc-implementation-plan" node: "d-one" kind: supports]59
@end decision61
@decision["d-flat-ids" title: "Loosen the node id grammar to admit slashes" status: superseded]63
@end decision65
@decision["d-compact-address" title: "Add a compact doc#node address spelling" status: rejected]67
Only a form that can be semantically reasoned about should be spelled at all.69
@end decision71
@decision["d-reopen-policy" title: "Allow a done work item to return to ready" status: proposed]73
Today the transition relation admits no edge out of a finished item, while the74
shipping product still offers to reopen one, so one of the two has to move.76
@end decision78
@decision["d-two-grammars" title: "Node ids stay flat; document addresses are a second grammar" status: accepted]80
@related[node: "d-flat-ids" kind: supersedes]82
@question["q-compact-address" title: "Should a compact address spelling exist?" status: answered]84
Answered no for the first edition: only a form that can be semantically reasoned85
about is spelled at all, so the explicit two-part address is the only one.87
@end question89
@question["q-reopen" title: "May a done work item return to ready?" status: open]91
The frozen relation @code{task-transition-allowed?} draws no edge out of a92
finished item, while the shipping product still offers to reopen one.94
@end question96
@end decision98
@end phase100
@phase["p-passive-inspect" title: "Passive inspection and dual-format discovery" status: planned order: 3]102
@table[columns: (list left left) caption: "Trust levels"]103
@row[header: #t]@cell{trust level}@cell{what it may do}104
@row@cell{passive tier}@cell{parse syntax and inspect declared fields}105
@row@cell{trusted tier}@cell{evaluate author forms after an explicit grant}106
@end table108
@task["t-f2a01" status: ready tags: (list "passivity")]{Parse untrusted sources in a bounded worker}110
@question["q-subject-index" title: "How should a subject index beyond glossary terms work?" status: deferred]112
@end phase114
@phase["p-publication" title: "Publish a knowledgebase without a Folio runtime" status: paused order: 4]116
@end phase118
@end milestone120
@section["reading"]{Where the rules actually live}122
Rules are referenced rather than reproduced, as in @ref["reading"]{this very section},123
and the published plan lives at @url["https://codeberg.org/sigil/folio"]{the folio repository}125
@list[ordered: #t start: 1]126
@item{Source fidelity: untouched bytes stay exact.}127
@item{Identity: a move never changes a stable local id.}128
@item{Honesty about derived state: rebuilding yields the same answers.}129
@end list131
@code-block[language: "sigil"]132
(folio-update-field! coordinator id: "t-f1a01" field: 'status value: 'done)133
@end code-block135
@(glossary)137
@end section139
@section["unicode"]{Locations that are not ASCII}141
Several scripts at once, so that byte spans and scalar columns disagree:142
καλημέρα κόσμε, 日本語のテキスト, and a rocket 🚀 far past the basic plane.144
@end section146
@task["t-unicode" status: ready]{Prove καλημέρα spans survive the round trip}148
@query[id: "q-ready-work" title: "Everything ready and unblocked" spec: (and (kind task) (status ready))]150
@transclude[document: "topics/instrument-failure-taxonomy" node: "s-shape-15"]152
@end project154
@note["topics/folio-doc-freeze-notes" title: "Notes taken while freezing the model" tags: (list "folio" "freeze" "0.1")]156
Metadata on a note is ordinary declared data: an address for identity, a title157
for the outline, and tags for filtering, none of it computed by author code.159
@related[document: "projects/folio-sigil-doc" node: "t-f1a01" kind: mentions]{the freeze task}161
@task["t-note01" status: ready priority: low]{Record the reopen gap for the mutation phase}163
@transclude[node: "t-f1a01"]165
@end note