owfadev 0.3.2 → 0.4.1

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 +68 -0
  41. package/README.md +32 -24
  42. package/README.zh-CN.md +32 -24
  43. package/bin/owfa.js +483 -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "owfadev",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "OWFA — One Workspace For All (agents). Install, initialize and upgrade the owfa agent workspace framework.",
5
5
  "keywords": [
6
6
  "owfa",
@@ -28,9 +28,10 @@
28
28
  "owfadev": "bin/owfa.js"
29
29
  },
30
30
  "files": [
31
- ".meta",
31
+ ".owfa",
32
32
  ".agents",
33
33
  "bin",
34
+ "payloads",
34
35
  "templates"
35
36
  ],
36
37
  "engines": {
@@ -0,0 +1,15 @@
1
+ schema_version: 1
2
+ id: personal
3
+ kind: suite
4
+ version: 0.1.0
5
+ compat: ">= 0.4"
6
+ members: [calendar, cron, device, domain, hot, index, instance-git, language, link, log, mapping, notes, sessions, structure, tag, tmp, todo, trust, user-profile, vault, wiki]
7
+ depends: [framework]
8
+ skeleton: [vault/, wiki/notes/, wiki/sessions/, wiki/vault/]
9
+ uninstall:
10
+ anchors: [wiki/profile.md, wiki/language.md, wiki/calendar.md, wiki/todo.md, wiki/cron/]
11
+ retains: [vault/, wiki/]
12
+ credentials: []
13
+ bridges: []
14
+ processes: []
15
+ disclosure: "Purely local information organization (calendar / todo / notes / sessions / vault proxies / tags / index / logs / cron intents); no network services, no credentials, no external data sources — all content stays on this machine's repository."
@@ -0,0 +1,7 @@
1
+ # payloads/personal/ — the embedded blessed suite copy
2
+
3
+ Embedded copy of the **personal suite** package (source: `owfadev/owfa-personal`,
4
+ synced by `scripts/sync-blessed.sh` before each release). `owfa init` installs this
5
+ copy via `kernel install --path payloads/personal` — the default bootstrap stays
6
+ 100% offline. See the channel repository's own docs for the package's members,
7
+ skeleton and teardown anchors (PKG.yaml).
@@ -31,5 +31,6 @@ A derivation-destination bridge governing schedules: domain plugins one-way deri
31
31
 
32
32
  ## Changelog
33
33
 
34
+ - 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
34
35
  - 0.4 (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.3 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills- 0.2 2026-10-02: global-domain batch two — established the on-demand bridge as the derivation destination; domain-plugin self-descriptions retained with a pointer
35
36
  - 0.1 2026-09-19: established — month-page two-section scheme, the open source model, the freezing regime; lark-calendar as the first source adapter
@@ -1,17 +1,17 @@
1
1
  id: calendar
2
2
  schema_version: 1
3
- version: 0.4
3
+ version: 0.5
4
4
  bridge: 按需
5
5
  depends:
6
6
  - wiki
7
7
  - trust
8
- updated: 2026-10-06
8
+ updated: 2026-11-09
9
9
  attachment:
10
10
  - "wiki/calendar.md — declaration page (`calendar` block mapping = source key → source declaration; self-created when the first source attaches, manual-only may be absent)"
11
11
  - "wiki/calendar/ — month pages YYYY-MM.md (one page per month, two-section scheme)"
12
12
  fields:
13
13
  calendar: "block mapping (declaration page) — source key → source declaration (value syntax belongs to the adapter: lark-calendar uses `lark/<profile> <calendar_id|primary>`); the source key is the end-of-line tag on schedule lines"
14
- inject: "Time territory: declaration page wiki/calendar.md (calendar block mapping = source key → declaration; absent = manual-only) + month pages wiki/calendar/YYYY-MM.md — ## Schedule source projection refreshed wholesale + ## Manual Notes append-only; event lines may wikilink, events get no pages; future rolling, past frozen; month stale_after default 2 days; boundary — calendar stores what happens when, todo what is pending; on-demand bridge (domains derive source-keyed lines into the current month)"
14
+ inject: "Time territory: `wiki/calendar.md` (source keys; absent = manual-only) + month pages `wiki/calendar/YYYY-MM.md` (`## Schedule` refreshed wholesale, `## Manual Notes` append-only); calendar = what happens when, todo = what is pending; details PLUGIN.md"
15
15
  usage:
16
16
  - Sync (mechanical): read the declaration page's source list → each source pulled for the current and next month by its adapter → wholesale section refresh of each month page's `## Schedule` (lines tagged with the source key) → `pipeline.py verify` + log line + commit (`映射: calendar`)
17
17
  - Daily refresh (unattended session): deployment-side cron triggers the sync session on schedule, fully mechanical, no confirmation needed; failed sources are reported via log and do not block other sources; semantic enhancements (event notes, link completion) are left to interactive sessions
@@ -1,26 +1,26 @@
1
1
  ---
2
- name: map
2
+ name: owfa-map
3
3
  owner: mapping
4
4
  consumes: [mapping, trust, tag, index, hot, log]
5
5
  description: "Map assets in vault/ into wiki proxy pages: SHA-256, mirror path, frontmatter, index/hot-cache/log linkage. Triggers on: map, 映射, process this source, add this to the wiki."
6
6
  ---
7
7
 
8
- # map: mapping
8
+ # owfa-map: mapping
9
9
 
10
10
  Map assets in `vault/` into `wiki/vault/` proxy pages — mapping and understanding are decoupled: a pure registration action (registration fields, body scale, and other write-side contracts are in the injection region). It targets only assets already in vault and does no vault-side processing (organizing and polishing belong to vault governance, discussed separately).
11
11
 
12
12
  ## Scope
13
13
 
14
14
  Write: mapping (proxy pages), log, hot, index
15
- Read: registry (`.meta/protocol/registry.yaml`, field and value-set anchor), tag (vocabulary `wiki/tags.md`), trust (generated), vault (originals)
15
+ Read: registry (`.owfa/protocol/registry.yaml`, field and value-set anchor), tag (vocabulary `wiki/tags.md`), trust (generated), vault (originals)
16
16
 
17
17
  ## Steps
18
18
 
19
- 1. **Anchor (one-time read)**: read `.meta/protocol/registry.yaml` and `wiki/tags.md` — value sets and the existing vocabulary are visible before writing
19
+ 1. **Anchor (one-time read)**: read `.owfa/protocol/registry.yaml` and `wiki/tags.md` — value sets and the existing vocabulary are visible before writing
20
20
  2. Read the target asset in vault/
21
21
  3. Assemble the proxy-page draft per the write-side contracts in the injection region (mapping mirror and registration fields, trust generated, tag labeling); **present the mapping preview** (path / hash / description / tags) and wait for user confirmation
22
22
  4. After confirmation, write the proxy page
23
- 5. **Post-write pipeline** (deterministic, mechanical and automatic, no prompting): execute each plugin's write calls in injection-region order, then finish with `python .meta/scripts/pipeline.py verify` (post-write self-verification; on failure, go back and fix); then commit per the commit discipline (`映射: <asset name>`, see the vocabulary in `.meta/protocol/actions.md`)
23
+ 5. **Post-write pipeline** (deterministic, mechanical and automatic, no prompting): execute each plugin's write calls in injection-region order, then finish with `python .owfa/scripts/pipeline.py verify` (post-write self-verification; on failure, go back and fix); then commit per the commit discipline (`映射: <asset name>`, see the vocabulary in `.owfa/protocol/actions.md`)
24
24
  6. Report: path / hash / description / tags
25
25
 
26
26
  ## Prohibitions
@@ -37,7 +37,7 @@ Output language takes the default key of the language declaration page `wiki/lan
37
37
 
38
38
  ## Injected Section (plugin usage blocks)
39
39
 
40
- > This region is a wiki_plugin_kernel projection: consumes pulls merged with usage_routes source-side routing; disclosure order = owner first, routed blocks in the middle, pulled blocks last (rebuilt by inject / all); handwritten content does not belong here — to change the write-side contract, edit PLUGIN.yaml.
40
+ > This region is a owfa-kernel projection: consumes pulls merged with usage_routes source-side routing; disclosure order = owner first, routed blocks in the middle, pulled blocks last (rebuilt by inject / all); handwritten content does not belong here — to change the write-side contract, edit PLUGIN.yaml.
41
41
 
42
42
  <!-- cmd-inject:start -->
43
43
  <!-- usage:mapping -->
@@ -59,14 +59,14 @@ Output language takes the default key of the language declaration page `wiki/lan
59
59
  <!-- /usage:tag -->
60
60
 
61
61
  <!-- usage:index -->
62
- - Post-write rebuild (mechanical, automatic): `python .meta/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
62
+ - Post-write rebuild (mechanical, automatic): `python .owfa/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
63
63
  <!-- /usage:index -->
64
64
 
65
65
  <!-- usage:hot -->
66
- - Writing entries (mechanical, automatic): `python .meta/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
66
+ - Writing entries (mechanical, automatic): `python .owfa/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
67
67
  <!-- /usage:hot -->
68
68
 
69
69
  <!-- usage:log -->
70
- - Writing lines (mechanical, automatic): `python .meta/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
70
+ - Writing lines (mechanical, automatic): `python .owfa/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
71
71
  <!-- /usage:log -->
72
72
  <!-- cmd-inject:end -->
@@ -1,26 +1,26 @@
1
1
  ---
2
- name: profile
2
+ name: owfa-profile
3
3
  owner: user-profile
4
4
  consumes: [user-profile, trust, index, hot, log]
5
5
  description: "Maintain the user profile wiki/profile.md: recognize self-description and behavioral signals, update assertions convergently (new values replace old, changes leave traces in the body, evidence wikilinks); construction and consolidation go through a whole-page rewrite preview. Triggers on: profile, 更新画像, 画像更新, update profile."
6
6
  ---
7
7
 
8
- # profile: profile update
8
+ # owfa-profile: profile update
9
9
 
10
10
  Write the continuing cognition about the user into a checkable page: assertions carry evidence, preferences expire, updates leave traces. The direction is "inner → user cognition" — orthogonal to map (outer → inner translation) and save (sessions landing on disk); convergent across sessions, not a transactional one-shot. Write-side contracts (signal criteria, layered placement, assertion format, convergence traces) are in the injection region.
11
11
 
12
12
  ## Scope
13
13
 
14
14
  Write: user-profile (wiki/profile.md), log, hot, index
15
- Read: registry (`.meta/protocol/registry.yaml`, field and value-set anchor), trust (generated / stale_after), the current profile page (may be absent)
15
+ Read: registry (`.owfa/protocol/registry.yaml`, field and value-set anchor), trust (generated / stale_after), the current profile page (may be absent)
16
16
 
17
17
  ## Steps
18
18
 
19
- 1. **Anchor (one-time read)**: read `.meta/protocol/registry.yaml` and `wiki/profile.md` — a missing page = first creation (construction), no reliance on an initialization mechanism
20
- 2. **Judge signals** (criteria in the injection region): if this session's and recent observations do not qualify, report and exit — never force a write
19
+ 1. **Anchor (one-time read)**: read `.owfa/protocol/registry.yaml` and `wiki/profile.md` — a missing page = first creation (construction), no reliance on an initialization mechanism
20
+ 2. **Judge signals** (criteria in the user-profile usage block below): if this session's and recent observations do not qualify, report and exit — never force a write
21
21
  3. Assemble the update: incremental assertions (new value replaces old + body trace) or construction / consolidation (whole-page rewrite) — construction and consolidation **present a profile preview** (assertions / evidence / layers) and wait for user confirmation
22
- 4. Write the page (layered placement and stale_after renewal in the injection region)
23
- 5. **Post-write pipeline** (deterministic, mechanical and automatic, no prompting): execute each plugin's write calls in injection-region order, then finish with `python .meta/scripts/pipeline.py verify` (post-write self-verification; on failure, go back and fix); then commit per the commit discipline (`画像: <one line>`, see the vocabulary in `.meta/protocol/actions.md`)
22
+ 4. Write the page (layered placement and stale_after renewal per the usage block below)
23
+ 5. **Post-write pipeline** (deterministic, mechanical and automatic, no prompting): execute each plugin's write calls in injection-region order, then finish with `python .owfa/scripts/pipeline.py verify` (post-write self-verification; on failure, go back and fix); then commit per the commit discipline (`画像: <one line>`, see the vocabulary in `.owfa/protocol/actions.md`)
24
24
  6. Report: what was updated / the evidence chain / which layer it landed in
25
25
 
26
26
  ## Prohibitions
@@ -39,7 +39,7 @@ Output language takes the default key of the language declaration page `wiki/lan
39
39
 
40
40
  ## Injected Section (plugin usage blocks)
41
41
 
42
- > This region is a wiki_plugin_kernel projection: consumes pulls merged with usage_routes source-side routing; disclosure order = owner first, routed blocks in the middle, pulled blocks last (rebuilt by inject / all); handwritten content does not belong here — to change the write-side contract, edit PLUGIN.yaml.
42
+ > This region is a owfa-kernel projection: consumes pulls merged with usage_routes source-side routing; disclosure order = owner first, routed blocks in the middle, pulled blocks last (rebuilt by inject / all); handwritten content does not belong here — to change the write-side contract, edit PLUGIN.yaml.
43
43
 
44
44
  <!-- cmd-inject:start -->
45
45
  <!-- usage:user-profile -->
@@ -62,14 +62,14 @@ Output language takes the default key of the language declaration page `wiki/lan
62
62
  <!-- /usage:trust -->
63
63
 
64
64
  <!-- usage:index -->
65
- - Post-write rebuild (mechanical, automatic): `python .meta/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
65
+ - Post-write rebuild (mechanical, automatic): `python .owfa/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
66
66
  <!-- /usage:index -->
67
67
 
68
68
  <!-- usage:hot -->
69
- - Writing entries (mechanical, automatic): `python .meta/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
69
+ - Writing entries (mechanical, automatic): `python .owfa/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
70
70
  <!-- /usage:hot -->
71
71
 
72
72
  <!-- usage:log -->
73
- - Writing lines (mechanical, automatic): `python .meta/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
73
+ - Writing lines (mechanical, automatic): `python .owfa/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
74
74
  <!-- /usage:log -->
75
75
  <!-- cmd-inject:end -->
@@ -1,18 +1,18 @@
1
1
  ---
2
- name: save
2
+ name: owfa-save
3
3
  owner: [notes, sessions]
4
4
  consumes: [notes, sessions, trust, index, hot, log]
5
5
  description: "Save the current conversation, answers, or insights as wiki native notes. Deduplicate before filing, infer type and title, chunk-extract long sessions, update index/log/hot cache. Triggers on: save this, /save, file this, save to wiki, 保存."
6
6
  ---
7
7
 
8
- # save: capture
8
+ # owfa-save: capture
9
9
 
10
10
  Good answers should not vanish in chat history. Save what was just discussed as permanent wiki pages. The wiki compounds through it — save often.
11
11
 
12
12
  ## Scope
13
13
 
14
14
  Write: sessions (session backbone pages), notes (native notes), log, hot, index
15
- Read: registry (`.meta/protocol/registry.yaml`, field and value-set anchor), tag (vocabulary `wiki/tags.md`), trust (generated), index / hot (dedup prerequisites)
15
+ Read: registry (`.owfa/protocol/registry.yaml`, field and value-set anchor), tag (vocabulary `wiki/tags.md`), trust (generated), index / hot (dedup prerequisites)
16
16
 
17
17
  ## Dedup Before Filing (required)
18
18
 
@@ -27,13 +27,13 @@ type / status value sets defer to the registry (a one-time read anchor; do not r
27
27
 
28
28
  ## Workflow
29
29
 
30
- 1. **Anchor (one-time read)**: read `.meta/protocol/registry.yaml` and `wiki/tags.md` — type / status value sets and the existing vocabulary are visible before writing
30
+ 1. **Anchor (one-time read)**: read `.owfa/protocol/registry.yaml` and `wiki/tags.md` — type / status value sets and the existing vocabulary are visible before writing
31
31
  2. Scan the conversation for high-value content (non-obvious insights, decisions with reasons, hard-won analyses, comparisons that will be cited again); skip mechanical Q&A / debugging processes / content already in the repository
32
32
  3. Set the type (ask only on genuine ambiguity) and title (ask only on ambiguity or conflict)
33
33
  4. Rewrite in declarative present tense: write knowledge, not dialogue
34
34
  5. Create the page per the write-side contracts in the injection region (notes / sessions destinations and shapes, trust generated, tag labeling); the session type goes to the long-sessions section
35
35
  6. Write wiki pages mentioned in the conversation into related with wikilinks
36
- 7. **Post-write pipeline** (deterministic, mechanical, automatic): execute each plugin's write calls in injection-region order, then finish with `python .meta/scripts/pipeline.py verify` (post-write self-verification; on failure, go back and fix); then commit per the commit discipline (`保存: <page title>`, see `.meta/protocol/actions.md`)
36
+ 7. **Post-write pipeline** (deterministic, mechanical, automatic): execute each plugin's write calls in injection-region order, then finish with `python .owfa/scripts/pipeline.py verify` (post-write self-verification; on failure, go back and fix); then commit per the commit discipline (`保存: <page title>`, see `.owfa/protocol/actions.md`)
37
37
  8. Report: `Saved as [[title]] in wiki/notes/` (session type: `... in wiki/sessions/`)
38
38
 
39
39
  ## Long Sessions (session backbone)
@@ -52,7 +52,7 @@ Declarative present tense; output language takes the default key of the language
52
52
 
53
53
  ## Injected Section (plugin usage blocks)
54
54
 
55
- > This region is a wiki_plugin_kernel projection: consumes pulls merged with usage_routes source-side routing; disclosure order = owner first, routed blocks in the middle, pulled blocks last (rebuilt by inject / all); handwritten content does not belong here — to change the write-side contract, edit PLUGIN.yaml.
55
+ > This region is a owfa-kernel projection: consumes pulls merged with usage_routes source-side routing; disclosure order = owner first, routed blocks in the middle, pulled blocks last (rebuilt by inject / all); handwritten content does not belong here — to change the write-side contract, edit PLUGIN.yaml.
56
56
 
57
57
  <!-- cmd-inject:start -->
58
58
  <!-- usage:notes -->
@@ -62,7 +62,7 @@ Declarative present tense; output language takes the default key of the language
62
62
 
63
63
  <!-- usage:sessions -->
64
64
  - Landing spot `wiki/sessions/YYYY-MM-DD-<topic>.md` (default naming), type: session, participants required (actor list)
65
- - 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`)
65
+ - 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`)
66
66
  - Standalone high-value topics promoted to `wiki/notes/` pages, the backbone page keeping a wikilink; dedupe before promotion
67
67
  <!-- /usage:sessions -->
68
68
 
@@ -81,14 +81,14 @@ Declarative present tense; output language takes the default key of the language
81
81
  <!-- /usage:trust -->
82
82
 
83
83
  <!-- usage:index -->
84
- - Post-write rebuild (mechanical, automatic): `python .meta/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
84
+ - Post-write rebuild (mechanical, automatic): `python .owfa/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
85
85
  <!-- /usage:index -->
86
86
 
87
87
  <!-- usage:hot -->
88
- - Writing entries (mechanical, automatic): `python .meta/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
88
+ - Writing entries (mechanical, automatic): `python .owfa/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
89
89
  <!-- /usage:hot -->
90
90
 
91
91
  <!-- usage:log -->
92
- - Writing lines (mechanical, automatic): `python .meta/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
92
+ - Writing lines (mechanical, automatic): `python .owfa/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
93
93
  <!-- /usage:log -->
94
94
  <!-- cmd-inject:end -->
@@ -26,12 +26,14 @@
26
26
  - Executor names never enter invariants, the inject line, or field vocabulary — the replay recipes (usage) are their only home; trigger semantics declared wiki-side must remain translatable to any executor
27
27
  - Trigger vocabulary is open (extend words, not machinery); condition declarations carry executor-portable semantics only — what condition, edge, budget, cooldown; never how to probe or deliver
28
28
  - System-state writes require user confirmation: the script edition landing system tasks or watches, status changes syncing deletes/stops on the execution side — following the device attached-audit delegation precedent
29
+ - Intent-change sync runs both directions; failures report via log only, never blocking other tasks (moved from the inject line, issue #49)
29
30
  - Normal runs write no task-page history; run notes take only anomalies and changes; last_run is machine-maintained
30
31
  - status: paused / deprecated pages are never deleted (kept for the record); deprecated tasks remain in the directory for lineage reference
31
32
  - Three-way boundary: todo one-shot delegations (the human states the trigger) · calendar event facts (what happens when — reality states the trigger) · cron deferred-trigger automation intent, systematically recorded and archived (machine conditions state the trigger); task outputs land per each domain's discipline (e.g. lark-calendar's daily-refresh output goes into the month page's schedule section, bili digest refreshes the digest page)
32
33
 
33
34
  ## Changelog
34
35
 
36
+ - 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
35
37
  - 0.4 (2026-10-08) deferred-trigger generalization (issue #29): schedule → trigger (time | condition forms, open kind vocabulary file|command|http|process|port|webhook), executor names withdrawn from the inject line into the replay recipes, trigger × form 2×2 matrix, per-form best-effort reconciliation (unreadable executor → info); executor-agnostic positioning ruled by the owner 2026-10-08
36
38
  - 0.3 (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
37
39
  - 0.2 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills
@@ -1,18 +1,18 @@
1
1
  id: cron
2
2
  schema_version: 1
3
- version: 0.4
3
+ version: 0.5
4
4
  bridge: 按需
5
5
  depends:
6
6
  - wiki
7
7
  - trust
8
8
  - log
9
- updated: 2026-10-08
9
+ updated: 2026-11-09
10
10
  attachment:
11
11
  - "wiki/cron/ — deferred-trigger territory (one page per task, pure-directory scheme — the directory is the full declaration set, no root declaration page, quick views via the derived index)"
12
12
  - "wiki/cron/<task name>.md — task page (type: cron; cron block mapping mechanical zone + two body sections)"
13
13
  fields:
14
14
  cron: "block mapping (task page) — trigger (deferred-trigger declaration; v0.4 generalizes the v0.3 schedule key, schedule reads as the time form): time form = crontab 5-field or human-readable cadence, local timezone by default; condition form = condition <kind> <target> [pattern] [interval] [max_fires] [cooldown], kind first batch file|command|http|process|port|webhook (open vocabulary — extend words, not machinery), pattern semantics fixed as no-match→match edge (default any change after baseline) / action (the action in one sentence) / form (execution shape: session edition | script edition — criterion: any agent-judgment step means session, purely mechanical means script; orthogonal to trigger, all four combinations legal) / domain (owning domain, tagged when a domain plugin registers via the bridge, omittable for cross-domain tasks) / status (active in-service | paused suspended | deprecated retired) / last_run (most recent run or fire time, machine-maintained) / machine (optional: executing-machine anchor for multi-device location; no linkage built)"
15
- inject: "Deferred-trigger territory wiki/cron/ (one page per task, the pure directory = the full declaration set): task page type: cron + cron block mapping (trigger: time (crontab 5-field) | condition <kind: file|command|http|process|port|webhook>, condition grammar in PLUGIN.md; action/form session|script/domain/status/last_run/machine) + ## Task + ## Run Notes append-only; declaration-as-source, every executor a replaceable projection — executor names live only in the replay recipes (usage), wiki records intent and traces, probing/delivery semantics stay executor-side; replay lands active pages execution-side upon user confirmation; reconciliation per-form diff against readable executor lists in the check attached audit; intent-change sync both directions; failures report via log only, never blocking others; boundaries — todo one-shot, calendar facts, cron deferred-trigger automation intent; on-demand bridge (domain tasks: page + depends)"
15
+ inject: "Deferred triggers `wiki/cron/`: one page per task (`cron` block: trigger time|condition, action, form session|script, status; `## Run Notes` append-only); the page is the source, executors replayable projections on user confirmation; grammar PLUGIN.md"
16
16
  usage:
17
17
  - Registration (domain plugin via the bridge / direct human creation): build wiki/cron/<task name>.md — cron block mapping minimal key set (trigger/action/form/status) + a `## Task` section (action details: which command to call or what the session opening reads, back-linking the owning domain's skill); condition-form triggers declare executor-portable semantics only — what condition, edge, budget and cooldown; never executor-specific probes or delivery details; domain-plugin registrations tag domain and hang depends cron
18
18
  - Replay — the 2×2 translations (executor names live here and only here): time+session → harness-scheduler unattended session, prompt self-contained (read wiki/cron/<task name>.md and execute per the page, report failures with a log line, never block other tasks); time+script → system timer / crontab; condition+session → the deployment's conditional executor as a watch (name = page name, note self-contained pointing at the task page); condition+script → system timer running a stateful edge-detection script (state file holds the last-seen match, fire on no-match→match, zero harness dependency — inline recipe, v1 ships no script artifact); system-state writes upon user confirmation; when execution-side tasks diff against the declarations, add and delete with the declaration pages as the authority
@@ -34,5 +34,6 @@
34
34
 
35
35
  ## Changelog
36
36
 
37
+ - 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
37
38
  - 0.4 (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.3 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills- 0.2 2026-10-04: added the tool-environment summary section — the body's `## Tool Environment` records presence-level info on connectors/runtimes/channels, a cross-device lookup registry, the AGENTS shell pointing to the pages; presence-level granularity, (un)install syncing, no full inventory
38
39
  - 0.1 2026-10-04: established — reusing the notes territory (type: entity suggested), the device block mapping minimal key set, the attached-audit expiry scan (30-day window), expiry entering todo via delegation and confirmation; zero commands; depends wiki
@@ -1,15 +1,15 @@
1
1
  id: device
2
2
  schema_version: 1
3
- version: 0.4
3
+ version: 0.5
4
4
  depends:
5
5
  - wiki
6
- updated: 2026-10-06
6
+ updated: 2026-11-09
7
7
  attachment:
8
8
  - "wiki/notes/ — home of device profile pages (one page per device, type: entity suggested, device block mapping registering serial/purchase/warranty)"
9
9
  - "scripts/check.py — attached audit (warranty_until within 30 days of expiry / already expired → warning list)"
10
10
  fields:
11
11
  device: block mapping (device profile page in notes) — serial (serial number) / purchased (purchase date YYYY-MM-DD) / warranty_until (warranty or coverage end date YYYY-MM-DD, the attached-audit scan item), a three-key minimal set; remaining keys open (model, vendor, etc.; the architecture does not enumerate)
12
- inject: "Device profiles: one page per personal device in wiki/notes/ (type: entity suggested); device block mapping minimal keys serial/purchased/warranty_until, rest open; body ## Tool Environment = presence-level connector/runtime/channel registry for cross-device lookup (synced on (un)install, no full inventory); invoice assets via vault + wikilink; attached audit scans warranty_until (30-day window → warning list; todo line only upon confirmation); no real-time monitoring, no team lending"
12
+ inject: "Device profiles: one page per device in `wiki/notes/` (`device` block serial/purchased/warranty_until; `## Tool Environment` connector/runtime registry, synced on (un)install); audit warns 30 days before warranty ends; details PLUGIN.md"
13
13
  usage:
14
14
  - Registration: natural-language editing in conversation suffices (no command) — one page per device in `wiki/notes/`, type: entity (suggested form); page name free, same names disambiguated by suffix; `device` block mapping minimal keys serial / purchased / warranty_until, remaining keys open
15
15
  - Tool environment: the device page body's `## Tool Environment` summary section — records connector presence (lark-cli, bb-cli, etc.), runtimes (python, node), channels (ssh, web entries) and the device's purpose; only presence-level, never exact versions (look up live); sync this section when software is (un)installed; no full software inventory; this section is the cross-device lookup registry — the AGENTS shell reaches only this machine, device pages cover all relevant devices, the shell pointing to the device pages
@@ -40,4 +40,6 @@ Where the entropy goes: cross-domain semantic disambiguation is completed at ada
40
40
 
41
41
  ## Changelog
42
42
 
43
+ - 0.3 2026-11-11: the pointer line now carries the dual-track skill preference rule (v0.4 A4, work order #56) — core skills are `owfa-*` and preferred over same-type foreign skills (correctness: the framework defines what they mean); connectors pick the registered/best-fitting transport, the official one is only the default recommendation (capability fit wins). Core command skills renamed with the 0.4 layout batch (`owfa-check/docs/map/plugin/profile/query/save/kernel`); natural-language triggers keep the old words so muscle memory still fires.
44
+ - 0.2 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
43
45
  - 0.1 2026-09-22: established — distilled from the 2026-09-19 domain problem report and four rounds of discussion; the three instances vault, lark, and project brought into compliance first
@@ -0,0 +1,8 @@
1
+ id: domain
2
+ schema_version: 1
3
+ version: 0.3
4
+ depends: []
5
+ updated: 2026-11-11
6
+ attachment: []
7
+ fields: {}
8
+ inject: "Domains: wiki knows inner/outer; each domain declares its adapter contract, members inherit. Blocks are routing pointers — read `.owfa/plugins/**/<id>/PLUGIN.md` before acting. Core skills are owfa-* (prefer); connectors: fit wins, official is default."
@@ -9,7 +9,7 @@ attachment:
9
9
  fields: {}
10
10
  inject: "Hot cache `wiki/hot.md`: recent-change digest (≤25 entries, <5 days, ≤200 chars per entry); agents read this page first on entering the repository; evict out-of-window entries before writing"
11
11
  usage:
12
- - Writing entries (mechanical, automatic): `python .meta/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
12
+ - Writing entries (mechanical, automatic): `python .owfa/scripts/pipeline.py hot <type> "<wikilink + one-sentence essence>"` (type value set same as log, see the log block of the AGENTS injection region); window eviction and truncation are performed by the script
13
13
  checks:
14
14
  - 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
15
15
  - Contradiction with log (log has records while hot shows no trace) → warning
@@ -25,6 +25,7 @@
25
25
 
26
26
  ## Changelog
27
27
 
28
+ - 0.14 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
28
29
  - 0.13 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills- 0.12 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
30
  - 0.11 2026-09-19: concept-page detection excluded wiki/tmp/ — the temporary zone stays out of indexes and tags, in step with the tmp plugin's establishment
30
31
  - 0.10 2026-09-19: the per-directory scheme changed to the overflow-offloading scheme — list window of at most M, subtree-descending splits, the root always present, empty-subtree visibility lines; small repositories collapse to a single index, the engineering repository 4-to-1, test-repo measured 8-to-1; invariants gained "pure-function rebuild" and "indexes do not invent structure"
@@ -1,18 +1,18 @@
1
1
  id: index
2
2
  schema_version: 1
3
- version: 0.13
3
+ version: 0.14
4
4
  depends:
5
5
  - tag
6
6
  - wiki
7
- updated: 2026-10-06
7
+ updated: 2026-11-09
8
8
  attachment:
9
9
  - "wiki/index.md — root index (always present; carries format_version; directly lists reachable pages)"
10
10
  - "Per-directory index.md — born of the overflow-offloading scheme (split out when a list overflows the window, disappearing on rebuild once merged back into the parent)"
11
11
  - "wiki/tags.md — tag reverse index"
12
12
  fields: {}
13
- inject: "Index overflow-offloading: root wiki/index.md always present (carries format_version), listing all reachable pages full-path; a list over the window (params in pipeline source) splits subtrees into their own index.md by descending page count; wiki/tags.md unchanged; aggregate only, never hand-edited, pure-function rebuild (pipeline.py index); indexes invent no structure — overflow lists in full as-is, the cure is subdirectories"
13
+ inject: "Index `wiki/index.md` (+ subtree index.md on overflow): derived, never hand-edited — rebuild via `pipeline.py index`; lists every reachable page by full path; the overflow cure is subdirectories; details PLUGIN.md"
14
14
  usage:
15
- - Post-write rebuild (mechanical, automatic): `python .meta/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
15
+ - Post-write rebuild (mechanical, automatic): `python .owfa/scripts/pipeline.py index` (index — overflow-offloading scheme, including deletion of obsolete old indexes after merge-back) and the same script's `tags` (tag reverse index); LLMs never hand-write indexes
16
16
  checks:
17
17
  - 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`)
18
18
  - Traces of hand editing → warning
@@ -37,3 +37,8 @@ Not a git repository at the root (no `.git`)? The contract is dormant — one in
37
37
  ## One upgrade path, FYI
38
38
 
39
39
  Pure local (the default) → a `git bundle` file copied elsewhere → a private remote. Before any remote, sweep the sensitive faces (vault/ assets, cuhksz course records — anything you would not hand to a stranger); public remotes are out of the question for an instance.
40
+
41
+ ## Changelog
42
+
43
+ - 0.2 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
44
+ - 0.1 2026-10-13: established (see git history)
@@ -1,11 +1,11 @@
1
1
  id: instance-git
2
2
  schema_version: 1
3
- version: 0.1
3
+ version: 0.2
4
4
  depends: []
5
- updated: 2026-10-13
5
+ updated: 2026-11-09
6
6
  attachment: []
7
7
  fields: {}
8
- inject: "Instance git = the snapshot ledger of real use (rollback + time machine), never a collaboration face: three authors — the kernel never touches git (the journal is its ledger), the agent commits at transaction close (type: summary, log-shaped), humans snapshot freely; red lines — credentials/session files never tracked, adding an ignore sweeps tracked matches out, project entities keep their own git (the instance discloses, never hosts); recovery entrance: git log -- <page> → git checkout -- <page>; beyond this contract, usage is the human's own"
8
+ inject: "Instance git = snapshot ledger of real use (rollback + time machine), never a collaboration face: the agent commits at transaction close (`type: summary`), the kernel never touches git; credentials/session files never tracked; contract PLUGIN.md"
9
9
  usage:
10
10
  - Package transactions: after validate goes green, one commit at close — mechanical + semantic in one snapshot (message `plugin: <verb> <pkg> [v<version>]`); see the plugin command's Transaction close section
11
11
  - Session close: commit the dirty tree the session leaves (`type: summary`, optional `[domain]` tag — the same shape as a log entry); no other rhythm is mandated
@@ -32,6 +32,7 @@
32
32
 
33
33
  ## Changelog
34
34
 
35
+ - 0.6 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
35
36
  - 0.5 (2026-10-23): restore the register discipline in manifest usage routed to save and align the field description; generated command projections now retain it across rebuilds (issue #26).
36
37
  - 0.4 (2026-10-07): register key — the `register` canonical key governs the audience reading level (program default first/second-year undergraduates, AGENTS principle 12), consumed by bb-teach (teaching) / bb-quiz (annotation) / save (PR #23, renumbered past master's 0.3 compression)
37
38
  - 0.3 (2026-10-06) inject line compressed to pointer density (issue #12 layer discipline) — procedural detail lives in usage / PLUGIN.md / skills- 0.2 2026-10-04: language neutralization — the absence fallback changed from 'Chinese-first' to 'follow the session language', Chinese demoted to a development-period instance fact; layered ruling: source alignment belongs to domain plugins, reader alignment to this page's canonical keys (the teaching/annotation precedent); same batch as bb-teach/bb-quiz v0.4
@@ -1,9 +1,9 @@
1
1
  id: language
2
2
  schema_version: 1
3
- version: 0.5
3
+ version: 0.6
4
4
  depends:
5
5
  - wiki
6
- updated: 2026-10-23
6
+ updated: 2026-11-09
7
7
  attachment:
8
8
  - "wiki/language.md — the writing declaration page (output-language and writing-baseline ontology: frontmatter language/terms block mappings + body distillation section)"
9
9
  - "scripts/check.py — attached audit (territory placement / terms empty values / declaration page presence)"
@@ -11,8 +11,8 @@ fields:
11
11
  language: block mapping (declaration page) — canonical key → one-sentence rule (open vocabulary, e.g. default/teaching/annotation/register); output language and writing baseline — register = the writing register (audience reading level, default first/second-year undergraduates), consumed by bb-teach, bb-quiz and save
12
12
  terms: block mapping (declaration page) — term original → unified translation (single-line value); the cross-session translation-consistency lookup piece
13
13
  usage_routes:
14
- - save
15
- inject: "Writing declaration page wiki/language.md (type: language): language block mapping = key → one-sentence rule (consumer precedents: teaching bb-teach, annotation bb-quiz, register = audience reading level, program default first/second-year undergraduates per AGENTS principle 12) + terms = original → unified translation; body distillation notes append-only; the agent reads it before producing written artifacts; page or key absent → session language (proper nouns/code/paths keep original); default baseline not a mandate — domain source-alignment disciplines take precedence; terms emergence-based (register after recurring hits); direct human edits legitimate"
14
+ - owfa-save
15
+ inject: "Writing declaration `wiki/language.md`: read it before writing artifacts — `language` keys → one-sentence rules (e.g. register), `terms` → unified translations; page/key absent → session language; domain source-alignment wins; details PLUGIN.md"
16
16
  usage:
17
17
  - Register discipline: follow the language.register audience reading level when writing saved artifacts; absent register uses the program baseline (first/second-year undergraduates), while explicit user audience requirements and domain source-alignment rules take precedence
18
18
  - When to read: read the declaration page before writing any artifact (wiki pages, documents, lecture distillates); page or key absent = follow the session language (conversation language is the output language); proper nouns, code, paths, commands, and file names always keep their original form (language neutrality, invariant under configuration) — the framework presets no specific language; Chinese is merely an instance fact of this project's development period (AGENTS principle 7)
@@ -23,6 +23,7 @@
23
23
 
24
24
  ## Changelog
25
25
 
26
+ - 0.15 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.14 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
27
28
  - 0.13 2026-09-19: _concept excluded wiki/tmp/ — the temporary zone is not a link source and is exempt from graph checks; a draft's broken link = not yet written down, closed upon promotion
28
29
  - 0.12 2026-09-19: the orphan info set changed to dynamically reading registry type.values except session — new territory types covered automatically, the hardcoded set retired, prerequisite for project's establishment
@@ -1,16 +1,16 @@
1
1
  id: link
2
2
  schema_version: 1
3
- version: 0.14
3
+ version: 0.15
4
4
  depends:
5
5
  - wiki
6
- updated: 2026-10-06
6
+ updated: 2026-11-09
7
7
  attachment:
8
8
  - "Cross-cutting plugin, no files of its own: owns the link-syntax conventions and the related / aliases fields"
9
9
  - "scripts/check.py — attached audit (broken links / garbled text / alias ambiguity / orphans / one-way related)"
10
10
  fields:
11
11
  related: "YAML list, full-name wikilinks of related pages"
12
12
  aliases: "YAML list, aliases/short names, for link resolution"
13
- inject: "Link syntax `[[page full name]]` — full name = the relative path within wiki/ minus the trailing .md (e.g. `notes/X`, pdf asset proxy `vault/a.pdf`, md asset proxy `vault/<name>.md`, only one removed); truncated references forbidden, same-name ambiguity resolved by path; fields `related` / `aliases`; broken link = warning (not yet written down), orphan (no inbound links and no references, derived pages don't count as sources) = warning for notes knowledge pages, info for territory-value registration pages (dynamically reads registry type.values, except session)"
13
+ inject: "Link syntax `[[full name]]`: full name = path within `wiki/` minus trailing `.md` (`notes/X`, pdf proxy `vault/a.pdf`, md proxy `vault/<name>.md` — strip one .md only); never truncate; fields `related`/`aliases`; broken/orphan grading PLUGIN.md"
14
14
  checks:
15
15
  - 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
16
16
  - Semantic items (check command): inbound-link density top list → info item (evidence for hub emergence, no alert)
@@ -53,7 +53,7 @@ TERRITORY_LABELS = {"source": "proxy page", "lark": "pointer page", "calendar":
53
53
  def _territory_types(root):
54
54
  """Read registry type.values (closed set of territory values) dynamically; session excluded (knowledge backbone, orphan hint is meaningful there)."""
55
55
  try:
56
- text = open(os.path.join(root, ".meta", "protocol", "registry.yaml"), encoding="utf-8").read()
56
+ text = open(os.path.join(root, ".owfa", "protocol", "registry.yaml"), encoding="utf-8").read()
57
57
  m = re.search(r"values: \[([^\]]+)\]", text)
58
58
  return {v.strip() for v in m.group(1).split(",") if v.strip()} - {"session"}
59
59
  except OSError:
@@ -42,6 +42,7 @@ log.max_chars: 14000 # window character cap, approximate
42
42
 
43
43
  ## Changelog
44
44
 
45
+ - 0.16 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
45
46
  - 0.15 2026-10-02: global-domain batch one — established the mandatory bridge, i.e. the recording bridge; domain bases must depend on it, kernel verifies completeness; entries gained the omissible `[domain]` tag; pipeline log gained the `--domain` parameter
46
47
  - 0.13 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
47
48
  - 0.12 2026-09-14: type value set extended with todo — the home of the todo plugin's task-settlement events; history goes to log, the todo page keeps only the active working set
@@ -1,18 +1,18 @@
1
1
  id: log
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/log.md — single-file operation journal (rolling window)"
10
10
  - "wiki/archive/YYYY-MM/log.md — archive spillover (immutable zone, grouped by entry month)"
11
11
  - "scripts/check.py — attached audit (entry date contract)"
12
12
  fields: {}
13
- inject: "Run log `wiki/log.md`: new entries prepended at the top, entries never rewritten; entry = date + type (map/save/query/check/plugin/todo/profile/other) + [domain] (omissible — domainless transactions; log is a mandatory bridge: domain bases must depend on this plugin, constitution principle 11) + one sentence; window ≤100 entries, overflow is mechanically archived to `wiki/archive/<month>/log.md`"
13
+ inject: "Run log `wiki/log.md`: prepend, never rewrite; entry = date + type (map/save/query/check/plugin/todo/profile/other) + optional [domain] + one sentence, written via `pipeline.py log`; >100 entries auto-archived; details PLUGIN.md"
14
14
  usage:
15
- - Writing lines (mechanical, automatic): `python .meta/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
15
+ - Writing lines (mechanical, automatic): `python .owfa/scripts/pipeline.py log <type> "<one sentence>" [--domain <domain>]` (type value set in the log block of the AGENTS injection region; domain tag = domain-plugin name such as bb/lark/vault, mandatory for in-domain transactions, omitted for framework and native transactions); rolling window and archiving are performed by the script
16
16
  checks:
17
17
  - 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
18
18
  - Semantic items (check command): historical entries modified (verifiable via git) → error; capacity over the limit → re-check after mechanical archiving
@@ -12,7 +12,7 @@ fields:
12
12
  raw_file: "root-relative path, always present on proxy pages"
13
13
  raw_sha256: "hexadecimal SHA-256, mechanically recomputable from vault"
14
14
  commands:
15
- - map
15
+ - owfa-map
16
16
  inject: "Proxy layer `wiki/vault/`: 1:1 mirror of root `vault/` (proxy name = original name + .md), pages always carry raw_file / raw_sha256; the path is the origin proof"
17
17
  usage:
18
18
  - Mirror locating: proxy path = `wiki/vault/<original-path>.md` (original name + .md, prevents name collisions); md assets also get proxies, no exceptions
@@ -25,6 +25,7 @@ A derivation-destination bridge governing high-value conclusions: domain plugins
25
25
 
26
26
  ## Changelog
27
27
 
28
+ - 0.16 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
28
29
  - 0.15 2026-10-02: global-domain batch two — established the on-demand bridge as the derivation destination; domain-plugin self-descriptions retained with a pointer
29
30
  - 0.14 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
30
31
  - 0.13 2026-09-14: slimmed down; ruling: the architecture takes no responsibility for form classification — the form enumeration removed from body and inject line; 'concept/question/decision/entity' was personal-library migration residue, drifted from registry, comparison missed; type layering: territory values closed, namely source, session, profile — the basis for mechanical checks; form values demoted to an instance default vocabulary, registry defaults, open to self-extension