owfadev 0.3.1 → 0.4.0

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.
Files changed (117) hide show
  1. package/.agents/skills/owfa-check/SKILL.md +49 -0
  2. package/.agents/skills/{docs → owfa-docs}/SKILL.md +5 -5
  3. package/.agents/skills/{wiki_plugin_kernel → owfa-kernel}/SKILL.md +13 -12
  4. package/{.meta/command/plugin → .agents/skills/owfa-plugin}/SKILL.md +10 -10
  5. package/.agents/skills/{query → owfa-query}/SKILL.md +5 -6
  6. package/.owfa/VERSION +1 -0
  7. package/.owfa/command/owfa-check/SKILL.md +49 -0
  8. package/{.meta/command/docs → .owfa/command/owfa-docs}/SKILL.md +5 -5
  9. package/{.meta/command/wiki_plugin_kernel → .owfa/command/owfa-kernel}/SKILL.md +13 -12
  10. package/{.agents/skills/plugin → .owfa/command/owfa-plugin}/SKILL.md +10 -10
  11. package/{.meta/command/query → .owfa/command/owfa-query}/SKILL.md +5 -6
  12. package/{.meta → .owfa}/docs/agent-behavior.md +3 -2
  13. package/{.meta → .owfa}/docs/agents-example.md +1 -1
  14. package/{.meta → .owfa}/docs/conversion.md +2 -2
  15. package/{.meta → .owfa}/docs/deployment.md +51 -46
  16. package/{.meta → .owfa}/docs/developer.md +4 -4
  17. package/{.meta → .owfa}/docs/distribution.md +21 -19
  18. package/.owfa/docs/home.md +61 -0
  19. package/{.meta → .owfa}/docs/intro.md +5 -5
  20. package/{.meta → .owfa}/docs/log-example.md +1 -1
  21. package/{.meta → .owfa}/docs/map.md +4 -3
  22. package/{.meta → .owfa}/docs/mechanics.md +11 -11
  23. package/{.meta → .owfa}/docs/naming.md +7 -7
  24. package/{.meta → .owfa}/docs/packages.md +80 -15
  25. package/.owfa/docs/plugin-lifecycle.md +70 -0
  26. package/{.meta → .owfa}/docs/quickstart.md +12 -12
  27. package/{.meta → .owfa}/docs/research-user-profile.md +1 -1
  28. package/{.meta → .owfa}/docs/sandbox.md +3 -3
  29. package/{.meta → .owfa}/docs/usage.md +1 -1
  30. package/{.meta → .owfa}/protocol/actions.md +6 -6
  31. package/.owfa/protocol/registry.yaml +34 -0
  32. package/.owfa/scripts/owfa_home.py +273 -0
  33. package/{.meta/scripts/wiki_plugin_kernel.py → .owfa/scripts/owfa_kernel.py} +521 -77
  34. package/{.meta → .owfa}/scripts/pipeline.py +9 -9
  35. package/.owfa/scripts/wiki_plugin_kernel.py +15 -0
  36. package/{.meta → .owfa}/scripts/wikilib.py +2 -2
  37. package/.owfa/tests/test_capabilities.py +311 -0
  38. package/{.meta → .owfa}/tests/test_install_preflight.py +11 -7
  39. package/.owfa/tests/test_owfa_home.py +127 -0
  40. package/.owfa/tests/test_version_scheme.py +63 -0
  41. package/README.md +32 -24
  42. package/README.zh-CN.md +32 -24
  43. package/bin/owfa.js +525 -65
  44. package/package.json +3 -2
  45. package/payloads/personal/PKG.yaml +15 -0
  46. package/payloads/personal/README.md +7 -0
  47. package/{.meta/plugins/core → payloads/personal}/calendar/PLUGIN.md +1 -0
  48. package/{.meta/plugins/core → payloads/personal}/calendar/PLUGIN.yaml +3 -3
  49. package/{.agents/skills/map → payloads/personal/command/owfa-map}/SKILL.md +9 -9
  50. package/{.meta/command/profile → payloads/personal/command/owfa-profile}/SKILL.md +11 -11
  51. package/{.agents/skills/save → payloads/personal/command/owfa-save}/SKILL.md +10 -10
  52. package/{.meta/plugins/core → payloads/personal}/cron/PLUGIN.md +2 -0
  53. package/{.meta/plugins/core → payloads/personal}/cron/PLUGIN.yaml +3 -3
  54. package/{.meta/plugins/core → payloads/personal}/device/PLUGIN.md +1 -0
  55. package/{.meta/plugins/core → payloads/personal}/device/PLUGIN.yaml +3 -3
  56. package/{.meta/plugins/core → payloads/personal}/domain/PLUGIN.md +2 -0
  57. package/payloads/personal/domain/PLUGIN.yaml +8 -0
  58. package/{.meta/plugins/core → payloads/personal}/hot/PLUGIN.yaml +1 -1
  59. package/{.meta/plugins/core → payloads/personal}/index/PLUGIN.md +1 -0
  60. package/{.meta/plugins/core → payloads/personal}/index/PLUGIN.yaml +4 -4
  61. package/{.meta/plugins/core → payloads/personal}/instance-git/PLUGIN.md +5 -0
  62. package/{.meta/plugins/core → payloads/personal}/instance-git/PLUGIN.yaml +3 -3
  63. package/{.meta/plugins/core → payloads/personal}/language/PLUGIN.md +1 -0
  64. package/{.meta/plugins/core → payloads/personal}/language/PLUGIN.yaml +4 -4
  65. package/{.meta/plugins/core → payloads/personal}/link/PLUGIN.md +1 -0
  66. package/{.meta/plugins/core → payloads/personal}/link/PLUGIN.yaml +3 -3
  67. package/{.meta/plugins/core → payloads/personal}/link/scripts/check.py +1 -1
  68. package/{.meta/plugins/core → payloads/personal}/log/PLUGIN.md +1 -0
  69. package/{.meta/plugins/core → payloads/personal}/log/PLUGIN.yaml +4 -4
  70. package/{.meta/plugins/core → payloads/personal}/mapping/PLUGIN.yaml +1 -1
  71. package/{.meta/plugins/core → payloads/personal}/notes/PLUGIN.md +1 -0
  72. package/{.meta/plugins/core → payloads/personal}/notes/PLUGIN.yaml +4 -4
  73. package/{.meta/plugins/core → payloads/personal}/sessions/PLUGIN.md +2 -1
  74. package/{.meta/plugins/core → payloads/personal}/sessions/PLUGIN.yaml +5 -5
  75. package/{.meta/plugins/core → payloads/personal}/structure/PLUGIN.md +2 -0
  76. package/{.meta/plugins/core → payloads/personal}/structure/PLUGIN.yaml +3 -3
  77. package/{.meta/plugins/core → payloads/personal}/structure/scripts/check.py +1 -1
  78. package/{.meta/plugins/core → payloads/personal}/tag/PLUGIN.md +2 -0
  79. package/{.meta/plugins/core → payloads/personal}/tag/PLUGIN.yaml +3 -3
  80. package/{.meta/plugins/core → payloads/personal}/tag/scripts/check.py +3 -1
  81. package/{.meta/plugins/core → payloads/personal}/tmp/PLUGIN.md +1 -0
  82. package/{.meta/plugins/core → payloads/personal}/tmp/PLUGIN.yaml +3 -3
  83. package/{.meta/plugins/core → payloads/personal}/todo/PLUGIN.md +2 -0
  84. package/{.meta/plugins/core → payloads/personal}/todo/PLUGIN.yaml +6 -5
  85. package/payloads/personal/todo/scripts/check.py +51 -0
  86. package/{.meta/plugins/core → payloads/personal}/trust/PLUGIN.md +1 -0
  87. package/{.meta/plugins/core → payloads/personal}/trust/PLUGIN.yaml +3 -3
  88. package/{.meta/plugins/core → payloads/personal}/user-profile/PLUGIN.md +2 -0
  89. package/{.meta/plugins/core → payloads/personal}/user-profile/PLUGIN.yaml +7 -6
  90. package/payloads/personal/user-profile/scripts/check.py +20 -0
  91. package/{.meta/plugins/core → payloads/personal}/vault/PLUGIN.md +1 -0
  92. package/payloads/personal/vault/PLUGIN.yaml +13 -0
  93. package/{.meta/plugins/core → payloads/personal}/wiki/PLUGIN.md +1 -0
  94. package/payloads/personal/wiki/PLUGIN.yaml +8 -0
  95. package/templates/AGENTS.template.md +2 -2
  96. package/.agents/skills/check/SKILL.md +0 -130
  97. package/.agents/skills/profile/SKILL.md +0 -75
  98. package/.meta/VERSION +0 -1
  99. package/.meta/command/check/SKILL.md +0 -130
  100. package/.meta/command/map/SKILL.md +0 -72
  101. package/.meta/command/save/SKILL.md +0 -94
  102. package/.meta/plugins/core/domain/PLUGIN.yaml +0 -8
  103. package/.meta/plugins/core/vault/PLUGIN.yaml +0 -13
  104. package/.meta/plugins/core/wiki/PLUGIN.yaml +0 -8
  105. package/.meta/protocol/registry.yaml +0 -75
  106. /package/{.meta → .owfa}/command/asset-read/SKILL.md +0 -0
  107. /package/{.meta → .owfa}/docs/research-landscape.md +0 -0
  108. /package/{.meta → .owfa}/protocol/experiments.md +0 -0
  109. /package/{.meta/plugins/core → payloads/personal}/device/scripts/check.py +0 -0
  110. /package/{.meta/plugins/core → payloads/personal}/hot/PLUGIN.md +0 -0
  111. /package/{.meta/plugins/core → payloads/personal}/instance-git/scripts/check.py +0 -0
  112. /package/{.meta/plugins/core → payloads/personal}/language/scripts/check.py +0 -0
  113. /package/{.meta/plugins/core → payloads/personal}/log/scripts/check.py +0 -0
  114. /package/{.meta/plugins/core → payloads/personal}/mapping/PLUGIN.md +0 -0
  115. /package/{.meta/plugins/core → payloads/personal}/mapping/scripts/check.py +0 -0
  116. /package/{.meta/plugins/core → payloads/personal}/sessions/scripts/check.py +0 -0
  117. /package/{.meta/plugins/core → payloads/personal}/trust/scripts/check.py +0 -0
@@ -1,16 +1,16 @@
1
1
  id: notes
2
2
  schema_version: 1
3
- version: 0.15
3
+ version: 0.16
4
4
  bridge: 按需
5
5
  depends:
6
6
  - wiki
7
- updated: 2026-10-06
7
+ updated: 2026-11-09
8
8
  attachment:
9
9
  - "wiki/notes/ — native notes zone"
10
10
  fields: {}
11
11
  commands:
12
- - save
13
- inject: "Native notes `wiki/notes/`: knowledge whose provenance is the wiki itself, subdivided by the type field (open form vocabulary, default values in registry); no-regeneration zone, commands append-only and never modify; session and profile types do not land in this zone (they belong to the sessions / user-profile territories); notes on-demand bridge — domain plugins one-way derive high-value conclusions into this zone on an emergence basis, and must back-link the source page (constitutional principle 11, format owned by this bridge)"
12
+ - owfa-save
13
+ inject: "Native notes `wiki/notes/`: knowledge born in the wiki, open `type` vocabulary (defaults in registry); commands append, never modify; session/profile pages live in their own territories; domain derivations must back-link the source; details PLUGIN.md"
14
14
  usage:
15
15
  - Landing spot `wiki/notes/<title>.md`, file name free (named by humans); type form vocabulary in registry (open, self-extended by instances), territory values do not land in this zone
16
16
  - Append-only: commands never rewrite an existing note wholesale; updating = append-style merge under user instruction (trace left in the body) or manual human edits
@@ -52,8 +52,9 @@ The performance budget for volumetric fog on low-end machines?
52
52
 
53
53
  ## Changelog
54
54
 
55
+ - 0.10 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
55
56
  - 0.9 2026-09-23: added the wiki dependency edge — inner plugins attach to wiki, aligning with the domain 0.1 declaration; missed in the 2026-09-22 domainization batch
56
- - 0.8 2026-09-13: made the usage sample pointer explicit — added the `.meta/plugins/sessions/PLUGIN.md` path, zero priors
57
+ - 0.8 2026-09-13: made the usage sample pointer explicit — added the `.owfa/plugins/sessions/PLUGIN.md` path, zero priors
57
58
  - 0.7 2026-09-13: inject source moved to the manifest — deleted the Checks, Usage, Inject, Attachments sections; md returns to pure documentation
58
59
  - 0.6 2026-09-13: established the Usage section — write-side contracts handed to command injection regions for projection, single text source
59
60
  - 0.5 2026-09-12: manifest dropped layer — layering abolished: injection order changed to dependency topology plus alphabetical, direction checks removed
@@ -1,19 +1,19 @@
1
1
  id: sessions
2
2
  schema_version: 1
3
- version: 0.9
3
+ version: 0.10
4
4
  depends:
5
5
  - wiki
6
- updated: 2026-10-06
6
+ updated: 2026-11-09
7
7
  attachment:
8
8
  - "wiki/sessions/ — native sessions zone, session-type backbone pages"
9
9
  fields:
10
10
  participants: "YAML list, actor convention (human:name / process:flow name / agent/model id), the multi-agent collaboration extension point"
11
11
  commands:
12
- - save
13
- inject: "Native sessions `wiki/sessions/`: session backbone pages (type: session, participants required = actor list, default naming YYYY-MM-DD-<topic>); high-value topics promoted to standalone `wiki/notes/` pages with a back-link; no-regeneration zone, commands append-only and never modify"
12
+ - owfa-save
13
+ inject: "Native sessions `wiki/sessions/`: session backbone pages (`type: session`, `participants` required, named YYYY-MM-DD-<topic>); high-value topics promoted to `wiki/notes/` with a back-link; commands append, never modify"
14
14
  usage:
15
15
  - Landing spot `wiki/sessions/YYYY-MM-DD-<topic>.md` (default naming), type: session, participants required (actor list)
16
- - Backbone page five-section shape: Core Conclusions / Decisions & Rationale / Non-obvious Insights / Open Questions / Related Pages (full-shape sample in the Example section of `.meta/plugins/sessions/PLUGIN.md`)
16
+ - Backbone page five-section shape: Core Conclusions / Decisions & Rationale / Non-obvious Insights / Open Questions / Related Pages (full-shape sample in the Example section of `.owfa/plugins/sessions/PLUGIN.md`)
17
17
  - Standalone high-value topics promoted to `wiki/notes/` pages, the backbone page keeping a wikilink; dedupe before promotion
18
18
  checks:
19
19
  - Mechanical (covered by audit): session-type pages outside `wiki/sessions/` (or the reverse) → warning; participants missing or entries violating the actor convention → warning
@@ -24,6 +24,8 @@
24
24
 
25
25
  ## Changelog
26
26
 
27
+ - 0.5 2026-11-12: attached-audit fix — declaration keys written without the trailing slash no longer double-report as drift (undeclared + nonexistent); the directory name is the semantics, the slash is form
28
+ - 0.4 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
27
29
  - 0.3 2026-09-22: domain-ization — the first paragraph gained in-domain governance positioning, transitively belonging to the vault domain, governance page inside and target outside; depends unchanged, transitivity means membership
28
30
  - 0.2 2026-09-14: territory moved into wiki — declaration page `wiki/structure.md`, frontmatter structure block mapping machine-readable; drift detection upgraded from a semantic item to the attached-audit script, i.e. the declaration diff; depends gained wiki; the shell's natural-language declaration retired
29
31
  - 0.1 2026-09-14: established — from the user-write manuscript, i.e. the four presets plus the AGENTS declaration, distilled with the vault governance discussion; the layout responsibility separated from the vault concept plugin, symmetric to the wiki side's concept-and-structure layering
@@ -1,15 +1,15 @@
1
1
  id: structure
2
2
  schema_version: 1
3
- version: 0.3
3
+ version: 0.5
4
4
  depends:
5
5
  - vault
6
6
  - wiki
7
- updated: 2026-10-06
7
+ updated: 2026-11-12
8
8
  attachment:
9
9
  - "wiki/structure.md — structure declaration page (the vault layout declaration proper: frontmatter structure block mapping + body preset notes)"
10
10
  - "scripts/check.py — attached audit (declaration diff / territory placement / declaration-page existence)"
11
11
  fields: {}
12
- inject: "vault structure declaration `wiki/structure.md` (type: structure): frontmatter `structure` block mapping = directory → one-line semantics, body records presets (date/format/type/mixed, nestable) and notes; agents read this page before placing assets, placing them by position; page absent = flat tolerance; after the human adjusts vault, sync the declaration, check does a mechanical diff (undeclared top-level directory / declared-but-nonexistent directory → warning)"
12
+ inject: "vault layout declaration `wiki/structure.md` (directory → one-line semantics + presets): read it before placing assets and place by position (absent = flat tolerance); sync it after the human reorganizes vault; details PLUGIN.md"
13
13
  usage:
14
14
  - How to declare: frontmatter `structure` block mapping (key = top-level directory name with trailing slash, value = one-line semantics); the body records preset choices and nesting-rule notes
15
15
  - Agent placing assets into vault: read the declaration page first and place by position; with no fitting position, use the flat slot or create a directory then supplement the declaration; if the page is absent, place flat in the root directory
@@ -24,7 +24,7 @@ def check(ctx):
24
24
  return issues
25
25
  actual = {d + "/" for d in os.listdir(vroot)
26
26
  if os.path.isdir(os.path.join(vroot, d)) and not d.startswith(".")}
27
- declared = {str(k).strip() for k in decl}
27
+ declared = {str(k).strip().rstrip("/") + "/" for k in decl} # the directory name is the semantics; a key without the trailing slash is a form variance, not a drift
28
28
  for d in sorted(actual - declared):
29
29
  issues.append({"level": "warning", "message": f"vault top-level directory undeclared: {d} (add a declaration or put it in place)"})
30
30
  for d in sorted(declared - actual):
@@ -24,6 +24,8 @@ Owns the `tags` field conventions:
24
24
 
25
25
  ## Changelog
26
26
 
27
+ - 0.13 2026-11-12: attached-audit fix — a fully empty tag now reports under the empty-segment rule (previously slipped through: only slash-bearing tags were segmented-checked)
28
+ - 0.12 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
27
29
  - 0.11 2026-10-04: language neutralization — "Chinese-primary" removed; the primary language follows the language page's default key (absent → session language); hierarchy wording changed to "≤2, `/` separated"; the English kebab-case word-shape rule kept (already neutral); same batch as the language v0.2 follow-up cleanup
28
30
  - 0.10 2026-09-23: added the wiki dependency edge — inner-side plugins attach to wiki, aligning with the domain 0.1 declaration; omitted from the 2026-09-22 domain-ization batch
29
31
  - 0.9 2026-09-13: checks merged with executors unified as mechanically-confirmed items; expert review: two conflicting tellings versus actions.md
@@ -1,15 +1,15 @@
1
1
  id: tag
2
2
  schema_version: 1
3
- version: 0.11
3
+ version: 0.13
4
4
  depends:
5
5
  - wiki
6
- updated: 2026-10-06
6
+ updated: 2026-11-12
7
7
  attachment:
8
8
  - "Cross-cutting plugin: owns the frontmatter tags field across all pages plus vocabulary governance"
9
9
  - "scripts/check.py — attached audit (>5 per page / restating type / hierarchy depth)"
10
10
  fields:
11
11
  tags: "YAML list ≤5; primary language follows the language page's default key (absent → session language); English tags lowercase kebab-case; hierarchy ≤2, `/` separated; restating type forbidden"
12
- inject: "Page `tags` field: YAML list; primary language follows the default key of the writing-style declaration page `wiki/language.md` (page or key absent → session language); English tags lowercase kebab-case; hierarchy ≤2 (`/` separated), ≤5 per page; open semantic classification, restating type forbidden"
12
+ inject: "Page `tags`: YAML list, ≤5 per page, hierarchy ≤2 (`/`); language follows the `wiki/language.md` default (absent → session language); English tags lowercase kebab-case; open semantics, never restate `type`"
13
13
  usage:
14
14
  - Before writing, read `wiki/tags.md` and prefer reusing existing terms
15
15
  - New-term conventions: primary language follows the language page's default key (absent → session language, preventing mixed Chinese-English fragmentation of the vocabulary); English lowercase kebab-case; hierarchy ≤2; ≤5 per page; restating type forbidden
@@ -21,7 +21,9 @@ def check(ctx):
21
21
  issues.append({"level": "warning", "message": f"{rel}: tag restates type ({ptype})"})
22
22
  for t in tags:
23
23
  s = str(t)
24
- if "/" in s:
24
+ if not s.strip():
25
+ issues.append({"level": "warning", "message": f"{rel}: empty tag (no empty segments)"})
26
+ elif "/" in s:
25
27
  parts = s.split("/")
26
28
  if len(parts) > 2 or any(not p.strip() for p in parts):
27
29
  issues.append({"level": "warning", "message": f"{rel}: tag hierarchy over limit or empty segment ({s}, parent/child ≤2)"})
@@ -23,4 +23,5 @@
23
23
 
24
24
  ## Changelog
25
25
 
26
+ - 0.4 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
26
27
  - 0.3 (2026-10-06) inject line: code formatting restored on the territory path (issue #12 post-migration nit)- 0.2 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills- 0.1 2026-09-19: established — path-as-territory, invisible to the derived layer, stale_after cleanup prompts, delete upon promotion
@@ -1,13 +1,13 @@
1
1
  id: tmp
2
2
  schema_version: 1
3
- version: 0.3
3
+ version: 0.4
4
4
  depends:
5
5
  - wiki
6
- updated: 2026-10-06
6
+ updated: 2026-11-09
7
7
  attachment:
8
8
  - "wiki/tmp/ — temporary zone (the path is the territory; instance data — real contents never enter the framework repo or test-repo)"
9
9
  fields: {}
10
- inject: "Temporary zone `wiki/tmp/` (the path is the territory; type: tmp optional, landing outside → error): drafts and parsing intermediates, no retention promise, cleanable any time; invisible to the derived layer — excluded from index/tags, never a link source, broken links exempt; promote precious drafts promptly (draft deleted on promotion); intermediates set stale_after as they go — check reports over-age, disposal via confirmation (no automatic deletion); sensitive intermediates best gitignored instance-side"
10
+ inject: "Temporary zone `wiki/tmp/` (path = territory): drafts and intermediates, no retention promise, invisible to the derived layer; promote precious drafts (draft deleted on promotion); set `stale_after` — deletion only on confirmation; details PLUGIN.md"
11
11
  usage:
12
12
  - Drafts / parsing scratch: land directly at `wiki/tmp/<name>.md`, frontmatter kept simple (title + optional stale_after); broken links may stay as written
13
13
  - Promotion: content distilled via save into notes or merged into the target territory (a project decision section, etc.); delete the draft after the links close (agent-created drafts deleted by the agent; human drafts upon confirmation)
@@ -28,6 +28,8 @@ A derivation-destination bridge governing action items: domain plugins one-way d
28
28
 
29
29
  ## Changelog
30
30
 
31
+ - 0.6 2026-11-12: contract-had-no-enforcement fix — mechanical checks (territory placement / entry trigger + by/at contract / overdue info list) landed as the attached-audit script scripts/check.py, closing the gap between the declared checks and execution
32
+ - 0.5 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
31
33
  - 0.4 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills- 0.3 2026-10-02: global-domain batch two — established the on-demand bridge as the derivation destination; domain-plugin self-descriptions retained with a pointer
32
34
  - 0.2 2026-10-02: added 'create on absence' — when a new session's first read finds todo.md absent, it creates an empty page, so the entry discipline never falls through; guideline registration entry revised, empirically verified
33
35
  - 0.1 2026-09-14: established — the `wiki/todo.md` delegation queue, type: todo entered the registry territory values; settlement history goes to log, the log type value set extended with todo; no attached command — the write contract travels with the injection line
@@ -1,15 +1,16 @@
1
1
  id: todo
2
2
  schema_version: 1
3
- version: 0.4
3
+ version: 0.6
4
4
  bridge: 按需
5
5
  depends:
6
6
  - wiki
7
7
  - log
8
- updated: 2026-10-06
8
+ updated: 2026-11-12
9
9
  attachment:
10
10
  - "wiki/todo.md — temporary memory page (cross-session delegation queue)"
11
+ - "scripts/check.py — attached audit (territory placement / entry contract / overdue list)"
11
12
  fields: {}
12
- inject: "Temporary memory wiki/todo.md (type: todo): cross-session delegations and reminders; entry = trigger condition (date or context) + one sentence + by/at; read first at session start (before hot; absent → create empty); due or past entries raised proactively; append upon delegation, settle upon completion ([x] + log line, history to log); settled capped at 20; live working set only; on-demand bridge — domain plugins one-way derive action items in"
13
+ inject: "Temporary memory `wiki/todo.md`: read first at session start (before hot; absent → create empty), raise due entries; entry = trigger (date/context) + one sentence + by/at; settle with [x] + log line, settled ≤20; details PLUGIN.md"
13
14
  usage:
14
15
  - Append upon delegation: `- [ ] <date YYYY-MM-DD or context phrase>: one sentence (by: <actor>, at: <date>)`; date entries are mechanically scannable, context entries are semantically activated
15
16
  - Read this page first at the start of a new session (before hot; if absent, create an empty page): entries with now ≥ trigger day are proactively raised with the user; overdue and unsettled entries keep being raised, marked overdue
@@ -17,6 +18,6 @@ usage:
17
18
  - Cleanup: settled entries capped at 20, silently delete the oldest beyond the cap (log already holds the settlement record, deletion is not an event); valuable content is distilled via save upon completion; this page keeps no history
18
19
  - Self-create the page upon first delegation (frontmatter: type: todo + generated), independent of any initialization mechanism
19
20
  checks:
20
- - Mechanical (info-level): the list of date-triggered, overdue and unsettled entries (the mechanical basis for new-session reminders); page absent (the no-delegation norm)
21
- - Mechanical: entry missing trigger condition or by/at → warning; type: todo landing outside `wiki/todo.md` → error
21
+ - Mechanical (attached-audit script `scripts/check.py`, executed on audit discovery): entry missing trigger condition or by/at → warning; type: todo landing outside `wiki/todo.md` → error
22
+ - Mechanical (info-level, attached audit): date-triggered, overdue and unsettled entries (the mechanical basis for new-session reminders); page absent (the no-delegation norm)
22
23
  - Semantic (check command): open entries > 50 → warning (bloat triage: do what should be done, distill what should be distilled via save, confirm with the user what should be dropped)
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """todo plugin attached audit: mechanical items (territory placement / entry contract / overdue list).
4
+
5
+ Entry shape per the manifest: `- [ ] <trigger: date YYYY-MM-DD or context phrase>: one sentence (by: <actor>, at: <date>)`.
6
+ Bloat triage (open entries > 50) is a semantic item, under the check command.
7
+ """
8
+ import datetime
9
+ import re
10
+
11
+ DATE_RE = re.compile(r"^\d{4}-\d{2}-\d{2}$")
12
+
13
+
14
+ def check(ctx):
15
+ issues = []
16
+ today = datetime.date.today()
17
+ todo_page = None
18
+ for rel, fm, _body in ctx.pages:
19
+ if fm.get("type") == "todo" and rel != "todo.md":
20
+ issues.append({"level": "error", "message": f"{rel}: type: todo outside wiki/todo.md (territory misplacement)"})
21
+ if rel == "todo.md":
22
+ todo_page = _body
23
+ if todo_page is None:
24
+ return issues # page absent = the no-delegation norm, nothing to check
25
+ for i, raw in enumerate(todo_page.splitlines(), 1):
26
+ line = raw.rstrip()
27
+ if not line.startswith("- [ ]"):
28
+ continue # settled entries ([x]) and non-entry lines are out of scope
29
+ rest = line[len("- [ ]"):].strip()
30
+ # strip the trailing (by: …, at: …) parenthetical first, so its colons cannot be mistaken for the trigger separator
31
+ meta = ""
32
+ m = re.search(r"\(([^()]*)\)\s*$", rest)
33
+ if m and ("by:" in m.group(1) or "at:" in m.group(1)):
34
+ meta = m.group(1)
35
+ rest = rest[: m.start()].strip()
36
+ trig, sep, tail = rest.partition(":")
37
+ trig = trig.strip()
38
+ if not sep or not trig:
39
+ issues.append({"level": "warning", "message": f"todo.md:{i}: entry missing trigger condition ({line[:40]}…)"})
40
+ scope = meta or tail
41
+ if not re.search(r"by:\s*\S", scope):
42
+ issues.append({"level": "warning", "message": f"todo.md:{i}: entry missing by ({line[:40]}…)"})
43
+ if not re.search(r"at:\s*\S", scope):
44
+ issues.append({"level": "warning", "message": f"todo.md:{i}: entry missing at ({line[:40]}…)"})
45
+ if trig and sep and DATE_RE.match(trig):
46
+ try:
47
+ if datetime.date.fromisoformat(trig) < today:
48
+ issues.append({"level": "info", "message": f"todo.md:{i}: overdue and unsettled entry ({trig}: {tail[:40]}…)"})
49
+ except ValueError:
50
+ issues.append({"level": "warning", "message": f"todo.md:{i}: trigger date not a real calendar date ({trig})"})
51
+ return issues
@@ -59,6 +59,7 @@ Field bridge: the trust-field contract shared by all domain plugins across domai
59
59
 
60
60
  ## Changelog
61
61
 
62
+ - 0.10 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
62
63
  - 0.9 2026-10-02: global-domain batch one — established the mandatory bridge, i.e. the field bridge; domain bases must depend on it, kernel verifies completeness
63
64
  - 0.8 2026-09-23: added the wiki dependency edge — inner-side plugins attach to wiki, aligning with the domain 0.1 declaration; omitted from the 2026-09-22 domain-ization batch
64
65
  - 0.7 2026-09-13: usage gained the verified production channel — reviews are initiated by the user, agents never append spontaneously; expert review: the input channel was idling
@@ -1,10 +1,10 @@
1
1
  id: trust
2
2
  schema_version: 1
3
- version: 0.9
3
+ version: 0.10
4
4
  bridge: 必依
5
5
  depends:
6
6
  - wiki
7
- updated: 2026-10-06
7
+ updated: 2026-11-09
8
8
  attachment:
9
9
  - "scripts/check.py — attached audit (trust-field contract + stale list + trust-level counts)"
10
10
  fields:
@@ -12,7 +12,7 @@ fields:
12
12
  verified: "event list, items single-line `by: <actor>, at: <date>`, appendable multiple times; the trust level is derived from this"
13
13
  stale_after: "YYYY-MM-DD absolute moment; expiry check = the pure comparison now ≥ stale_after"
14
14
  sources: "source list, items contain id / resource / credibility signals (author, usage_count, last_modified)"
15
- inject: "Trust fields (optional per page): `generated` (who generated it) / `verified` (event list, items single-line by+at) / `stale_after` (expiry moment) / `sources` (sources and signals); level derivation never persisted — no record = unverified, only agent/process = machine-confirmed, contains human = human-reviewed, past stale_after = stale"
15
+ inject: "Trust fields (optional): `generated` / `verified` (by+at events) / `stale_after` / `sources`; level is derived, never stored — no record = unverified, agent/process only = machine-confirmed, any human = human-reviewed, past stale_after = stale"
16
16
  usage:
17
17
  - When writing a page, write `generated` along the way (block style: `by: agent/<current-model>` / `at: <today>`)
18
18
  - When a review action happens, append a `verified` event (single line `by: <actor>, at: <date>`), never fabricated to inflate the level
@@ -33,6 +33,8 @@ The cognition bridge: the global profile's extension point toward domain-level c
33
33
 
34
34
  ## Changelog
35
35
 
36
+ - 0.8 2026-11-12: contract-had-no-enforcement fix — mechanical checks (wrong-territory error / page-absent info) landed as the attached-audit script scripts/check.py, closing the gap between the declared checks and execution
37
+ - 0.7 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
36
38
  - 0.6 (2026-10-06) inject line: sections lost to the kernel comment-strip clip restored (quoted values are now protected), tightened for budget headroom — issue #12 post-migration nit- 0.5 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills- 0.4 2026-10-02: global-domain batch three — established the cognition bridge, on-demand: the profile body `## Domain Cognition` registration section, aggregate-don't-copy, read-first discipline; bb-track user.md the first registration; the mapping edge removed — under the bridge law it reached domain via the vault chain, causing a global plugin to be misjudged, caught by an actual kernel test; the 'hanging edges are harmless' premise failed
37
39
  - 0.3 2026-09-29: profile command established — the write side shed its parasitism on the map and save dual entry points, both commands' consumes entries removed; the evidence domain opened to any page inside wiki, dissolving the cross-domain ownership suspension; first creation self-builds on trigger, absorbing the profile part of the pending initialization items; tags explicitly not applied; depends kept, ruling: reference-level edges retained, not cut
38
40
  - 0.2 2026-09-14: usage added the profile distillation methodology — signal criteria, layered placement, assertions concrete and verifiable; the executable part of the distillation entered the write-side contract, closing the SASU-L disclosure loop: an agent running map or save knows how to distill, without relying on model priors; the full text remains in `docs/research-user-profile.md`
@@ -1,18 +1,19 @@
1
1
  id: user-profile
2
2
  schema_version: 1
3
- version: 0.6
3
+ version: 0.8
4
4
  bridge: 按需
5
5
  depends:
6
6
  - wiki
7
7
  - trust
8
8
  - sessions
9
- updated: 2026-10-06
9
+ updated: 2026-11-12
10
10
  attachment:
11
11
  - "wiki/profile.md — user profile page (a continuing cognition profile of the user)"
12
+ - "scripts/check.py — attached audit (territory placement / page presence)"
12
13
  fields: {}
13
14
  commands:
14
- - profile
15
- inject: "User profile wiki/profile.md (type: profile): continuing cognition of the user, static identity + dynamic preference layers, dimensions open; convergence-style updates (new replaces old, trace in body), assertions carry evidence wikilinks, preference layer stale_after; zero own fields, reuses trust; not in the notes territory, no tags; updates via the profile command (dual-track trigger, self-creates on first); read before personalized decisions; cognition bridge — domain cognition pages register one line each in ## Domain Cognition, the profile aggregates pointers only"
15
+ - owfa-profile
16
+ inject: "User profile `wiki/profile.md`: continuing cognition of the user (identity + preference layers); read before personalized decisions; write only via the profile command; assertions carry evidence wikilinks, preferences stale_after; details PLUGIN.md"
16
17
  usage:
17
18
  - Dual-track triggering: the user explicitly invokes profile; the agent calls it spontaneously in any session upon recognizing significant signals — signal distillation uniformly goes through this command, not parasitic on other command flows
18
19
  - Signal criteria: self-reported signals (preference expressions, corrections, background) and behavioral signals (subjects, fields, material habits); record only recurring subjects/fields, explicit preference expressions, corrections to output, and stable background facts (identity/tools/environment); one-off and instrumental content and uncertain observations are not recorded
@@ -26,5 +27,5 @@ usage:
26
27
  - Cognition bridge registration (a domain-plugin-side action, disclosed on this side): when a domain cognition plugin creates its archive and the profile is present, maintain one line in the profile's `## Domain Cognition` section (domain name + path-form wikilink); if the profile is absent, skip without proxy-creating it (on-demand bridge absence tolerance); multiple courses and archives register via the path-form wildcard (bb: <term>/<course> form)
27
28
  checks:
28
29
  - Semantic (check command): profile assertion missing an evidence wikilink → warning
29
- - Mechanical: a type: profile page landing in `wiki/notes/` or `wiki/vault/` (wrong territory) → error
30
- - Mechanical (info-level): profile page absent (the untriggered norm; profile self-creates on first trigger)
30
+ - Mechanical (attached-audit script `scripts/check.py`, executed on audit discovery): a type: profile page landing in `wiki/notes/` or `wiki/vault/` (wrong territory) → error
31
+ - Mechanical (info-level, attached audit): profile page absent (the untriggered norm; profile self-creates on first trigger)
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """user-profile plugin attached audit: mechanical items (territory placement / page presence).
4
+
5
+ Assertion evidence-wikilink grading is a semantic item, under the check command.
6
+ """
7
+
8
+
9
+ def check(ctx):
10
+ issues = []
11
+ present = False
12
+ for rel, fm, _body in ctx.pages:
13
+ if fm.get("type") == "profile":
14
+ if rel.startswith("notes/") or rel.startswith("vault/"):
15
+ issues.append({"level": "error", "message": f"{rel}: type: profile in the wrong territory (single-page territory, wiki/profile.md only)"})
16
+ if rel == "profile.md":
17
+ present = True
18
+ if not present:
19
+ issues.append({"level": "info", "message": "no profile page (the untriggered norm; profile self-creates on first trigger)"})
20
+ return issues
@@ -20,6 +20,7 @@ No structure or scripts of its own. The external territory is the root-level `va
20
20
 
21
21
  ## Changelog
22
22
 
23
+ - 0.7 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
23
24
  - 0.6 2026-10-02: global-domain batch one — added the trust and log mandatory-bridge edges; vault previously lacked even the trust edge, confirmed by audit; constitution principle 11, kernel verifies completeness
24
25
  - 0.5 2026-09-22: domain-ization — depends gained domain, i.e. the default-domain positioning, and wiki, i.e. the territory declaration `wiki/vault/`; the dual role spelled out: doubling as the landing repository for other domains, the url field as the passthrough interface
25
26
  - 0.4 2026-09-14: all three governance blocks claimed — source preservation, claiming the registry-reserved field `url`, provenance registration for URL-type assets, the write contract in mapping usage; structure rules moved to the structure plugin established at 0.1; lifecycle and change propagation go to mapping reference counting with recomputation audit trails, in coordination with check triage
@@ -0,0 +1,13 @@
1
+ id: vault
2
+ schema_version: 1
3
+ version: 0.7
4
+ depends:
5
+ - domain
6
+ - wiki
7
+ - trust
8
+ - log
9
+ updated: 2026-11-09
10
+ attachment: []
11
+ fields:
12
+ url: "Source URL; provenance registration for URL-type assets (source preservation), optional for manual placement, required for agent channels (delegate etc.); also the interface for other domains to land via vault"
13
+ inject: "Default domain `vault/` (real assets of any format; landing repository for other domains), wiki-side `wiki/vault/`; commands are append-only toward vault — deleting/modifying belongs to the human; layout per `wiki/structure.md`"
@@ -28,6 +28,7 @@ Cross-cutting plugins — tag, trust, link — occupy fields and syntax, not pag
28
28
 
29
29
  ## Changelog
30
30
 
31
+ - 0.8 2026-11-09: inject line rewritten to routing-pointer density (issue #49 phase 1, relieves the #48 budget): path + read/write trigger + the one easy-to-break invariant + pointer here; the dropped detail already lives in this file / the manifest
31
32
  - 0.7 2026-10-02: two territory forms — proxy pages as the default, plus in-domain native pages, i.e. domain-side archives declared by a domain with shape owned by the domain plugin; group-meeting ruling, first case bb-track cognition profile user.md; legitimizes the existing tension of lark and email archive pages, not an exception hatch
32
33
  - 0.6 2026-09-29: narrative reinforcement — the origin dichotomy spelled out as three page-origin layers: domain territories, native territory, derived facilities; added cross-cutting plugin positioning; sessions characterized as minutes not mirrors, the source vanishes and the page is the true body
33
34
  - 0.5 2026-09-22: domain-ization — the origin dichotomy generalized to "pages each domain declares as its territory", removing the vault-specific hardcoding; territory-to-domain mapping read from path convention, declarations in each domain's manifest; first paragraph rewritten to the inner/outer narrative
@@ -0,0 +1,8 @@
1
+ id: wiki
2
+ schema_version: 1
3
+ version: 0.8
4
+ depends: []
5
+ updated: 2026-11-09
6
+ attachment: []
7
+ fields: {}
8
+ inject: "wiki container `wiki/`: territory pages (domain proxy projections or in-domain native pages), native writings (true body here), derived index/tags/hot/log; frontmatter = top-level scalars, block lists, one-level block mappings only; details PLUGIN.md"
@@ -1,10 +1,10 @@
1
1
  # {{name}}
2
2
 
3
- This is an OWFA workspace — a `vault/` of real assets plus a `wiki/` the agent can re-enter without being re-introduced. `vault/` holds files in any format, `wiki/` holds the markdown pages the agent reads and writes, and `.meta/` + `.agents/skills/` are the framework body. Rewrite this paragraph freely: everything outside the injection region is yours, and the agent never edits it.
3
+ This is an OWFA workspace — a `vault/` of real assets plus a `wiki/` the agent can re-enter without being re-introduced. `vault/` holds files in any format, `wiki/` holds the markdown pages the agent reads and writes, and `.owfa/` + `.agents/skills/` are the framework body. Rewrite this paragraph freely: everything outside the injection region is yours, and the agent never edits it.
4
4
 
5
5
  ## Layout
6
6
 
7
- `vault/` real assets · `wiki/` the md world · `.meta/` + `.agents/skills/` the framework body (domain packages under `.meta/plugins/domains/`).
7
+ `vault/` real assets · `wiki/` the md world · `.owfa/` + `.agents/skills/` the framework body (domain packages under `.owfa/plugins/domains/`).
8
8
 
9
9
  ## Git
10
10
 
@@ -1,130 +0,0 @@
1
- ---
2
- name: check
3
- owner: framework
4
- description: "Audit the repository's health: hard-structure checks on the foundation and plugins + semantic checks on plugins and pages. Triggers on: check, 健康检查, 检查插件, lint."
5
- ---
6
-
7
- # check: repository health audit
8
-
9
- This is an audit, not a guardrail. It outputs a graded report: error = structural breakage requiring action; warning = a suggested to-do. Check rules come from two places: the foundation part of this file (protocol level) + the injection region below (a mechanical projection by wiki_plugin_kernel from each plugin manifest's checks list; presence means registration).
10
-
11
- ## Purpose
12
-
13
- Run one health audit over the entire instance (foundation + plugins + wiki pages).
14
-
15
- ## Scope
16
-
17
- Read: everything (.meta/, the AGENTS.md injection region, .agents/skills/, the wiki/, vault/ directory trees)
18
- Write: one line in wiki/log.md (type "check"); regenerable zones are rebuilt directly per the action discipline (scripts: injection region / registry / command copies; semantics: index / tags / hot eviction / log archiving / hash recomputation)
19
-
20
- ## Steps
21
-
22
- 1. **Foundation hard checks** (protocol level):
23
- - **Static self-check script**: `python .meta/scripts/wiki_plugin_kernel.py validate` (directory completeness, manifest seven fields + optional commands, id consistency, dependency existence, acyclicity, command binding owner×commands bidirectional consistency) — any error means FAIL
24
- - **Idempotent rebuild**: `python .meta/scripts/wiki_plugin_kernel.py all` (injection region / registry plugin section / command copies — mechanical and automatic; drift is fixed here, the script source is the rule list)
25
- - `.meta/protocol/registry.yaml` is in place with the protocol / reserved sections intact (the script never touches these two sections; a missing section is an error)
26
- - **Value-set violation**: scan the frontmatter of all wiki/ pages; a type / status value outside the registry value set → error
27
- - Every `.meta/command/` SKILL.md has frontmatter (name / description / owner; optional consumes — an ordered list of plugins whose write-side contracts are consumed; referenced plugins must be present with a usage list; mandatory for owner-driven commands)
28
- 2. **Plugin checks**: first run the attached audit `python .meta/scripts/wiki_plugin_kernel.py audit` (mechanical items: each plugin's scripts/check.py executed on audit discovery, read-only reporting; errors count toward FAIL); then execute the items marked "semantic" in the injection-region blocks below
29
- 3. **Semantic checks**: read plugin and command files, looking for dangling references (a command referring to nonexistent structure), ghost fields (page fields with no owning plugin and not registry-reserved), and injection-region blocks inconsistent with the PLUGIN.md Checks section
30
- 4. Summary output: PASS / WARN / FAIL counts + graded details + vault backlog count (informational)
31
- 5. **Fixes are executed by grade per the action discipline** (`.meta/protocol/actions.md`): mechanical-automatic items are done directly — `pipeline.py index` / `tags` (index rebuild), `wiki_plugin_kernel.py all` (registry / injection region / copies), hash recomputation (raw_sha256 of changed frontmatter); hot / log overflows are converged by their own write-pipeline commands; mechanical-confirmation items present a list and ask once; semantic items are reported only; historical entries are never automatically changed
32
- 6. Prepend one line to wiki/log.md (type "check", via `pipeline.py log check "<one line>"`); if anything changed (fixes / a log line), commit per the commit discipline (`检查: <conclusion>`, see `.meta/protocol/actions.md`)
33
-
34
- ## Tools
35
-
36
- grep / file reading suffice; no second scan when one read is enough (call frugality).
37
-
38
- ## Parameters
39
-
40
- - None: full-repository audit
41
- - Plugin id: check that plugin only
42
-
43
- ## Injected Section (plugin check blocks)
44
-
45
- > This region is a wiki_plugin_kernel projection from each plugin manifest's checks list (rebuilt by `inject` / `all`; presence means registration); handwritten content does not belong here — to change check rules, edit PLUGIN.yaml.
46
-
47
- <!-- check-inject:start -->
48
- <!-- check:device -->
49
- - Mechanical (attached-audit script `scripts/check.py`, executed discovery-style by audit): device block mapping's warranty_until within ≤30 days of today → warning nearing expiry; already expired → warning expired; invalid date → warning
50
- <!-- /check:device -->
51
-
52
- <!-- check:hot -->
53
- - Window out of bounds (>25 entries / >5 days / >200 chars per entry) → run `pipeline.py hot <type> "<backfill>"` once, or wait for the next write to converge naturally then re-check
54
- - Contradiction with log (log has records while hot shows no trace) → warning
55
- <!-- /check:hot -->
56
-
57
- <!-- check:language -->
58
- - Mechanical (attached-audit script `scripts/check.py`, executed discovery-style by audit): type: language landing outside `wiki/language.md` → error; terms empty values → warning; declaration page absent → info (session-language fallback tolerated)
59
- <!-- /check:language -->
60
-
61
- <!-- check:link -->
62
- - Mechanical items (attached-audit script `scripts/check.py`, executed on audit discovery): broken link (target is neither a page full name nor any page's aliases) → warning; hand-written broken link in hot → warning (not counted as an inbound-link source); garbled link (target contains the U+FFFD replacement character, including related items) → error; alias ambiguity (two pages declaring the same aliases, resolution indeterminate) → error; orphan page (no inbound links and no related references, inbound sources counting concept pages only) → warning for notes knowledge pages, info for territory-value registration pages (registry territory values except session, having no inbound links yet being the registration norm); one-way related (A lists B while B does not list back) → info
63
- - Semantic items (check command): inbound-link density top list → info item (evidence for hub emergence, no alert)
64
- <!-- /check:link -->
65
-
66
- <!-- check:log -->
67
- - Mechanical items (attached-audit script `scripts/check.py`, executed on audit discovery): undated entries (starting with `- ` yet not matching the date format, main file and archive checked alike) → error
68
- - Semantic items (check command): historical entries modified (verifiable via git) → error; capacity over the limit → re-check after mechanical archiving
69
- <!-- /check:log -->
70
-
71
- <!-- check:notes -->
72
- - Traces of a note overwritten by a command → error
73
- - Near-duplicate notes (Jaccard > 0.7) → warning
74
- <!-- /check:notes -->
75
-
76
- <!-- check:sessions -->
77
- - Mechanical (covered by audit): session-type pages outside `wiki/sessions/` (or the reverse) → warning; participants missing or entries violating the actor convention → warning
78
- - Semantic: backbone page bloated past due promotion (should have been promoted but was not) → warning
79
- <!-- /check:sessions -->
80
-
81
- <!-- check:tag -->
82
- - Mechanical items (attached-audit script `scripts/check.py`, executed on audit discovery): >5 tags on one page → warning; tags restating type → warning; hierarchy over the limit (parent/child ≤2) or empty segment → warning
83
- - Semantic items (check command): near-duplicate tags → warning suggesting a merge; merging is a mechanically-confirmed item (list presented, executed after user confirmation)
84
- <!-- /check:tag -->
85
-
86
- <!-- check:tmp -->
87
- - Semantic (v0.1 manual, attached audit deferred): type: tmp landing outside wiki/tmp/ → error; stale_after already past → warning (cleanup prompt); tmp page count > 20 → info (backlog triage)
88
- <!-- /check:tmp -->
89
-
90
- <!-- check:trust -->
91
- - Mechanical items (attached-audit script `scripts/check.py`, executed on audit discovery): generated missing by/at or wrong actor format, verified event missing by/at or wrong format, stale_after not YYYY-MM-DD, sources not a list → warning
92
- - Mechanical items (info level): stale page list (past stale_after); trust-level counts (human-reviewed / machine-confirmed counts)
93
- - Semantic (check command): stale-page disposition triage (refresh the moment / re-verify / deprecate) — human decides
94
- <!-- /check:trust -->
95
-
96
- <!-- check:calendar -->
97
- - Semantic (v0.1 manual, attached audit deferred): month page file name not YYYY-MM or landing outside wiki/calendar/ → error; traces of rewriting a past month's page → error (git audit); declaration page missing the `calendar` block → info (the manual-only norm)
98
- <!-- /check:calendar -->
99
-
100
- <!-- check:cron -->
101
- - Mechanical: a type: cron page landing outside wiki/cron/ → error; task page missing the cron block or the minimal key set (trigger/action/form/status) → warning; malformed condition trigger (kind outside the open vocabulary or missing target) → warning; time form: last_run beyond the schedule period with active → warning (projection-lost signal)
102
- - Semantic (attached audit deferred): per-form drift between readable execution-side lists (scheduler / system tasks / conditional-executor watches, best-effort) and the declaration page set → warning; unreadable executor → info
103
- <!-- /check:cron -->
104
-
105
- <!-- check:index -->
106
- - Deviation between indexes and the actual page set (including merged-back indexes pending deletion) → fixed by running `pipeline.py index` to rebuild (idempotent; no diff means consistent); same for tags (`pipeline.py tags`)
107
- - Traces of hand editing → warning
108
- <!-- /check:index -->
109
-
110
- <!-- check:todo -->
111
- - Mechanical (info-level): the list of date-triggered, overdue and unsettled entries (the mechanical basis for new-session reminders); page absent (the no-delegation norm)
112
- - Mechanical: entry missing trigger condition or by/at → warning; type: todo landing outside `wiki/todo.md` → error
113
- - Semantic (check command): open entries > 50 → warning (bloat triage: do what should be done, distill what should be distilled via save, confirm with the user what should be dropped)
114
- <!-- /check:todo -->
115
-
116
- <!-- check:user-profile -->
117
- - Semantic (check command): profile assertion missing an evidence wikilink → warning
118
- - Mechanical: a type: profile page landing in `wiki/notes/` or `wiki/vault/` (wrong territory) → error
119
- - Mechanical (info-level): profile page absent (the untriggered norm; profile self-creates on first trigger)
120
- <!-- /check:user-profile -->
121
-
122
- <!-- check:mapping -->
123
- - Mechanical items (attached-audit script `scripts/check.py`, executed on audit discovery): mirror diff (file in vault without proxy → info backlog; proxy without counterpart → error, message carries the reference count — see the impact surface before deleting); missing registration fields (raw_file / raw_sha256) → error; dangling raw_file → error; raw_sha256 mismatch → warning; suspected full-text duplication (md asset body ≥80% of the original) → warning; description-less stub with updated older than 90 days → warning
124
- - Semantic items (check command): mismatch-disposition triage (description still applies → mechanical recalculation auto-repairs, writing a log line on completion (type map, one sentence with the asset name and 'original changed, description still applies'); suspected invalid → human decides remap or delete); diary-type full-text duplication exemption judgment; before disposing an orphan proxy, handle its references first (update references in sync or leave aliases to redirect)
125
- <!-- /check:mapping -->
126
-
127
- <!-- check:structure -->
128
- - Mechanical items (attached-audit script `scripts/check.py`, executed on audit discovery): declaration diff — vault top-level directory undeclared → warning, declaration key pointing to a nonexistent directory → warning; type: structure landing outside `wiki/structure.md` → error; declaration page absent → info (flat tolerance)
129
- <!-- /check:structure -->
130
- <!-- check-inject:end -->