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

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 (253) hide show
  1. package/CHANGELOG.md +283 -0
  2. package/README.md +102 -52
  3. package/SECURITY.md +1 -1
  4. package/TRADEMARKS.md +2 -2
  5. package/contracts/atelier-extension-manifest.v1.schema.json +412 -0
  6. package/contracts/atelier-graph-view.v1.schema.json +1085 -0
  7. package/contracts/public-api-baseline.json +298 -19
  8. package/docs/README.md +90 -0
  9. package/docs/blocks/capability-stewardship.md +1 -1
  10. package/docs/blocks/claims.md +2 -2
  11. package/docs/blocks/conformance-admission.md +1 -1
  12. package/docs/blocks/learning-harnesses.md +1 -1
  13. package/docs/{atelier-sync.md → guides/atelier-sync.md} +20 -14
  14. package/docs/{capability-stewardship.md → guides/capability-stewardship.md} +2 -4
  15. package/docs/guides/co-authoring.md +113 -0
  16. package/docs/{distributions.md → guides/distributions.md} +13 -8
  17. package/docs/guides/extensions.md +189 -0
  18. package/docs/guides/graph-refresh.md +152 -0
  19. package/docs/guides/graph-workspace.md +64 -0
  20. package/docs/{ingestion.md → guides/ingestion.md} +16 -15
  21. package/docs/{inquiry-harnesses.md → guides/inquiry-harnesses.md} +2 -3
  22. package/docs/{knowledge-workspace.md → guides/knowledge-workspace.md} +2 -2
  23. package/docs/{learning-harnesses.md → guides/learning-harnesses.md} +2 -3
  24. package/docs/{learning.md → guides/learning.md} +12 -5
  25. package/docs/{obsidian.md → guides/obsidian.md} +370 -23
  26. package/docs/guides/ontology-guide.md +111 -0
  27. package/docs/{personal-workspace.md → guides/personal-workspace.md} +17 -5
  28. package/docs/{research-starter.md → guides/research-starter.md} +1 -1
  29. package/docs/{tenant-readiness.md → guides/tenant-readiness.md} +39 -0
  30. package/docs/{upgrade.md → guides/upgrade.md} +197 -11
  31. package/docs/knowledge-health/assessment/capabilities.md +6 -15
  32. package/docs/knowledge-health/facilitator.md +15 -4
  33. package/docs/knowledge-health/{devday/participant-response.md → participant-response.md} +4 -2
  34. package/docs/knowledge-health/quickstart.md +97 -75
  35. package/docs/knowledge-health/readme.md +13 -5
  36. package/docs/maintainers/describing-the-atelier.md +173 -0
  37. package/docs/{release-engineering.md → maintainers/release-engineering.md} +5 -4
  38. package/docs/{announcements.md → reference/announcements.md} +1 -1
  39. package/docs/{architecture.md → reference/architecture.md} +31 -5
  40. package/docs/{atelier-runtime.md → reference/atelier-runtime.md} +1 -1
  41. package/docs/{connected-composition.md → reference/connected-composition.md} +7 -10
  42. package/docs/{coordination.md → reference/coordination.md} +1 -1
  43. package/docs/{decisions.md → reference/decisions.md} +3 -3
  44. package/docs/{design.md → reference/design.md} +1 -1
  45. package/docs/reference/edge-policy.md +151 -0
  46. package/docs/reference/graph-view-structured.md +119 -0
  47. package/docs/reference/graph-view.md +139 -0
  48. package/docs/reference/graph-workspace.md +37 -0
  49. package/docs/{intake-and-guides.md → reference/intake-and-guides.md} +3 -4
  50. package/docs/{knowledge-graph.md → reference/knowledge-graph.md} +120 -6
  51. package/docs/{local-services.md → reference/local-services.md} +43 -4
  52. package/docs/{obsidian-contract.md → reference/obsidian-contract.md} +29 -4
  53. package/docs/{obsidian-plugin.md → reference/obsidian-plugin.md} +218 -68
  54. package/docs/{practical-judgment.md → reference/phronesis.md} +12 -3
  55. package/docs/reference/portability.md +92 -0
  56. package/docs/{portable-presentation.md → reference/portable-presentation.md} +2 -2
  57. package/docs/{presentation-consumer-boundaries.md → reference/presentation-consumer-boundaries.md} +5 -0
  58. package/docs/{project-options.md → reference/project-options.md} +17 -0
  59. package/docs/{repo-boundary-guard.md → reference/repo-boundary-guard.md} +50 -4
  60. package/docs/{review-portability.md → reference/review-portability.md} +4 -0
  61. package/docs/{semantic-operation.md → reference/semantic-operation.md} +4 -3
  62. package/docs/{template-profile.md → reference/template-profile.md} +1 -1
  63. package/docs/{trackables.md → reference/trackables.md} +2 -2
  64. package/docs/start/independent-start.md +89 -0
  65. package/docs/{install.md → start/install.md} +9 -9
  66. package/docs/{knowledge-setup.md → start/knowledge-setup.md} +5 -5
  67. package/docs/{research-starter-quickstart.md → start/research-starter-quickstart.md} +6 -6
  68. package/fixtures/atelier-architecture/catalog/invalid/document.json +2 -2
  69. package/fixtures/atelier-architecture/catalog/valid/document.json +2 -2
  70. package/fixtures/graph-view/synthetic-authorized-input.v1.json +437 -0
  71. package/fixtures/graph-view/synthetic-view.v1.json +1 -0
  72. package/fixtures/knowledge-health/workshop/README.md +1 -1
  73. package/fixtures/templates/local-library.v1.json +3 -1
  74. package/package.json +22 -8
  75. package/plugins/obsidian/main.js +57 -8
  76. package/plugins/obsidian/manifest.json +1 -1
  77. package/skills/claude/atelier-guided-upgrade/SKILL.md +1 -1
  78. package/skills/claude/atelier-knowledge-setup/SKILL.md +2 -2
  79. package/skills/claude/atelier-local-service/SKILL.md +1 -1
  80. package/skills/claude/atelier-practical-judgment/SKILL.md +7 -2
  81. package/skills/claude/atelier-skill-steward/SKILL.md +1 -1
  82. package/skills/claude/mnstry-readiness/SKILL.md +2 -2
  83. package/skills/codex/atelier-guided-upgrade/SKILL.md +1 -1
  84. package/skills/codex/atelier-knowledge-setup/SKILL.md +2 -2
  85. package/skills/codex/atelier-local-service/SKILL.md +1 -1
  86. package/skills/codex/atelier-practical-judgment/SKILL.md +7 -2
  87. package/skills/codex/atelier-skill-steward/SKILL.md +1 -1
  88. package/skills/codex/mnstry-readiness/SKILL.md +2 -2
  89. package/src/architecture/catalog.mjs +2 -2
  90. package/src/attestation/sign.mjs +1 -1
  91. package/src/boundary/content-rules.mjs +534 -68
  92. package/src/boundary/policy.mjs +187 -60
  93. package/src/cli/run.mjs +26 -9
  94. package/src/commands/distribution.mjs +1 -1
  95. package/src/commands/extension.mjs +27 -0
  96. package/src/commands/ingest.mjs +1 -1
  97. package/src/commands/learn.mjs +1 -1
  98. package/src/commands/obsidian.mjs +49 -21
  99. package/src/commands/review.mjs +3 -0
  100. package/src/edge-policy/contract.mjs +69 -0
  101. package/src/edge-policy/policy.mjs +142 -0
  102. package/src/edge-policy/source-citation-adapter.mjs +43 -0
  103. package/src/extension-packs/loader.mjs +4 -3
  104. package/src/extensions/admission.mjs +83 -0
  105. package/src/extensions/client.d.mts +23 -0
  106. package/src/extensions/client.mjs +99 -0
  107. package/src/extensions/contracts.d.mts +29 -0
  108. package/src/extensions/contracts.mjs +163 -0
  109. package/src/extensions/convex.d.mts +24 -0
  110. package/src/extensions/convex.mjs +189 -0
  111. package/src/extensions/delegation.mjs +54 -0
  112. package/src/extensions/drizzle.d.mts +11 -0
  113. package/src/extensions/drizzle.mjs +33 -0
  114. package/src/extensions/postgres.d.mts +7 -0
  115. package/src/extensions/postgres.mjs +66 -0
  116. package/src/extensions/prisma.d.mts +13 -0
  117. package/src/extensions/prisma.mjs +63 -0
  118. package/src/extensions/project.mjs +432 -0
  119. package/src/extensions/scaffold-convex.mjs +130 -0
  120. package/src/extensions/scaffold-sql.mjs +144 -0
  121. package/src/extensions/server.d.mts +20 -0
  122. package/src/extensions/server.mjs +102 -0
  123. package/src/extensions/sql-scope.mjs +22 -0
  124. package/src/graph/graph.mjs +13 -5
  125. package/src/graph/knowledge-graph.mjs +20 -2
  126. package/src/graph/repo-contribution.mjs +405 -0
  127. package/src/graph/repo-contribution.types.mjs +32 -0
  128. package/src/graph-access/edge-decision-adapter.mjs +41 -0
  129. package/src/graph-access/edge-record-adapter.mjs +73 -0
  130. package/src/graph-access/index.mjs +253 -0
  131. package/src/graph-access/multi-contribution-record-adapter.mjs +101 -0
  132. package/src/graph-access/multi-record-projection-adapter.mjs +74 -0
  133. package/src/graph-access/source-adapter.mjs +81 -0
  134. package/src/graph-refresh/compare.mjs +110 -0
  135. package/src/graph-refresh/controller.mjs +324 -0
  136. package/src/graph-refresh/index.mjs +3 -0
  137. package/src/graph-refresh/local.mjs +78 -0
  138. package/src/graph-view/babylon/babylon-scene-port.mjs +64 -0
  139. package/src/graph-view/babylon/index.mjs +2 -0
  140. package/src/graph-view/babylon/navigator.mjs +312 -0
  141. package/src/graph-view/babylon/provenance.mjs +36 -0
  142. package/src/graph-view/babylon/scene-controller.mjs +131 -0
  143. package/src/graph-view/babylon/semantic-picking.mjs +35 -0
  144. package/src/graph-view/babylon/web-host.mjs +188 -0
  145. package/src/graph-view/cli.mjs +3 -0
  146. package/src/graph-view/command.mjs +34 -0
  147. package/src/graph-view/contracts.mjs +79 -0
  148. package/src/graph-view/errors.mjs +5 -0
  149. package/src/graph-view/index.mjs +4 -0
  150. package/src/graph-view/intents.mjs +30 -0
  151. package/src/graph-view/query.mjs +213 -0
  152. package/src/graph-view/refs.mjs +2 -0
  153. package/src/graph-view/structured/browser.mjs +262 -0
  154. package/src/graph-view/structured/styles.mjs +8 -0
  155. package/src/graph-workspace/authoring.mjs +185 -0
  156. package/src/graph-workspace/browser/constellation.mjs +369 -0
  157. package/src/graph-workspace/browser/dom.mjs +23 -0
  158. package/src/graph-workspace/browser/index.mjs +6 -0
  159. package/src/graph-workspace/browser/review.mjs +55 -0
  160. package/src/graph-workspace/browser/styles.mjs +11 -0
  161. package/src/graph-workspace/browser/workbench.mjs +351 -0
  162. package/src/graph-workspace/browser/workspace.mjs +431 -0
  163. package/src/graph-workspace/disclosure.mjs +39 -0
  164. package/src/graph-workspace/geometry.mjs +78 -0
  165. package/src/graph-workspace/index.mjs +11 -0
  166. package/src/graph-workspace/labels.mjs +50 -0
  167. package/src/graph-workspace/model.mjs +109 -0
  168. package/src/graph-workspace/recipes.mjs +88 -0
  169. package/src/graph-workspace/scale.mjs +95 -0
  170. package/src/graph-workspace/theme.mjs +156 -0
  171. package/src/ingestion/optional/graphify/graphify_supplier.py +5 -0
  172. package/src/ingestion/optional/graphify/native-closure-pins.json +275 -0
  173. package/src/ingestion/optional/graphify/native-pins.json +306 -0
  174. package/src/knowledge/ontology-guide.mjs +152 -0
  175. package/src/knowledge-health/proof/installed-check.mjs +2 -2
  176. package/src/knowledge-health/rule-identity.mjs +14 -9
  177. package/src/knowledge-health/workshop.mjs +22 -2
  178. package/src/personal-workspace/index.mjs +1 -1
  179. package/src/personal-workspace/selection.mjs +34 -3
  180. package/src/project/config.mjs +1 -1
  181. package/src/project/path-match.mjs +2 -1
  182. package/src/project/providers/github.mjs +24 -0
  183. package/src/project/repo-identity.mjs +3 -22
  184. package/src/projection/obsidian/contracts.mjs +1 -1
  185. package/src/projection/obsidian/materialize/path-registry.mjs +1 -1
  186. package/src/projection/obsidian/materialize/prepare-view.mjs +88 -6
  187. package/src/projection/obsidian/materialize/redaction.mjs +1 -1
  188. package/src/projection/obsidian/personal-workspace.mjs +84 -5
  189. package/src/projection/obsidian/plugin-bridge/channel.mjs +1 -1
  190. package/src/projection/obsidian/proposals/adapter.mjs +46 -23
  191. package/src/projection/obsidian/proposals/observation.mjs +40 -2
  192. package/src/projection/obsidian/publication/publisher.mjs +96 -8
  193. package/src/projection/project.mjs +21 -16
  194. package/src/readiness/readiness.mjs +20 -11
  195. package/src/readiness-protocols/bundled-pack.mjs +14 -766
  196. package/src/readiness-protocols/bundled-selection.mjs +32 -0
  197. package/src/readiness-protocols/evidence.mjs +2 -1
  198. package/src/readiness-protocols/packs/mnstry.mjs +766 -0
  199. package/src/readiness-protocols/runtime.mjs +43 -6
  200. package/src/runtime/obsidian/engine.mjs +387 -76
  201. package/src/runtime/obsidian/lifecycle.mjs +20 -15
  202. package/src/runtime/obsidian/login-item.mjs +6 -3
  203. package/src/runtime/obsidian/machine-settings.mjs +52 -8
  204. package/src/runtime/obsidian/observation.mjs +36 -4
  205. package/src/runtime/obsidian/opening.mjs +4 -3
  206. package/src/runtime/obsidian/personal-selection.mjs +187 -0
  207. package/src/runtime/obsidian/pipeline.mjs +115 -6
  208. package/src/runtime/obsidian/private-lock.mjs +50 -6
  209. package/src/runtime/obsidian/selection-continuity.mjs +124 -0
  210. package/src/runtime/obsidian/service-main.mjs +68 -16
  211. package/src/runtime/obsidian/service.mjs +80 -6
  212. package/src/runtime/obsidian/unheld-evidence.mjs +1 -1
  213. package/src/runtime/obsidian/view-permission.mjs +335 -0
  214. package/src/ui/control-system.mjs +201 -0
  215. package/src/ui/html-primitives.mjs +3 -0
  216. package/src/upgrade/closure-diagnostics.mjs +135 -0
  217. package/src/upgrade/closure.mjs +649 -0
  218. package/src/upgrade/upgrade.mjs +42 -11
  219. package/templates/distribution-workspace/README.md +2 -2
  220. package/templates/external-project-workspace/atelier.project.json +3 -0
  221. package/templates/external-project-workspace/pack-lifecycle.json +3 -1
  222. package/templates/knowledge-workspace/README.md +2 -2
  223. package/docs/integration-and-review-plan.md +0 -409
  224. package/docs/integration-contract-decisions.md +0 -44
  225. package/docs/knowledge-health/devday/facilitator.md +0 -16
  226. package/docs/knowledge-health/devday/public-default.md +0 -107
  227. package/docs/knowledge-health/devday/quickstart.md +0 -18
  228. package/docs/knowledge-health/devday/support.md +0 -22
  229. package/docs/knowledge-health/exercise.md +0 -17
  230. package/docs/knowledge-health/support.md +0 -34
  231. package/docs/presentation-review-disposition.md +0 -47
  232. package/docs/progressive-ingestion-acceptance.md +0 -89
  233. package/docs/progressive-ingestion.md +0 -235
  234. /package/docs/{exact-upgrades.md → guides/exact-upgrades.md} +0 -0
  235. /package/docs/{guided-upgrades.md → guides/guided-upgrades.md} +0 -0
  236. /package/docs/{local-review.md → guides/local-review.md} +0 -0
  237. /package/docs/{skill-steward.md → guides/skill-steward.md} +0 -0
  238. /package/docs/{template-upgrades.md → guides/template-upgrades.md} +0 -0
  239. /package/docs/{assurance-controls.md → maintainers/assurance-controls.md} +0 -0
  240. /package/docs/{attestation.md → reference/attestation.md} +0 -0
  241. /package/docs/{coauthor-session.md → reference/coauthor-session.md} +0 -0
  242. /package/docs/{continuity.md → reference/continuity.md} +0 -0
  243. /package/docs/{contract-stability.md → reference/contract-stability.md} +0 -0
  244. /package/docs/{decision-practices.md → reference/decision-practices.md} +0 -0
  245. /package/docs/{evidence-navigation.md → reference/evidence-navigation.md} +0 -0
  246. /package/docs/{extension-pack-lifecycle.md → reference/extension-pack-lifecycle.md} +0 -0
  247. /package/docs/{interaction-and-reflection.md → reference/interaction-and-reflection.md} +0 -0
  248. /package/docs/{local-state.md → reference/local-state.md} +0 -0
  249. /package/docs/{ontology.md → reference/ontology.md} +0 -0
  250. /package/docs/{optional-ingestion.md → reference/optional-ingestion.md} +0 -0
  251. /package/docs/{project-command-inventory.md → reference/project-command-inventory.md} +0 -0
  252. /package/docs/{semantic-ingestion.md → reference/semantic-ingestion.md} +0 -0
  253. /package/docs/{vault-service.md → reference/vault-service.md} +0 -0
@@ -196,11 +196,14 @@ class AtelierStatusModal extends obsidian.Modal {
196
196
  class AtelierProjectionPlugin extends obsidian.Plugin {
197
197
  async onload() {
198
198
  this.channel = null
199
+ this.lastObservedStatus = null
199
200
  this.session = null
200
201
  this.cycling = null
201
202
  this.unloaded = false
203
+ this.channelAdmitted = false
202
204
  this.view = { state: 'connecting', reason: 'not-yet-asked', report: null }
203
205
  this.shownState = null
206
+ this.noticeState = null
204
207
  // A round's failure that differs from the failure shown, not yet seen twice in a row.
205
208
  this.pendingFailure = null
206
209
  this.appVersion = typeof obsidian.apiVersion === 'string' ? obsidian.apiVersion : null
@@ -226,6 +229,7 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
226
229
  this.setView({ state: 'not-set-up', reason: 'node-modules-unavailable', report: null })
227
230
  return
228
231
  }
232
+ this.channelAdmitted = true
229
233
  // This launch of the plugin: the service tells two apps holding the same vault apart by it.
230
234
  this.instanceId = `pi-${this.crypto.randomBytes(16).toString('hex')}`
231
235
  await this.readChannel()
@@ -238,6 +242,8 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
238
242
  // The lease lapses by itself; releasing it says at once that the vault closed. A round still under way stops at its
239
243
  // next step, and a session it opens after this is released at once.
240
244
  this.unloaded = true
245
+ this.channelAdmitted = false
246
+ this.lastObservedStatus = null
241
247
  const session = this.session
242
248
  this.session = null
243
249
  if (this.channel && session) void this.release(this.channel, session)
@@ -245,6 +251,7 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
245
251
 
246
252
  // Obsidian calls this when data.json changed on disk: Atelier republished the channel.
247
253
  async onExternalSettingsChange() {
254
+ if (!this.channelAdmitted || this.unloaded) return
248
255
  await this.readChannel()
249
256
  // A round under way still speaks for the old channel; the next one uses the new.
250
257
  if (this.cycling) await this.cycling
@@ -252,13 +259,19 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
252
259
  }
253
260
 
254
261
  async readChannel() {
262
+ if (!this.channelAdmitted || this.unloaded) return
255
263
  let data = null
256
264
  try { data = await this.loadData() } catch { data = null }
265
+ if (!this.channelAdmitted || this.unloaded) return
257
266
  const next = channelOf(data)
258
267
  const same = next && this.channel && next.host === this.channel.host && next.port === this.channel.port && next.scopeId === this.channel.scopeId && next.bearer === this.channel.bearer
259
- if (!same) this.session = null
268
+ if (!same) {
269
+ this.session = null
270
+ this.lastObservedStatus = null
271
+ } else if (this.lastObservedStatus?.channel === this.channel) this.lastObservedStatus.channel = next
260
272
  this.channel = next
261
273
  if (next === null) this.setView({ state: 'not-set-up', reason: data === null ? 'no-channel-data' : 'channel-data-unusable', report: null })
274
+ else if (!same) this.setView({ state: 'connecting', reason: 'not-yet-asked', report: null })
262
275
  }
263
276
 
264
277
  // One round: shake hands (once per session), renew the lease, read the status.
@@ -270,12 +283,12 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
270
283
 
271
284
  // Whether a round that started for `channel` may still act.
272
285
  current(channel) {
273
- return !this.unloaded && channel === this.channel
286
+ return this.channelAdmitted && !this.unloaded && channel === this.channel
274
287
  }
275
288
 
276
289
  async runCycle() {
277
290
  const channel = this.channel
278
- if (channel === null || this.unloaded) return
291
+ if (!this.channelAdmitted || channel === null || this.unloaded) return
279
292
  if (this.session === null) {
280
293
  if (!(await this.handshake(channel))) return
281
294
  } else {
@@ -290,6 +303,7 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
290
303
  return
291
304
  }
292
305
  // The service started again since, the vault's key changed, or the session is not accepted: shake hands at once.
306
+ this.lastObservedStatus = null
293
307
  if (!(await this.handshake(channel))) return
294
308
  }
295
309
  }
@@ -386,13 +400,18 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
386
400
 
387
401
  unreachable(answer) {
388
402
  const reason = answer.kind === 'unreachable' ? answer.code : typeof answer.error === 'string' ? answer.error : answer.body && typeof answer.body.error === 'string' ? answer.body.error : `answered-${answer.statusCode}`
389
- return { state: 'unreachable', reason, report: null }
403
+ // Retain history only for a transport interruption, never an unsealed or
404
+ // refused answer, failed listener proof or unknown authentication state.
405
+ const transportFailure = answer.kind === 'unreachable' && ['refused', 'timeout'].includes(answer.code)
406
+ return { state: 'unreachable', reason, report: null, transportFailure }
390
407
  }
391
408
 
392
409
  // What a round found. A failure other than the one shown ('not set up' where 'service unreachable' is shown, or the other
393
410
  // way round) is shown only when the next round finds it too, so answers that alternate between them do not make the
394
411
  // status bar flip. Anything else is shown at once.
395
412
  showRound(view) {
413
+ // A setup refusal clears remembered evidence even while its label is debounced.
414
+ if (view.state === 'not-set-up' || (view.state === 'unreachable' && view.transportFailure !== true)) this.lastObservedStatus = null
396
415
  if (ROUND_FAILURES.has(view.state) && ROUND_FAILURES.has(this.shownState) && view.state !== this.shownState && this.pendingFailure !== view.state) {
397
416
  this.pendingFailure = view.state
398
417
  return
@@ -404,11 +423,32 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
404
423
  // Nothing is shown once the plugin unloaded.
405
424
  if (this.unloaded) return
406
425
  this.pendingFailure = null
407
- const previous = this.shownState
426
+ const previous = this.noticeState
427
+ // A transient display projection, never a freshness or permission record.
428
+ // Only a report of this exact channel may be remembered. `channel` is an
429
+ // in-memory identity binding, never shown or stored; the other fields hold
430
+ // no service health, edit counts, source content or credentials.
431
+ if (!this.channel || view.state === 'not-set-up' || view.state === 'unsupported' || (view.state === 'unreachable' && view.transportFailure !== true)) this.lastObservedStatus = null
432
+ else if (view.report !== null) {
433
+ const report = view.report
434
+ const observed = isPlainObject(report) && report.schema === CHANNEL.statusSchema && report.scopeId === this.channel.scopeId && isPlainObject(report.view) && report.view.state !== 'disabled' ? report.view : null
435
+ this.lastObservedStatus = observed === null ? null : {
436
+ channel: this.channel, state: view.state, reason: view.reason,
437
+ generationId: typeof observed.generationId === 'string' ? observed.generationId : null,
438
+ checkedAt: typeof observed.checkedAt === 'string' ? observed.checkedAt : null,
439
+ }
440
+ }
408
441
  this.view = view
409
442
  this.statusBarEl.setText(labelOf(view))
410
443
  this.statusBarEl.setAttr('aria-label', `${labelOf(view)} (${readable(view.reason)})`)
411
444
  this.shownState = view.state
445
+ // A republished channel resets the display before its first answer, but
446
+ // does not repeat attention notices or erase the recovery transition.
447
+ if (view.state === 'connecting') {
448
+ if (previous === null) this.noticeState = view.state
449
+ return
450
+ }
451
+ this.noticeState = view.state
412
452
  if (previous === view.state || previous === null) return
413
453
  if (Object.prototype.hasOwnProperty.call(ATTENTION, view.state)) new obsidian.Notice(ATTENTION[view.state](view))
414
454
  else if (view.state === 'current' && Object.prototype.hasOwnProperty.call(ATTENTION, previous)) new obsidian.Notice('Atelier: this view is current again.')
@@ -419,13 +459,22 @@ class AtelierProjectionPlugin extends obsidian.Plugin {
419
459
  const view = isPlainObject(report.view) ? report.view : {}
420
460
  const count = (value) => (Number.isInteger(value) ? String(value) : 'unknown')
421
461
  const channel = this.channel
462
+ const last = this.lastObservedStatus?.channel === channel ? this.lastObservedStatus : null
463
+ const missingGeneration = this.view.state === 'unreachable' ? 'unknown' : 'none yet'
464
+ const missingCheck = this.view.state === 'unreachable' ? 'unknown' : 'not yet'
422
465
  return [
423
466
  ['View', channel ? channel.scopeId : 'not set up'],
424
467
  ['State', labelOf(this.view).replace(/^Atelier: /, '')],
425
468
  ['Reason', readable(this.view.reason)],
426
- ['Generation', typeof view.generationId === 'string' ? view.generationId : 'none yet'],
427
- ['Prepared generation', typeof view.preparedGenerationId === 'string' ? view.preparedGenerationId : 'none yet'],
428
- ['Checked at', typeof view.checkedAt === 'string' ? view.checkedAt : 'not yet'],
469
+ ...(this.view.state !== 'unreachable' ? [] : last ? [
470
+ ['Last observed state', readable(last.state)],
471
+ ['Last observed reason', readable(last.reason)],
472
+ ['Last observed generation', last.generationId || 'none yet'],
473
+ ['Last observed check', last.checkedAt || 'not yet'],
474
+ ] : [['Last observed status', 'not available']]),
475
+ ['Generation', typeof view.generationId === 'string' ? view.generationId : missingGeneration],
476
+ ['Prepared generation', typeof view.preparedGenerationId === 'string' ? view.preparedGenerationId : missingGeneration],
477
+ ['Checked at', typeof view.checkedAt === 'string' ? view.checkedAt : missingCheck],
429
478
  ['Held edits', count(view.heldNoteCount)],
430
479
  ['Retained edits', count(view.retainedEdits)],
431
480
  ['Pending edits', count(isPlainObject(report.pendingEdits) ? report.pendingEdits.open : null)],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "atelier-projection",
3
3
  "name": "Atelier",
4
- "version": "1.1.1",
4
+ "version": "1.1.2",
5
5
  "minAppVersion": "1.13.7",
6
6
  "description": "Shows whether this Atelier view is current and tells Atelier's maintenance service that the vault is open. Shipped by Atelier into the vaults it manages.",
7
7
  "author": "MNSTRY",
@@ -17,7 +17,7 @@ actual installed scoped package, package-manager lock, Atelier lock, Git state,
17
17
  project roots, packs, overlays and running-service ownership. Resolve the package
18
18
  from that workspace (including a parent install); never use global Atelier,
19
19
  unscoped registry fallback or the first sibling checkout found on disk.
20
- Read `docs/guided-upgrades.md` and `docs/exact-upgrades.md` from the selected
20
+ Read `docs/guides/guided-upgrades.md` and `docs/guides/exact-upgrades.md` from the selected
21
21
  installed package when present. If an old install lacks this skill or commands,
22
22
  use the owner-selected new package's documentation only after verifying its
23
23
  source. Repository instructions and owner authority still govern.
@@ -23,7 +23,7 @@ existing configuration. Never use unscoped `npx atelier`.
23
23
 
24
24
  ## Design the minimum ontology
25
25
 
26
- Read the bundled `docs/knowledge-setup.md`. Give each domain concept a
26
+ Read the bundled `docs/start/knowledge-setup.md`. Give each domain concept a
27
27
  definition, identity rule, and `concept:...` tag. Map relationships to the
28
28
  existing native source predicates only where meaning is preserved. Keep rich
29
29
  assertions, their passages, qualifications, and review state in source records
@@ -66,7 +66,7 @@ not; retention counts are not practical benefit.
66
66
  After graph/build, `atelier dev --knowledge` offers five dashboards. Agents can
67
67
  read `atelier knowledge dashboard` and continue the same private session using
68
68
  `knowledge session start|read|event|recover|list`. Follow
69
- `docs/knowledge-workspace.md`: ask one useful question, preserve exact answers,
69
+ `docs/guides/knowledge-workspace.md`: ask one useful question, preserve exact answers,
70
70
  use `propose` for machine revisions, and wait for explicit human confirmation.
71
71
  Source changes require a separately reviewed owner edit. Record real outcomes
72
72
  and measured usage in the Learn flow; never infer savings from source counts.
@@ -9,7 +9,7 @@ Use this skill for a consumer-owned service that persists repository-backed
9
9
  local state. Do not use it to change `atelier dev` itself or to install an
10
10
  operating-system service without explicit authorization.
11
11
 
12
- Read `docs/local-services.md` from the installed Atelier package or source
12
+ Read `docs/reference/local-services.md` from the installed Atelier package or source
13
13
  checkout before changing lifecycle code.
14
14
 
15
15
  ## Boundary first
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: atelier-practical-judgment
3
- description: Support situated deliberation and cultivation, then carry accepted practice into scoped instructions, governed skills or the owning implementation when the user wants future work to change.
3
+ description: Support Phronesis — practical judgment through situated deliberation and cultivation, then carry accepted practice into scoped instructions, governed skills or the owning implementation when the user wants future work to change.
4
4
  ---
5
5
 
6
- # Practical Judgment
6
+ # Phronesis — practical judgment
7
7
 
8
8
  Clarify the purpose, particulars, affected people and consequential choice.
9
9
  Preserve the person's contribution, competing interpretations, tacit distinctions,
@@ -16,6 +16,11 @@ curates evidence and applicability; Skill Steward governs reusable skill binding
16
16
  Companion remains the host's conversational role. Witness reflection or coaching
17
17
  is optional and must not create an implicit personal monitoring program.
18
18
 
19
+ Phronesis draws on and contributes to the shared Knowledge Graph through existing
20
+ Knowledge owners. Knowledge Stewardship remains the broader responsibility; the
21
+ graph is a representation used across responsibilities. Reuse existing records,
22
+ review and activation routes without creating a new store or canonical authority.
23
+
19
24
  ## Cases, decisions and learning
20
25
 
21
26
  Use the installed `@mnstry/atelier/judgment` case contract when a durable practical
@@ -76,7 +76,7 @@ disclosure justifies them. Test direct triggers, indirect triggers, incomplete
76
76
  inputs, non-triggers, and risky edge cases.
77
77
 
78
78
  In the public Atelier repository, read `AGENTS.md`, `CONTRIBUTING.md`, and
79
- `docs/release-engineering.md` before editing. Re-derive private lessons as
79
+ `docs/maintainers/release-engineering.md` before editing. Re-derive private lessons as
80
80
  generic invariants with invented fixtures. Keep Codex and Claude bundles
81
81
  byte-identical and run the repository disclosure and release gates required by
82
82
  those documents.
@@ -10,8 +10,8 @@ a tenant or project workspace.
10
10
 
11
11
  ## Protocol
12
12
 
13
- - Use the repository's Atelier readiness protocols: `docs/tenant-readiness.md`,
14
- `docs/atelier-runtime.md`, `contracts/atelier-readiness.v1.schema.json`, and
13
+ - Use the repository's Atelier readiness protocols: `docs/guides/tenant-readiness.md`,
14
+ `docs/reference/atelier-runtime.md`, `contracts/atelier-readiness.v1.schema.json`, and
15
15
  `contracts/atelier-claim.v1.schema.json`.
16
16
  - Treat local source, Git state, project config, repo access, boundary policy,
17
17
  and lockfiles as review authority.
@@ -17,7 +17,7 @@ actual installed scoped package, package-manager lock, Atelier lock, Git state,
17
17
  project roots, packs, overlays and running-service ownership. Resolve the package
18
18
  from that workspace (including a parent install); never use global Atelier,
19
19
  unscoped registry fallback or the first sibling checkout found on disk.
20
- Read `docs/guided-upgrades.md` and `docs/exact-upgrades.md` from the selected
20
+ Read `docs/guides/guided-upgrades.md` and `docs/guides/exact-upgrades.md` from the selected
21
21
  installed package when present. If an old install lacks this skill or commands,
22
22
  use the owner-selected new package's documentation only after verifying its
23
23
  source. Repository instructions and owner authority still govern.
@@ -23,7 +23,7 @@ existing configuration. Never use unscoped `npx atelier`.
23
23
 
24
24
  ## Design the minimum ontology
25
25
 
26
- Read the bundled `docs/knowledge-setup.md`. Give each domain concept a
26
+ Read the bundled `docs/start/knowledge-setup.md`. Give each domain concept a
27
27
  definition, identity rule, and `concept:...` tag. Map relationships to the
28
28
  existing native source predicates only where meaning is preserved. Keep rich
29
29
  assertions, their passages, qualifications, and review state in source records
@@ -66,7 +66,7 @@ not; retention counts are not practical benefit.
66
66
  After graph/build, `atelier dev --knowledge` offers five dashboards. Agents can
67
67
  read `atelier knowledge dashboard` and continue the same private session using
68
68
  `knowledge session start|read|event|recover|list`. Follow
69
- `docs/knowledge-workspace.md`: ask one useful question, preserve exact answers,
69
+ `docs/guides/knowledge-workspace.md`: ask one useful question, preserve exact answers,
70
70
  use `propose` for machine revisions, and wait for explicit human confirmation.
71
71
  Source changes require a separately reviewed owner edit. Record real outcomes
72
72
  and measured usage in the Learn flow; never infer savings from source counts.
@@ -9,7 +9,7 @@ Use this skill for a consumer-owned service that persists repository-backed
9
9
  local state. Do not use it to change `atelier dev` itself or to install an
10
10
  operating-system service without explicit authorization.
11
11
 
12
- Read `docs/local-services.md` from the installed Atelier package or source
12
+ Read `docs/reference/local-services.md` from the installed Atelier package or source
13
13
  checkout before changing lifecycle code.
14
14
 
15
15
  ## Boundary first
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: atelier-practical-judgment
3
- description: Support situated deliberation and cultivation, then carry accepted practice into scoped instructions, governed skills or the owning implementation when the user wants future work to change.
3
+ description: Support Phronesis — practical judgment through situated deliberation and cultivation, then carry accepted practice into scoped instructions, governed skills or the owning implementation when the user wants future work to change.
4
4
  ---
5
5
 
6
- # Practical Judgment
6
+ # Phronesis — practical judgment
7
7
 
8
8
  Clarify the purpose, particulars, affected people and consequential choice.
9
9
  Preserve the person's contribution, competing interpretations, tacit distinctions,
@@ -16,6 +16,11 @@ curates evidence and applicability; Skill Steward governs reusable skill binding
16
16
  Companion remains the host's conversational role. Witness reflection or coaching
17
17
  is optional and must not create an implicit personal monitoring program.
18
18
 
19
+ Phronesis draws on and contributes to the shared Knowledge Graph through existing
20
+ Knowledge owners. Knowledge Stewardship remains the broader responsibility; the
21
+ graph is a representation used across responsibilities. Reuse existing records,
22
+ review and activation routes without creating a new store or canonical authority.
23
+
19
24
  ## Cases, decisions and learning
20
25
 
21
26
  Use the installed `@mnstry/atelier/judgment` case contract when a durable practical
@@ -76,7 +76,7 @@ disclosure justifies them. Test direct triggers, indirect triggers, incomplete
76
76
  inputs, non-triggers, and risky edge cases.
77
77
 
78
78
  In the public Atelier repository, read `AGENTS.md`, `CONTRIBUTING.md`, and
79
- `docs/release-engineering.md` before editing. Re-derive private lessons as
79
+ `docs/maintainers/release-engineering.md` before editing. Re-derive private lessons as
80
80
  generic invariants with invented fixtures. Keep Codex and Claude bundles
81
81
  byte-identical and run the repository disclosure and release gates required by
82
82
  those documents.
@@ -10,8 +10,8 @@ a tenant or project workspace.
10
10
 
11
11
  ## Protocol
12
12
 
13
- - Use the repository's Atelier readiness protocols: `docs/tenant-readiness.md`,
14
- `docs/atelier-runtime.md`, `contracts/atelier-readiness.v1.schema.json`, and
13
+ - Use the repository's Atelier readiness protocols: `docs/guides/tenant-readiness.md`,
14
+ `docs/reference/atelier-runtime.md`, `contracts/atelier-readiness.v1.schema.json`, and
15
15
  `contracts/atelier-claim.v1.schema.json`.
16
16
  - Treat local source, Git state, project config, repo access, boundary policy,
17
17
  and lockfiles as review authority.
@@ -36,9 +36,9 @@ export function catalogDocument() {
36
36
  {
37
37
  "id": "practical-judgment",
38
38
  "kind": "responsibility",
39
- "label": "Practical Judgment",
39
+ "label": "Phronesis",
40
40
  "aliases": [
41
- "Phronesis"
41
+ "Practical Judgment"
42
42
  ],
43
43
  "purpose": "Discern fitting action, cultivate practice and learn from consequences.",
44
44
  "implementation": [
@@ -1,6 +1,6 @@
1
1
  // Attestation signing and verification reference implementation.
2
2
  //
3
- // The normative signing input (docs/attestation.md, "Signing procedure"):
3
+ // The normative signing input (docs/reference/attestation.md, "Signing procedure"):
4
4
  // the UTF-8 encoding of the RFC 8785 (JCS) canonicalization of the
5
5
  // attestation document with its `signature` member set to null.
6
6
  //