From 2c7c8257d12b0a7517b0675a886292228c79990c Mon Sep 17 00:00:00 2001 From: sam Date: Sat, 26 Sep 2026 06:56:20 +1000 Subject: [PATCH] docs: mermaid flow + archify architecture map, published to maps site - docs/obsidian-sorter-flow.mmd + rendered PNG - docs/archify/*.architecture.json (validation: 0 errors, 0 warnings) - docs/obsidian-sorter-map.html (interactive, showcase quality) - published to https://maps.lab.audasmedia.com.au/obsidian-sorter/docs/ --- .../archify/obsidian-sorter.architecture.json | 289 + docs/diagrams/obsidian-sorter-flow.png | Bin 0 -> 23633 bytes docs/obsidian-sorter-flow.mmd | 16 + docs/obsidian-sorter-map.html | 13678 ++++++++++++++++ 4 files changed, 13983 insertions(+) create mode 100644 docs/archify/obsidian-sorter.architecture.json create mode 100644 docs/diagrams/obsidian-sorter-flow.png create mode 100644 docs/obsidian-sorter-flow.mmd create mode 100644 docs/obsidian-sorter-map.html diff --git a/docs/archify/obsidian-sorter.architecture.json b/docs/archify/obsidian-sorter.architecture.json new file mode 100644 index 0000000..9d99866 --- /dev/null +++ b/docs/archify/obsidian-sorter.architecture.json @@ -0,0 +1,289 @@ +{ + "schema_version": 1, + "diagram_type": "architecture", + "meta": { + "title": "Obsidian Sorter \u2014 Note Filing Pipeline", + "output": "docs/obsidian-sorter-map.html", + "visual_preset": "blueprint", + "animation": "trace", + "quality_profile": "showcase", + "views": [ + { + "id": "intake", + "label": "Intake", + "focus": [ + "author", + "inbox", + "watcher" + ], + "note": "A note lands in the inbox and the watcher picks it up." + }, + { + "id": "classification", + "label": "Classification", + "focus": [ + "watcher", + "rules", + "jev", + "proposal" + ], + "note": "Rules decide first; anything unclear escalates to the JEV model." + }, + { + "id": "approval", + "label": "Human approval", + "focus": [ + "proposal", + "obsidian", + "writer" + ], + "note": "Nothing moves until the owner ticks the checkbox." + }, + { + "id": "filing", + "label": "Filing", + "focus": [ + "writer", + "folder", + "toc" + ], + "note": "The note moves to its folder and the index is updated." + } + ] + }, + "components": [ + { + "id": "author", + "type": "external", + "label": "Sam", + "sublabel": "writes a note", + "pos": [ + 40, + 340 + ], + "size": [ + 120, + 60 + ] + }, + { + "id": "inbox", + "type": "database", + "label": "010 inbox/", + "sublabel": "unsorted notes", + "pos": [ + 220, + 340 + ], + "size": [ + 130, + 60 + ] + }, + { + "id": "watcher", + "type": "backend", + "label": "Watcher", + "sublabel": "systemd \u00b7 10s poll", + "pos": [ + 410, + 340 + ], + "size": [ + 140, + 62 + ], + "tag": "watch.py" + }, + { + "id": "rules", + "type": "backend", + "label": "Tier 1 \u2014 Rules", + "sublabel": "folder + keyword hints", + "pos": [ + 620, + 170 + ], + "size": [ + 160, + 62 + ], + "tag": "classify.py" + }, + { + "id": "jev", + "type": "cloud", + "label": "TypeSafe JEV", + "sublabel": "bucket \u00b7 folder \u00b7 tags", + "pos": [ + 620, + 500 + ], + "size": [ + 160, + 62 + ], + "tag": "remote API" + }, + { + "id": "proposal", + "type": "database", + "label": "Proposal", + "sublabel": "written into the note", + "pos": [ + 850, + 340 + ], + "size": [ + 150, + 62 + ], + "tag": "frontmatter" + }, + { + "id": "obsidian", + "type": "external", + "label": "Obsidian", + "sublabel": "owner ticks approved", + "pos": [ + 1060, + 340 + ], + "size": [ + 150, + 62 + ], + "tag": "human gate" + }, + { + "id": "writer", + "type": "backend", + "label": "Writer", + "sublabel": "atomic move", + "pos": [ + 1270, + 340 + ], + "size": [ + 150, + 62 + ], + "tag": "writer.py" + }, + { + "id": "folder", + "type": "database", + "label": "Destination", + "sublabel": "type follows folder", + "pos": [ + 1490, + 220 + ], + "size": [ + 150, + 62 + ] + }, + { + "id": "toc", + "type": "database", + "label": "Table of Contents", + "sublabel": "index updated", + "pos": [ + 1490, + 460 + ], + "size": [ + 150, + 62 + ] + } + ], + "boundaries": [ + { + "kind": "region", + "label": "sorter code \u2014 zero third-party dependencies", + "wraps": [ + "watcher", + "rules", + "writer" + ], + "pad": 26 + } + ], + "connections": [ + { + "id": "save", + "from": "author", + "to": "inbox", + "label": "save", + "labelDy": -22 + }, + { + "id": "poll", + "from": "inbox", + "to": "watcher", + "label": "poll", + "labelDy": -22 + }, + { + "id": "classify", + "from": "watcher", + "to": "rules", + "label": "classify", + "labelDx": -30 + }, + { + "id": "confident", + "from": "rules", + "to": "proposal", + "label": "confident", + "labelDx": 20 + }, + { + "id": "unsure", + "from": "rules", + "to": "jev", + "label": "unsure", + "labelAt": [ + 700, + 250 + ] + }, + { + "id": "verdict", + "from": "jev", + "to": "proposal", + "label": "verdict + tags", + "labelDx": 20 + }, + { + "id": "review", + "from": "proposal", + "to": "obsidian", + "label": "review or edit folder", + "labelDy": -24 + }, + { + "id": "approved", + "from": "obsidian", + "to": "writer", + "label": "approved", + "labelDy": -22 + }, + { + "id": "file", + "from": "writer", + "to": "folder", + "label": "file", + "labelDx": 24 + }, + { + "id": "index", + "from": "writer", + "to": "toc", + "label": "index", + "labelDx": 24 + } + ] +} \ No newline at end of file diff --git a/docs/diagrams/obsidian-sorter-flow.png b/docs/diagrams/obsidian-sorter-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..a044b348f3b9e3543b009e024bc2a074b53d0768 GIT binary patch literal 23633 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 OA<|IMQ7%@r4EP_Igcyqe literal 0 HcmV?d00001 diff --git a/docs/obsidian-sorter-flow.mmd b/docs/obsidian-sorter-flow.mmd new file mode 100644 index 0000000..1f5a89f --- /dev/null +++ b/docs/obsidian-sorter-flow.mmd @@ -0,0 +1,16 @@ +flowchart LR + A["Sam writes a note"] --> B["010 inbox/"] + B --> C{"Watcher
systemd user service
polls every 10s"} + C --> D["Tier 1 - rules
folder + keyword hints
user tags win"] + D -->|"confident"| F["Proposal"] + D -->|"unsure"| E["Tier 2 - TypeSafe JEV
bucket + folder + tags"] + E --> F + F --> G["Proposal written
into the note frontmatter"] + G --> H["Sam reviews in Obsidian"] + H -->|"ticks approved"| I["Writer"] + H -->|"edits folder first"| G + I --> J["Destination folder"] + I --> K["Table of Contents"] + + click C "https://maps.lab.audasmedia.com.au/obsidian-sorter/docs/obsidian-sorter-map.html" "View Archify Map" + click E "https://docs.typesafe.ai" "TypeSafe JEV documentation" diff --git a/docs/obsidian-sorter-map.html b/docs/obsidian-sorter-map.html new file mode 100644 index 0000000..197886e --- /dev/null +++ b/docs/obsidian-sorter-map.html @@ -0,0 +1,13678 @@ + + + + + + + Obsidian Sorter — Note Filing Pipeline Diagram + + + + + + + + + +

+ +
+ +
+
+
+

Obsidian Sorter — Note Filing Pipeline

+
+
+ + + + + + +
+ + Obsidian Sorter — Note Filing Pipeline + A architecture diagram generated by Archify. + + + + + + + + + + + + + + + + + + + + + + + + + sorter code — zero third-party dependencies + + + + + + + + + + + + + + + + Sam · writes a note · Architecture component + + + + Sam + writes a note + + + + 010 inbox/ · unsorted notes · Architecture component + + + + 010 inbox/ + unsorted notes + + + + Watcher · systemd · 10s poll · sorter code — zero third-party dependencies · watch.py + + + + Watcher + systemd · 10s poll + watch.py + + + + Tier 1 — Rules · folder + keyword hints · sorter code — zero third-party dependencies · classify.py + + + + Tier 1 — Rules + folder + keyword hints + classify.py + + + + TypeSafe JEV · bucket · folder · tags · Architecture component · remote API + + + + TypeSafe JEV + bucket · folder · tags + remote API + + + + Proposal · written into the note · Architecture component · frontmatter + + + + Proposal + written into the note + frontmatter + + + + Obsidian · owner ticks approved · Architecture component · human gate + + + + Obsidian + owner ticks approved + human gate + + + + Writer · atomic move · sorter code — zero third-party dependencies · writer.py + + + + Writer + atomic move + writer.py + + + + Destination · type follows folder · Architecture component + + + + Destination + type follows folder + + + + Table of Contents · index updated · Architecture component + + + + Table of Contents + index updated + + + + + + save + + + + poll + + + + classify + + + + confident + + + + unsure + + + + verdict + tags + + + + review or edit folder + + + + approved + + + + file + + + + index + + + + + Legend + + + Backend + + + + Database + + + + Cloud + + + + External + + + +

+ + + + + + + + +
+ + +
+ +
+ +
+ + + +