@mnstry/atelier 0.2.0-alpha.13 → 0.2.0-alpha.14

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 (58) hide show
  1. package/CHANGELOG.md +233 -0
  2. package/README.md +22 -5
  3. package/docs/blocks/capability-stewardship.md +1 -1
  4. package/docs/blocks/learning-harnesses.md +1 -1
  5. package/docs/capability-stewardship.md +2 -4
  6. package/docs/ingestion.md +3 -3
  7. package/docs/inquiry-harnesses.md +2 -3
  8. package/docs/install.md +3 -3
  9. package/docs/learning-harnesses.md +2 -3
  10. package/docs/local-services.md +42 -3
  11. package/docs/obsidian-contract.md +23 -0
  12. package/docs/obsidian-plugin.md +214 -3
  13. package/docs/obsidian.md +271 -11
  14. package/docs/personal-workspace.md +13 -4
  15. package/docs/release-engineering.md +2 -1
  16. package/docs/repo-boundary-guard.md +26 -3
  17. package/docs/semantic-operation.md +4 -3
  18. package/docs/upgrade.md +174 -2
  19. package/fixtures/templates/local-library.v1.json +2 -1
  20. package/package.json +2 -1
  21. package/plugins/obsidian/main.js +57 -8
  22. package/plugins/obsidian/manifest.json +1 -1
  23. package/src/boundary/content-rules.mjs +532 -67
  24. package/src/boundary/policy.mjs +135 -56
  25. package/src/cli/run.mjs +3 -2
  26. package/src/commands/obsidian.mjs +23 -7
  27. package/src/graph/graph.mjs +13 -5
  28. package/src/graph/knowledge-graph.mjs +19 -1
  29. package/src/ingestion/optional/graphify/graphify_supplier.py +5 -0
  30. package/src/ingestion/optional/graphify/native-closure-pins.json +275 -0
  31. package/src/ingestion/optional/graphify/native-pins.json +306 -0
  32. package/src/knowledge-health/rule-identity.mjs +14 -9
  33. package/src/personal-workspace/index.mjs +1 -1
  34. package/src/personal-workspace/selection.mjs +17 -1
  35. package/src/project/path-match.mjs +2 -1
  36. package/src/projection/obsidian/materialize/prepare-view.mjs +87 -5
  37. package/src/projection/obsidian/personal-workspace.mjs +87 -4
  38. package/src/projection/obsidian/proposals/adapter.mjs +46 -23
  39. package/src/projection/obsidian/proposals/observation.mjs +40 -2
  40. package/src/projection/obsidian/publication/publisher.mjs +72 -5
  41. package/src/projection/project.mjs +3 -2
  42. package/src/runtime/obsidian/engine.mjs +293 -55
  43. package/src/runtime/obsidian/lifecycle.mjs +17 -12
  44. package/src/runtime/obsidian/login-item.mjs +4 -1
  45. package/src/runtime/obsidian/observation.mjs +36 -4
  46. package/src/runtime/obsidian/opening.mjs +3 -2
  47. package/src/runtime/obsidian/personal-selection.mjs +125 -0
  48. package/src/runtime/obsidian/pipeline.mjs +44 -3
  49. package/src/runtime/obsidian/private-lock.mjs +39 -4
  50. package/src/runtime/obsidian/service-main.mjs +58 -12
  51. package/src/runtime/obsidian/service.mjs +66 -6
  52. package/src/runtime/obsidian/view-permission.mjs +334 -0
  53. package/src/ui/control-system.mjs +201 -0
  54. package/src/ui/html-primitives.mjs +3 -0
  55. package/src/upgrade/closure-diagnostics.mjs +135 -0
  56. package/src/upgrade/closure.mjs +649 -0
  57. package/src/upgrade/upgrade.mjs +19 -7
  58. package/templates/external-project-workspace/pack-lifecycle.json +2 -1
@@ -0,0 +1,275 @@
1
+ {
2
+ "upstreamCommit": "1cd9a36c0c57a661d2d2234bc3207e887e1ba104",
3
+ "upstreamTree": "0b2f8588510d58e128ac56264c96dfd1fb4dd22b",
4
+ "modules": {
5
+ "graphify": {
6
+ "relativePath": "__init__.py",
7
+ "sha256": "5afcd670aa65337ae49735582a9bc482a721abdfbfc063fcad1d0ccc90b0838a"
8
+ },
9
+ "graphify.google_workspace": {
10
+ "relativePath": "google_workspace.py",
11
+ "sha256": "f5563580450aea0830159ebed58316594161b6bcb9539cd97d161ff529ceae9a"
12
+ },
13
+ "graphify.paths": {
14
+ "relativePath": "paths.py",
15
+ "sha256": "ba3eea308b902e9b1ec55c61e6cd2bb703dae425da9bfc80ccf7f104556d619c"
16
+ },
17
+ "graphify.detect": {
18
+ "relativePath": "detect.py",
19
+ "sha256": "0c539db73e11b93b14c9ae2a61d6094a3aae13a9dbd49158e3d5164a28b426a6"
20
+ },
21
+ "graphify.ids": {
22
+ "relativePath": "ids.py",
23
+ "sha256": "d9befd67479a2e484e0fdb884cdbfd77ee0c96487970196abda68751d4e69e4e"
24
+ },
25
+ "graphify.manifest_ingest": {
26
+ "relativePath": "manifest_ingest.py",
27
+ "sha256": "f03522373429d0a8dd54ea41ffa2dd48939b1dc516098186058fd4d258c50ca0"
28
+ },
29
+ "graphify.cache": {
30
+ "relativePath": "cache.py",
31
+ "sha256": "b630ce0c29cf5c00e2a43a7196492b7531ed905ac48c86f5f42c13e2ce841dbc"
32
+ },
33
+ "graphify.security": {
34
+ "relativePath": "security.py",
35
+ "sha256": "92c4c6447c855195aa3ca0f50fde8810843d62028240aa4ec0f45be2eb0336a3"
36
+ },
37
+ "graphify.extractors.base": {
38
+ "relativePath": "extractors/base.py",
39
+ "sha256": "cd11628d3d4c05dcf0df002823712595ba2fac848fa146517a3bf41ff68cc2e8"
40
+ },
41
+ "graphify.extractors.apex": {
42
+ "relativePath": "extractors/apex.py",
43
+ "sha256": "4881d0e160d98d4045cda155cef7e4047d74dd46cd5f20288583bd2776d9ef03"
44
+ },
45
+ "graphify.extractors.bash": {
46
+ "relativePath": "extractors/bash.py",
47
+ "sha256": "1062a69a5bd696149672d95b9128296fe83c5acf8b2b2dccdb1a8fbe190d220d"
48
+ },
49
+ "graphify.extractors.blade": {
50
+ "relativePath": "extractors/blade.py",
51
+ "sha256": "14cf2475faf9d956c3fc33441421d072dc39085ac3c4bd38eebfd1bac28ed576"
52
+ },
53
+ "graphify.extractors.cobol": {
54
+ "relativePath": "extractors/cobol.py",
55
+ "sha256": "7807e29e9e7f4e345bf108fa5edd9a6b5468eaec743acb978b503252ce94fa0b"
56
+ },
57
+ "graphify.extractors.commonlisp": {
58
+ "relativePath": "extractors/commonlisp.py",
59
+ "sha256": "bb77c4e0f8c2269cee49ad6a8d7972492023ad4757f0605ad422e00e88a67a09"
60
+ },
61
+ "graphify.extractors.dart": {
62
+ "relativePath": "extractors/dart.py",
63
+ "sha256": "4c95d7f78cf9c27ad628f1abf44ad8045fb6b55d793c5bdbd6ae1be939105666"
64
+ },
65
+ "graphify.extractors.dm": {
66
+ "relativePath": "extractors/dm.py",
67
+ "sha256": "f3da427b091028052afb9a7986e9ed16e79c05d5f2cf1638c8a815d3438bf0a4"
68
+ },
69
+ "graphify.extractors.elixir": {
70
+ "relativePath": "extractors/elixir.py",
71
+ "sha256": "6d4aaa32dceb5105ac7d42f6e61ff06c8ee990c4e6e5b23958056b949db3e815"
72
+ },
73
+ "graphify.extractors.erlang": {
74
+ "relativePath": "extractors/erlang.py",
75
+ "sha256": "c9eb5f779ad04ecea9c02ca17219d2118fdb4207ef3c7f16ee2909a487377eb4"
76
+ },
77
+ "graphify.extractors.fortran": {
78
+ "relativePath": "extractors/fortran.py",
79
+ "sha256": "b151c1bf6ee7b285bf88b55aecf5c3a5f89564df1681cda9c034e18b8828ed35"
80
+ },
81
+ "graphify.extractors.go": {
82
+ "relativePath": "extractors/go.py",
83
+ "sha256": "3d78726e946904b4c450545d18a93f6f97acf3a1a1e66a6d514e05cf163dc77f"
84
+ },
85
+ "graphify.extractors.json_config": {
86
+ "relativePath": "extractors/json_config.py",
87
+ "sha256": "3099dff7f78e044380699138a4087729cca423f423c96fea7ea791fa4c25b599"
88
+ },
89
+ "graphify.extractors.models": {
90
+ "relativePath": "extractors/models.py",
91
+ "sha256": "038cbf04e17aec6dc71d8e6d886ab57fcfeffc36bf8d5d4fb0aeed88a6fc4719"
92
+ },
93
+ "graphify.extractors.resolution": {
94
+ "relativePath": "extractors/resolution.py",
95
+ "sha256": "fb1e337225b14d0c442a8ca01b08a1a536b54cb220e34bacc74eaf0a5b3d8455"
96
+ },
97
+ "graphify.extractors.engine": {
98
+ "relativePath": "extractors/engine.py",
99
+ "sha256": "a731d4fa5bb62cfa9b9943e4c39b26dc2244ebd81a11f1822f74787b6d78c958"
100
+ },
101
+ "graphify.extractors.julia": {
102
+ "relativePath": "extractors/julia.py",
103
+ "sha256": "f2b4232178b74e9873ad9a09cdd1eaafde018b9db176175c0028279ba99f603c"
104
+ },
105
+ "graphify.extractors.markdown": {
106
+ "relativePath": "extractors/markdown.py",
107
+ "sha256": "30c980898b946fd4c6290fe82eb42f4bb22a05237ab887bc89287ed6edd226f0"
108
+ },
109
+ "graphify.extractors.objc": {
110
+ "relativePath": "extractors/objc.py",
111
+ "sha256": "98e868e1d0a55186caa7dbce0f0af1d7aebb8ebaa8a26b8b544acbb91d1c6203"
112
+ },
113
+ "graphify.extractors.pascal": {
114
+ "relativePath": "extractors/pascal.py",
115
+ "sha256": "3eae81396a536251c58bcf96d89f33d1583a87a6f4bf55d79289ccccde17e77d"
116
+ },
117
+ "graphify.extractors.pascal_forms": {
118
+ "relativePath": "extractors/pascal_forms.py",
119
+ "sha256": "ad68d27b5d4680c1d6b172ae17245601910eadc3ccb2c90e581764ad76107013"
120
+ },
121
+ "graphify.extractors.powershell": {
122
+ "relativePath": "extractors/powershell.py",
123
+ "sha256": "67f9d1b56019a198ceb15ccfb722ee31f263f051124e496145dea82974b218f8"
124
+ },
125
+ "graphify.extractors.r": {
126
+ "relativePath": "extractors/r.py",
127
+ "sha256": "716047e57bb6689423eb0b0c3dffedd278330e778f7d0b4e12787a72278ad2c9"
128
+ },
129
+ "graphify.extractors.razor": {
130
+ "relativePath": "extractors/razor.py",
131
+ "sha256": "82cc29516d4951741d3f34397f5612c55be019607339b1f268c22f2a215061f0"
132
+ },
133
+ "graphify.extractors.rust": {
134
+ "relativePath": "extractors/rust.py",
135
+ "sha256": "0f79a21f9213ee29cf825971d0df4a0734b2d3c966786e0fec3a3f8ba936855f"
136
+ },
137
+ "graphify.extractors.sln": {
138
+ "relativePath": "extractors/sln.py",
139
+ "sha256": "9b5987dacc793277ba5db7de4187c89a9a83b6f2ba07a90a85734e597112470a"
140
+ },
141
+ "graphify.extractors.solidity": {
142
+ "relativePath": "extractors/solidity.py",
143
+ "sha256": "abe14c5784d02cc0d8b6b4533d66bb736e0b8e914ecc8baa5251b58fe90c9e16"
144
+ },
145
+ "graphify.extractors.sql": {
146
+ "relativePath": "extractors/sql.py",
147
+ "sha256": "8186f36b85970a5394b1692a76cb4f2e6f8ce186cc806bc8757368a1d04c349f"
148
+ },
149
+ "graphify.extractors.terraform": {
150
+ "relativePath": "extractors/terraform.py",
151
+ "sha256": "1516abe54b424300daee68bcbc9a07059948863aa257395946ef8081b9b14211"
152
+ },
153
+ "graphify.extractors.verilog": {
154
+ "relativePath": "extractors/verilog.py",
155
+ "sha256": "f3d8a6ef6fed7eade3b845ff91ec5a0e7100d0afe3794b864e08775868a7b9f4"
156
+ },
157
+ "graphify.extractors.vbnet": {
158
+ "relativePath": "extractors/vbnet.py",
159
+ "sha256": "6a8e93ffe4a47620fb66931c7f668f480b3119b3812e50c14e7a2b60c3a59e78"
160
+ },
161
+ "graphify.extractors.zig": {
162
+ "relativePath": "extractors/zig.py",
163
+ "sha256": "a1c7c9bb72277aee57a39fd97a55359a40cd17a4d61ec401fcd12b4796111111"
164
+ },
165
+ "graphify.extractors": {
166
+ "relativePath": "extractors/__init__.py",
167
+ "sha256": "9c809d014a2c90d2f3e442afc51cfa5b5c8b2eae78e169fe84843283eb51b69a"
168
+ },
169
+ "graphify.mcp_ingest": {
170
+ "relativePath": "mcp_ingest.py",
171
+ "sha256": "7553845a7cae7c310803bf37d992b695b27d21e1b827c1c33dbed2b15971be61"
172
+ },
173
+ "graphify.resolver_registry": {
174
+ "relativePath": "resolver_registry.py",
175
+ "sha256": "bd5904412417ead6104852c1d79c3e8d1aebb7ab3f80a13330f19be7c18f307b"
176
+ },
177
+ "graphify.validate": {
178
+ "relativePath": "validate.py",
179
+ "sha256": "be068c6b2ff4e514f31663e0155a9d63f35096d154b98ab6c9c467a23febd6f7"
180
+ },
181
+ "graphify.build": {
182
+ "relativePath": "build.py",
183
+ "sha256": "8f4b17391c60331de1875a47d697191d5ebe50011f36d204341f53e60c210eda"
184
+ },
185
+ "graphify.ruby_resolution": {
186
+ "relativePath": "ruby_resolution.py",
187
+ "sha256": "3a300b61def823f78d2305a072ea26f27c4f1dd8cf67bc060ab151213e9142a2"
188
+ },
189
+ "graphify.csharp_dispatch": {
190
+ "relativePath": "csharp_dispatch.py",
191
+ "sha256": "9c67537a297c676f7b736423f854b62a32c686c4cd63e3b1a357116b013ebb7a"
192
+ },
193
+ "graphify.pascal_resolution": {
194
+ "relativePath": "pascal_resolution.py",
195
+ "sha256": "e4e9400ee20e6b410e521ad24bfe4c7e09742590ba1b0964cc84b49158d9318f"
196
+ },
197
+ "graphify.markdown_resolution": {
198
+ "relativePath": "markdown_resolution.py",
199
+ "sha256": "e582a66581b5a4eca3951ddddf33ca891979671f40f088e00788bee4eb6e1ed8"
200
+ },
201
+ "graphify.extractors.csharp": {
202
+ "relativePath": "extractors/csharp.py",
203
+ "sha256": "6f75b10512d1f7bcc51ec24790c6973e2e9356bac92a289f633400f551fb2535"
204
+ },
205
+ "graphify.extractors.ocaml": {
206
+ "relativePath": "extractors/ocaml.py",
207
+ "sha256": "2f35fb60394b4a73752d99d4a852bba7cdd9d4014071c5bfeb603d21578508df"
208
+ },
209
+ "graphify.extractors.robot": {
210
+ "relativePath": "extractors/robot.py",
211
+ "sha256": "5d3adab1d61ee2af37d5c77ee88be399d9271060e72a36b5e332704b01e47980"
212
+ },
213
+ "graphify.symbol_resolution": {
214
+ "relativePath": "symbol_resolution.py",
215
+ "sha256": "2430b652840912a77f9a1a234fa27e6a51a269bc43f810c8574ea826ed1d27fb"
216
+ },
217
+ "graphify.extract": {
218
+ "relativePath": "extract.py",
219
+ "sha256": "2facca59e22f735f68abc188bab0fa519427f4dc4deb2a235ed0e7c50ebe9c84"
220
+ },
221
+ "graphify._minhash": {
222
+ "relativePath": "_minhash.py",
223
+ "sha256": "eea373a21d8f9c97beecb08ca06f0e2d273cd40e2e91dfbcaec4972bd45fdf0c"
224
+ },
225
+ "graphify.dedup": {
226
+ "relativePath": "dedup.py",
227
+ "sha256": "7e65caa8ebc393db375e49c89764e6b089a77e88c10b18ff5f37fd440c7d1dfc"
228
+ },
229
+ "graphify.analyze": {
230
+ "relativePath": "analyze.py",
231
+ "sha256": "e6011dcbb35144134d8ebef12d17ea869e73749e79722caa9527ed30500edd4a"
232
+ },
233
+ "graphify.exporters": {
234
+ "relativePath": "exporters/__init__.py",
235
+ "sha256": "0a1e96c29d7601843980a62a1069a95c05cb9f07d6f431a054feb8664abf21e1"
236
+ },
237
+ "graphify.exporters.graphdb": {
238
+ "relativePath": "exporters/graphdb.py",
239
+ "sha256": "e80bb1a706568f85d1e97d72a649c96bdac708c9aa3c1d9ee9a59ad7a2acd0be"
240
+ },
241
+ "graphify.exporters.base": {
242
+ "relativePath": "exporters/base.py",
243
+ "sha256": "225e77141d4f3d568c652d7ae3177bbcd4aa7749259bb77dcb4f1f0414249140"
244
+ },
245
+ "graphify.exporters.html": {
246
+ "relativePath": "exporters/html.py",
247
+ "sha256": "415d96c0563769b89acf02e20043998c64edb977cd5049fbe3d1e319b7e359f8"
248
+ },
249
+ "graphify.export": {
250
+ "relativePath": "export.py",
251
+ "sha256": "312f4658900e33360e6d23a005ee4ed227a30ae7737bfeba13318f7f16af5576"
252
+ },
253
+ "graphify.cluster": {
254
+ "relativePath": "cluster.py",
255
+ "sha256": "bfbfeac12c0a59cb7824d081e32a77e7cdcadd5530e9e6d1bf82264b08a1a78f"
256
+ },
257
+ "graphify.serve": {
258
+ "relativePath": "serve.py",
259
+ "sha256": "a6df71d1c6efd3281d2938f8c234d987ba61a92270db585490688d194b7f6bec"
260
+ },
261
+ "graphify.affected": {
262
+ "relativePath": "affected.py",
263
+ "sha256": "c679c7e7f8881973e449fd885dd0ccc096dcc074f4c93f43962b1ce957ef77a7"
264
+ },
265
+ "graphify.ingest": {
266
+ "relativePath": "ingest.py",
267
+ "sha256": "24b3f65ce30c977e245473c75b75e12c23b423a83dcb9a318ac72a49d3888df6"
268
+ },
269
+ "graphify.reflect": {
270
+ "relativePath": "reflect.py",
271
+ "sha256": "53d877f8009344cfc721d400444bbf2c7f7fcdcd3c4f97580a369c4f79b06db0"
272
+ }
273
+ },
274
+ "thirdPartyDependencyAuthority": "Host-owned pinned public wheel/dependency environment; this manifest binds Graphify Python source, not arbitrary third-party native extensions."
275
+ }
@@ -0,0 +1,306 @@
1
+ {
2
+ "upstreamCommit": "1cd9a36c0c57a661d2d2234bc3207e887e1ba104",
3
+ "upstreamVersion": "0.9.72",
4
+ "operations": {
5
+ "discover": {
6
+ "module": "graphify.detect",
7
+ "function": "detect",
8
+ "family": "discovery",
9
+ "source": "Graphify-Labs/graphify/detect.py",
10
+ "sourceSha256": "0c539db73e11b93b14c9ae2a61d6094a3aae13a9dbd49158e3d5164a28b426a6",
11
+ "sourceLine": 1833,
12
+ "sourceEndLine": 2144,
13
+ "qualification": "source-inspected; installed native execution pending"
14
+ },
15
+ "discover-incremental": {
16
+ "module": "graphify.detect",
17
+ "function": "detect_incremental",
18
+ "family": "incremental",
19
+ "source": "Graphify-Labs/graphify/detect.py",
20
+ "sourceSha256": "0c539db73e11b93b14c9ae2a61d6094a3aae13a9dbd49158e3d5164a28b426a6",
21
+ "sourceLine": 2646,
22
+ "sourceEndLine": 2793,
23
+ "qualification": "source-inspected; installed native execution pending"
24
+ },
25
+ "extract-structure": {
26
+ "module": "graphify.extract",
27
+ "function": "extract",
28
+ "family": "extraction",
29
+ "source": "Graphify-Labs/graphify/extract.py",
30
+ "sourceSha256": "2facca59e22f735f68abc188bab0fa519427f4dc4deb2a235ed0e7c50ebe9c84",
31
+ "sourceLine": 7169,
32
+ "sourceEndLine": 8717,
33
+ "qualification": "source-inspected; installed native execution pending"
34
+ },
35
+ "extract-semantic": {
36
+ "module": "graphify.llm",
37
+ "function": "extract_corpus_parallel",
38
+ "family": "semantic/media extraction",
39
+ "source": "Graphify-Labs/graphify/llm.py",
40
+ "sourceSha256": "51e31802e36fbb1e6b849661cc79e1cb238c4f8caffaf805592ad0dee21f8a90",
41
+ "sourceLine": 2550,
42
+ "sourceEndLine": 2850,
43
+ "qualification": "source-inspected; installed native execution pending"
44
+ },
45
+ "build-native": {
46
+ "module": "graphify.build",
47
+ "function": "build",
48
+ "family": "construction",
49
+ "source": "Graphify-Labs/graphify/build.py",
50
+ "sourceSha256": "8f4b17391c60331de1875a47d697191d5ebe50011f36d204341f53e60c210eda",
51
+ "sourceLine": 1532,
52
+ "sourceEndLine": 1596,
53
+ "qualification": "source-inspected; installed native execution pending"
54
+ },
55
+ "build-accepted": {
56
+ "module": "graphify.build",
57
+ "function": "build",
58
+ "family": "accepted projection",
59
+ "source": "Graphify-Labs/graphify/build.py",
60
+ "sourceSha256": "8f4b17391c60331de1875a47d697191d5ebe50011f36d204341f53e60c210eda",
61
+ "sourceLine": 1532,
62
+ "sourceEndLine": 1596,
63
+ "qualification": "source-inspected; installed native execution pending"
64
+ },
65
+ "build-incremental": {
66
+ "module": "graphify.build",
67
+ "function": "build_merge",
68
+ "family": "incremental",
69
+ "source": "Graphify-Labs/graphify/build.py",
70
+ "sourceSha256": "8f4b17391c60331de1875a47d697191d5ebe50011f36d204341f53e60c210eda",
71
+ "sourceLine": 1921,
72
+ "sourceEndLine": 2358,
73
+ "qualification": "source-inspected; installed native execution pending"
74
+ },
75
+ "merge-raw": {
76
+ "module": "graphify.build",
77
+ "function": "merge_raw_extraction",
78
+ "family": "incremental",
79
+ "source": "Graphify-Labs/graphify/build.py",
80
+ "sourceSha256": "8f4b17391c60331de1875a47d697191d5ebe50011f36d204341f53e60c210eda",
81
+ "sourceLine": 1777,
82
+ "sourceEndLine": 1918,
83
+ "qualification": "source-inspected; installed native execution pending"
84
+ },
85
+ "dedup-proposals": {
86
+ "module": "graphify.dedup",
87
+ "function": "deduplicate_entities",
88
+ "family": "identity suggestions",
89
+ "source": "Graphify-Labs/graphify/dedup.py",
90
+ "sourceSha256": "7e65caa8ebc393db375e49c89764e6b089a77e88c10b18ff5f37fd440c7d1dfc",
91
+ "sourceLine": 557,
92
+ "sourceEndLine": 1039,
93
+ "qualification": "source-inspected; installed native execution pending"
94
+ },
95
+ "cluster": {
96
+ "module": "graphify.cluster",
97
+ "function": "cluster",
98
+ "family": "communities",
99
+ "source": "Graphify-Labs/graphify/cluster.py",
100
+ "sourceSha256": "bfbfeac12c0a59cb7824d081e32a77e7cdcadd5530e9e6d1bf82264b08a1a78f",
101
+ "sourceLine": 232,
102
+ "sourceEndLine": 334,
103
+ "qualification": "source-inspected; installed native execution pending"
104
+ },
105
+ "label-communities": {
106
+ "module": "graphify.cluster",
107
+ "function": "label_communities_by_hub",
108
+ "family": "communities",
109
+ "source": "Graphify-Labs/graphify/cluster.py",
110
+ "sourceSha256": "bfbfeac12c0a59cb7824d081e32a77e7cdcadd5530e9e6d1bf82264b08a1a78f",
111
+ "sourceLine": 184,
112
+ "sourceEndLine": 208,
113
+ "qualification": "source-inspected; installed native execution pending"
114
+ },
115
+ "cohesion": {
116
+ "module": "graphify.cluster",
117
+ "function": "score_all",
118
+ "family": "communities",
119
+ "source": "Graphify-Labs/graphify/cluster.py",
120
+ "sourceSha256": "bfbfeac12c0a59cb7824d081e32a77e7cdcadd5530e9e6d1bf82264b08a1a78f",
121
+ "sourceLine": 373,
122
+ "sourceEndLine": 374,
123
+ "qualification": "source-inspected; installed native execution pending"
124
+ },
125
+ "important-nodes": {
126
+ "module": "graphify.analyze",
127
+ "function": "god_nodes",
128
+ "family": "analysis",
129
+ "source": "Graphify-Labs/graphify/analyze.py",
130
+ "sourceSha256": "e6011dcbb35144134d8ebef12d17ea869e73749e79722caa9527ed30500edd4a",
131
+ "sourceLine": 112,
132
+ "sourceEndLine": 148,
133
+ "qualification": "source-inspected; installed native execution pending"
134
+ },
135
+ "surprising-connections": {
136
+ "module": "graphify.analyze",
137
+ "function": "surprising_connections",
138
+ "family": "analysis",
139
+ "source": "Graphify-Labs/graphify/analyze.py",
140
+ "sourceSha256": "e6011dcbb35144134d8ebef12d17ea869e73749e79722caa9527ed30500edd4a",
141
+ "sourceLine": 151,
142
+ "sourceEndLine": 180,
143
+ "qualification": "source-inspected; installed native execution pending"
144
+ },
145
+ "suggest-questions": {
146
+ "module": "graphify.analyze",
147
+ "function": "suggest_questions",
148
+ "family": "analysis",
149
+ "source": "Graphify-Labs/graphify/analyze.py",
150
+ "sourceSha256": "e6011dcbb35144134d8ebef12d17ea869e73749e79722caa9527ed30500edd4a",
151
+ "sourceLine": 446,
152
+ "sourceEndLine": 571,
153
+ "qualification": "source-inspected; installed native execution pending"
154
+ },
155
+ "graph-diff": {
156
+ "module": "graphify.analyze",
157
+ "function": "graph_diff",
158
+ "family": "change analysis",
159
+ "source": "Graphify-Labs/graphify/analyze.py",
160
+ "sourceSha256": "e6011dcbb35144134d8ebef12d17ea869e73749e79722caa9527ed30500edd4a",
161
+ "sourceLine": 574,
162
+ "sourceEndLine": 655,
163
+ "qualification": "source-inspected; installed native execution pending"
164
+ },
165
+ "import-cycles": {
166
+ "module": "graphify.analyze",
167
+ "function": "find_import_cycles",
168
+ "family": "code diagnostics",
169
+ "source": "Graphify-Labs/graphify/analyze.py",
170
+ "sourceSha256": "e6011dcbb35144134d8ebef12d17ea869e73749e79722caa9527ed30500edd4a",
171
+ "sourceLine": 658,
172
+ "sourceEndLine": 772,
173
+ "qualification": "source-inspected; installed native execution pending"
174
+ },
175
+ "impact": {
176
+ "module": "graphify.affected",
177
+ "function": "affected_nodes",
178
+ "family": "code diagnostics",
179
+ "source": "Graphify-Labs/graphify/affected.py",
180
+ "sourceSha256": "c679c7e7f8881973e449fd885dd0ccc096dcc074f4c93f43962b1ce957ef77a7",
181
+ "sourceLine": 190,
182
+ "sourceEndLine": 255,
183
+ "qualification": "source-inspected; installed native execution pending"
184
+ },
185
+ "query": {
186
+ "module": "graphify.serve",
187
+ "function": "_query_graph_text",
188
+ "family": "query",
189
+ "source": "Graphify-Labs/graphify/serve.py",
190
+ "sourceSha256": "a6df71d1c6efd3281d2938f8c234d987ba61a92270db585490688d194b7f6bec",
191
+ "sourceLine": 1361,
192
+ "sourceEndLine": 1420,
193
+ "qualification": "source-inspected; installed native execution pending"
194
+ },
195
+ "path": {
196
+ "module": "graphify.serve",
197
+ "function": "_shortest_path_text",
198
+ "family": "query",
199
+ "source": "Graphify-Labs/graphify/serve.py",
200
+ "sourceSha256": "a6df71d1c6efd3281d2938f8c234d987ba61a92270db585490688d194b7f6bec",
201
+ "sourceLine": 1664,
202
+ "sourceEndLine": 1762,
203
+ "qualification": "source-inspected; installed native execution pending"
204
+ },
205
+ "node": {
206
+ "module": "graphify.serve",
207
+ "function": "_resolve_single_node",
208
+ "family": "query",
209
+ "source": "Graphify-Labs/graphify/serve.py",
210
+ "sourceSha256": "a6df71d1c6efd3281d2938f8c234d987ba61a92270db585490688d194b7f6bec",
211
+ "sourceLine": 1638,
212
+ "sourceEndLine": 1661,
213
+ "qualification": "source-inspected; installed native execution pending"
214
+ },
215
+ "neighbors": {
216
+ "module": "graphify.serve",
217
+ "function": "_resolve_single_node",
218
+ "family": "query",
219
+ "source": "Graphify-Labs/graphify/serve.py",
220
+ "sourceSha256": "a6df71d1c6efd3281d2938f8c234d987ba61a92270db585490688d194b7f6bec",
221
+ "sourceLine": 1638,
222
+ "sourceEndLine": 1661,
223
+ "qualification": "source-inspected; installed native execution pending"
224
+ },
225
+ "cache-check": {
226
+ "module": "graphify.cache",
227
+ "function": "check_semantic_cache",
228
+ "family": "maintenance",
229
+ "source": "Graphify-Labs/graphify/cache.py",
230
+ "sourceSha256": "b630ce0c29cf5c00e2a43a7196492b7531ed905ac48c86f5f42c13e2ce841dbc",
231
+ "sourceLine": 1233,
232
+ "sourceEndLine": 1315,
233
+ "qualification": "source-inspected; installed native execution pending"
234
+ },
235
+ "export-json": {
236
+ "module": "graphify.export",
237
+ "function": "to_json",
238
+ "family": "export",
239
+ "source": "Graphify-Labs/graphify/export.py",
240
+ "sourceSha256": "312f4658900e33360e6d23a005ee4ed227a30ae7737bfeba13318f7f16af5576",
241
+ "sourceLine": 272,
242
+ "sourceEndLine": 417,
243
+ "qualification": "source-inspected; installed native execution pending"
244
+ },
245
+ "export-cypher": {
246
+ "module": "graphify.export",
247
+ "function": "to_cypher",
248
+ "family": "export",
249
+ "source": "Graphify-Labs/graphify/export.py",
250
+ "sourceSha256": "312f4658900e33360e6d23a005ee4ed227a30ae7737bfeba13318f7f16af5576",
251
+ "sourceLine": 480,
252
+ "sourceEndLine": 504,
253
+ "qualification": "source-inspected; installed native execution pending"
254
+ },
255
+ "export-obsidian": {
256
+ "module": "graphify.export",
257
+ "function": "to_obsidian",
258
+ "family": "export",
259
+ "source": "Graphify-Labs/graphify/export.py",
260
+ "sourceSha256": "312f4658900e33360e6d23a005ee4ed227a30ae7737bfeba13318f7f16af5576",
261
+ "sourceLine": 687,
262
+ "sourceEndLine": 1037,
263
+ "qualification": "source-inspected; installed native execution pending"
264
+ },
265
+ "export-canvas": {
266
+ "module": "graphify.export",
267
+ "function": "to_canvas",
268
+ "family": "export",
269
+ "source": "Graphify-Labs/graphify/export.py",
270
+ "sourceSha256": "312f4658900e33360e6d23a005ee4ed227a30ae7737bfeba13318f7f16af5576",
271
+ "sourceLine": 1040,
272
+ "sourceEndLine": 1215,
273
+ "qualification": "source-inspected; installed native execution pending"
274
+ },
275
+ "export-graphml": {
276
+ "module": "graphify.export",
277
+ "function": "to_graphml",
278
+ "family": "export",
279
+ "source": "Graphify-Labs/graphify/export.py",
280
+ "sourceSha256": "312f4658900e33360e6d23a005ee4ed227a30ae7737bfeba13318f7f16af5576",
281
+ "sourceLine": 1218,
282
+ "sourceEndLine": 1292,
283
+ "qualification": "source-inspected; installed native execution pending"
284
+ },
285
+ "export-svg": {
286
+ "module": "graphify.export",
287
+ "function": "to_svg",
288
+ "family": "export",
289
+ "source": "Graphify-Labs/graphify/export.py",
290
+ "sourceSha256": "312f4658900e33360e6d23a005ee4ed227a30ae7737bfeba13318f7f16af5576",
291
+ "sourceLine": 1295,
292
+ "sourceEndLine": 1362,
293
+ "qualification": "source-inspected; installed native execution pending"
294
+ },
295
+ "reflect": {
296
+ "module": "graphify.reflect",
297
+ "function": "reflect",
298
+ "family": "work memory",
299
+ "source": "Graphify-Labs/graphify/reflect.py",
300
+ "sourceSha256": "53d877f8009344cfc721d400444bbf2c7f7fcdcd3c4f97580a369c4f79b06db0",
301
+ "sourceLine": 564,
302
+ "sourceEndLine": 610,
303
+ "qualification": "source-inspected; installed native execution pending"
304
+ }
305
+ }
306
+ }
@@ -1,7 +1,7 @@
1
1
  export const ruleIdentity = Object.freeze({
2
2
  "profile": "source-qualified-required-direction/r1",
3
- "commit": "fcfdbe5ded672d41c717f49e0cfdf68b6060834d",
4
- "tree": "400e181cd0cb55976f3ef7ab1a1405531dacd521",
3
+ "commit": "0a77cdc0f4f949d9aef29e3567303e2a6588a610",
4
+ "tree": "4aaadc77690868921c1748e15079e0965e06faae",
5
5
  "files": [
6
6
  {
7
7
  "path": "src/knowledge/plan.mjs",
@@ -17,15 +17,15 @@ export const ruleIdentity = Object.freeze({
17
17
  },
18
18
  {
19
19
  "path": "src/graph/graph.mjs",
20
- "bytes": 9934,
21
- "sha256": "1f01fbeab7e6fcaed127c8fe84c9a48b08f1fec13d21f486c48726715a5bbb92",
22
- "blob": "6bce4e1213098457097e025f8ead53e6b4403336"
20
+ "bytes": 10397,
21
+ "sha256": "0200feb42d59aa8e0f2e9b0e7dd49bbd68f25bc09710aa1ecce92bc82596adb5",
22
+ "blob": "96f6f05f8df1b3cf9c75d050359d11e9bad39aa2"
23
23
  },
24
24
  {
25
25
  "path": "src/graph/knowledge-graph.mjs",
26
- "bytes": 65477,
27
- "sha256": "94895598d388e80a70b7bbe92ad57138dccd94896699a6c472e635d885b1139f",
28
- "blob": "283ef86ad08a6360bc006cc75ca5cedb2718e14d"
26
+ "bytes": 66377,
27
+ "sha256": "fce2815bbc851451fca187082238a286f4796742b917229ec1b55af85d9e8eb0",
28
+ "blob": "95cf2bf277c5a6599c0c95f046adea786cfc3f53"
29
29
  },
30
30
  {
31
31
  "path": "templates/knowledge-workspace/knowledge-plan.schema.json",
@@ -39,6 +39,11 @@ export const ruleIdentity = Object.freeze({
39
39
  "supersededQualification": {
40
40
  "commit": "b1bdc9279a99f7c884ddfdfe0e2a24315d6f3666",
41
41
  "tree": "2797f44baf89007d3808675d897e55a943fc0d65",
42
- "note": "The supplier qualified against this earlier commit. The five pinned files are byte-identical there and at the source authority above."
42
+ "note": "The supplier qualified against this earlier commit. The pinned plan, context and schema files are byte-identical there and at the source authority above; src/graph/graph.mjs and src/graph/knowledge-graph.mjs are not, and that qualification does not cover their current bytes."
43
+ },
44
+ "previousSourceAuthority": {
45
+ "commit": "fcfdbe5ded672d41c717f49e0cfdf68b6060834d",
46
+ "tree": "400e181cd0cb55976f3ef7ab1a1405531dacd521",
47
+ "note": "Regenerated by the source owner for a changed candidate: the canonical graph build became a set of steps that a caller may run with waits between them (the census of Markdown sources), and buildKnowledgeGraph and buildCanonicalGraph run them through. Their results and errors are meant to be unchanged; the Knowledge Health tests pass on the current bytes."
43
48
  }
44
49
  })
@@ -26,7 +26,7 @@ const resolvedInputs = new WeakSet()
26
26
  const plans = new WeakSet()
27
27
  const freeze = (v) => { if (v && typeof v === 'object') { Object.values(v).forEach(freeze); Object.freeze(v) } return v }
28
28
 
29
- export { selectPersonalGeneration, selectionConfirmDigest, readPersonalSelection, inventoryPersonalHome, planPersonalRestore, restorePersonalInputs } from './selection.mjs'
29
+ export { selectPersonalGeneration, selectionConfirmDigest, readPersonalSelection, readPersonalSelectionHead, inventoryPersonalHome, planPersonalRestore, restorePersonalInputs } from './selection.mjs'
30
30
  export class PersonalWorkspaceRefusal extends Error {
31
31
  constructor(code) { super(`Personal workspace refused: ${code}`); this.name = 'PersonalWorkspaceRefusal'; this.code = code }
32
32
  }
@@ -45,8 +45,10 @@ function privateHome(personalHome) {
45
45
  if (stat.uid !== process.getuid() || (stat.mode & 0o022) !== 0) refuse('not-private-location')
46
46
  return personalHome
47
47
  }
48
+ // Opened without waiting on it: a FIFO or a device in a record's place refuses instead of blocking the caller, which
49
+ // may be a service's event loop.
48
50
  function readBytes(file, limit, tooLarge = 'malformed-input') {
49
- const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW)
51
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | (fs.constants.O_NONBLOCK ?? 0))
50
52
  try {
51
53
  const stat = fs.fstatSync(fd)
52
54
  if (!stat.isFile()) refuse('malformed-input')
@@ -182,6 +184,20 @@ export function readPersonalSelection(options) {
182
184
  }, 'personal-home-unavailable')
183
185
  }
184
186
 
187
+ // The current selection from the history alone. Nothing is composed, so nothing
188
+ // here says whether the selected generation is still eligible: a host that
189
+ // composes elsewhere reads this first, and reads it again to compare the head it
190
+ // acted on with the head now. `sequence` is 0 while nothing is selected.
191
+ export function readPersonalSelectionHead(options) {
192
+ return safe(() => {
193
+ const { personalHome } = options ?? {}
194
+ privateHome(personalHome)
195
+ const { records, head } = readHistory(personalHome)
196
+ const current = records.at(-1) ?? null
197
+ return freeze({ selected: current?.generationId ?? null, sequence: current?.sequence ?? 0, head })
198
+ }, 'personal-home-unavailable')
199
+ }
200
+
185
201
  // Lists entries without failing the whole inventory: a concurrently removed entry
186
202
  // is skipped; an unreadable, foreign or oversized one is reported without a digest.
187
203
  function listFiles(dir, keep) {