@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.
- package/CHANGELOG.md +283 -0
- package/README.md +102 -52
- package/SECURITY.md +1 -1
- package/TRADEMARKS.md +2 -2
- package/contracts/atelier-extension-manifest.v1.schema.json +412 -0
- package/contracts/atelier-graph-view.v1.schema.json +1085 -0
- package/contracts/public-api-baseline.json +298 -19
- package/docs/README.md +90 -0
- package/docs/blocks/capability-stewardship.md +1 -1
- package/docs/blocks/claims.md +2 -2
- package/docs/blocks/conformance-admission.md +1 -1
- package/docs/blocks/learning-harnesses.md +1 -1
- package/docs/{atelier-sync.md → guides/atelier-sync.md} +20 -14
- package/docs/{capability-stewardship.md → guides/capability-stewardship.md} +2 -4
- package/docs/guides/co-authoring.md +113 -0
- package/docs/{distributions.md → guides/distributions.md} +13 -8
- package/docs/guides/extensions.md +189 -0
- package/docs/guides/graph-refresh.md +152 -0
- package/docs/guides/graph-workspace.md +64 -0
- package/docs/{ingestion.md → guides/ingestion.md} +16 -15
- package/docs/{inquiry-harnesses.md → guides/inquiry-harnesses.md} +2 -3
- package/docs/{knowledge-workspace.md → guides/knowledge-workspace.md} +2 -2
- package/docs/{learning-harnesses.md → guides/learning-harnesses.md} +2 -3
- package/docs/{learning.md → guides/learning.md} +12 -5
- package/docs/{obsidian.md → guides/obsidian.md} +370 -23
- package/docs/guides/ontology-guide.md +111 -0
- package/docs/{personal-workspace.md → guides/personal-workspace.md} +17 -5
- package/docs/{research-starter.md → guides/research-starter.md} +1 -1
- package/docs/{tenant-readiness.md → guides/tenant-readiness.md} +39 -0
- package/docs/{upgrade.md → guides/upgrade.md} +197 -11
- package/docs/knowledge-health/assessment/capabilities.md +6 -15
- package/docs/knowledge-health/facilitator.md +15 -4
- package/docs/knowledge-health/{devday/participant-response.md → participant-response.md} +4 -2
- package/docs/knowledge-health/quickstart.md +97 -75
- package/docs/knowledge-health/readme.md +13 -5
- package/docs/maintainers/describing-the-atelier.md +173 -0
- package/docs/{release-engineering.md → maintainers/release-engineering.md} +5 -4
- package/docs/{announcements.md → reference/announcements.md} +1 -1
- package/docs/{architecture.md → reference/architecture.md} +31 -5
- package/docs/{atelier-runtime.md → reference/atelier-runtime.md} +1 -1
- package/docs/{connected-composition.md → reference/connected-composition.md} +7 -10
- package/docs/{coordination.md → reference/coordination.md} +1 -1
- package/docs/{decisions.md → reference/decisions.md} +3 -3
- package/docs/{design.md → reference/design.md} +1 -1
- package/docs/reference/edge-policy.md +151 -0
- package/docs/reference/graph-view-structured.md +119 -0
- package/docs/reference/graph-view.md +139 -0
- package/docs/reference/graph-workspace.md +37 -0
- package/docs/{intake-and-guides.md → reference/intake-and-guides.md} +3 -4
- package/docs/{knowledge-graph.md → reference/knowledge-graph.md} +120 -6
- package/docs/{local-services.md → reference/local-services.md} +43 -4
- package/docs/{obsidian-contract.md → reference/obsidian-contract.md} +29 -4
- package/docs/{obsidian-plugin.md → reference/obsidian-plugin.md} +218 -68
- package/docs/{practical-judgment.md → reference/phronesis.md} +12 -3
- package/docs/reference/portability.md +92 -0
- package/docs/{portable-presentation.md → reference/portable-presentation.md} +2 -2
- package/docs/{presentation-consumer-boundaries.md → reference/presentation-consumer-boundaries.md} +5 -0
- package/docs/{project-options.md → reference/project-options.md} +17 -0
- package/docs/{repo-boundary-guard.md → reference/repo-boundary-guard.md} +50 -4
- package/docs/{review-portability.md → reference/review-portability.md} +4 -0
- package/docs/{semantic-operation.md → reference/semantic-operation.md} +4 -3
- package/docs/{template-profile.md → reference/template-profile.md} +1 -1
- package/docs/{trackables.md → reference/trackables.md} +2 -2
- package/docs/start/independent-start.md +89 -0
- package/docs/{install.md → start/install.md} +9 -9
- package/docs/{knowledge-setup.md → start/knowledge-setup.md} +5 -5
- package/docs/{research-starter-quickstart.md → start/research-starter-quickstart.md} +6 -6
- package/fixtures/atelier-architecture/catalog/invalid/document.json +2 -2
- package/fixtures/atelier-architecture/catalog/valid/document.json +2 -2
- package/fixtures/graph-view/synthetic-authorized-input.v1.json +437 -0
- package/fixtures/graph-view/synthetic-view.v1.json +1 -0
- package/fixtures/knowledge-health/workshop/README.md +1 -1
- package/fixtures/templates/local-library.v1.json +3 -1
- package/package.json +22 -8
- package/plugins/obsidian/main.js +57 -8
- package/plugins/obsidian/manifest.json +1 -1
- package/skills/claude/atelier-guided-upgrade/SKILL.md +1 -1
- package/skills/claude/atelier-knowledge-setup/SKILL.md +2 -2
- package/skills/claude/atelier-local-service/SKILL.md +1 -1
- package/skills/claude/atelier-practical-judgment/SKILL.md +7 -2
- package/skills/claude/atelier-skill-steward/SKILL.md +1 -1
- package/skills/claude/mnstry-readiness/SKILL.md +2 -2
- package/skills/codex/atelier-guided-upgrade/SKILL.md +1 -1
- package/skills/codex/atelier-knowledge-setup/SKILL.md +2 -2
- package/skills/codex/atelier-local-service/SKILL.md +1 -1
- package/skills/codex/atelier-practical-judgment/SKILL.md +7 -2
- package/skills/codex/atelier-skill-steward/SKILL.md +1 -1
- package/skills/codex/mnstry-readiness/SKILL.md +2 -2
- package/src/architecture/catalog.mjs +2 -2
- package/src/attestation/sign.mjs +1 -1
- package/src/boundary/content-rules.mjs +534 -68
- package/src/boundary/policy.mjs +187 -60
- package/src/cli/run.mjs +26 -9
- package/src/commands/distribution.mjs +1 -1
- package/src/commands/extension.mjs +27 -0
- package/src/commands/ingest.mjs +1 -1
- package/src/commands/learn.mjs +1 -1
- package/src/commands/obsidian.mjs +49 -21
- package/src/commands/review.mjs +3 -0
- package/src/edge-policy/contract.mjs +69 -0
- package/src/edge-policy/policy.mjs +142 -0
- package/src/edge-policy/source-citation-adapter.mjs +43 -0
- package/src/extension-packs/loader.mjs +4 -3
- package/src/extensions/admission.mjs +83 -0
- package/src/extensions/client.d.mts +23 -0
- package/src/extensions/client.mjs +99 -0
- package/src/extensions/contracts.d.mts +29 -0
- package/src/extensions/contracts.mjs +163 -0
- package/src/extensions/convex.d.mts +24 -0
- package/src/extensions/convex.mjs +189 -0
- package/src/extensions/delegation.mjs +54 -0
- package/src/extensions/drizzle.d.mts +11 -0
- package/src/extensions/drizzle.mjs +33 -0
- package/src/extensions/postgres.d.mts +7 -0
- package/src/extensions/postgres.mjs +66 -0
- package/src/extensions/prisma.d.mts +13 -0
- package/src/extensions/prisma.mjs +63 -0
- package/src/extensions/project.mjs +432 -0
- package/src/extensions/scaffold-convex.mjs +130 -0
- package/src/extensions/scaffold-sql.mjs +144 -0
- package/src/extensions/server.d.mts +20 -0
- package/src/extensions/server.mjs +102 -0
- package/src/extensions/sql-scope.mjs +22 -0
- package/src/graph/graph.mjs +13 -5
- package/src/graph/knowledge-graph.mjs +20 -2
- package/src/graph/repo-contribution.mjs +405 -0
- package/src/graph/repo-contribution.types.mjs +32 -0
- package/src/graph-access/edge-decision-adapter.mjs +41 -0
- package/src/graph-access/edge-record-adapter.mjs +73 -0
- package/src/graph-access/index.mjs +253 -0
- package/src/graph-access/multi-contribution-record-adapter.mjs +101 -0
- package/src/graph-access/multi-record-projection-adapter.mjs +74 -0
- package/src/graph-access/source-adapter.mjs +81 -0
- package/src/graph-refresh/compare.mjs +110 -0
- package/src/graph-refresh/controller.mjs +324 -0
- package/src/graph-refresh/index.mjs +3 -0
- package/src/graph-refresh/local.mjs +78 -0
- package/src/graph-view/babylon/babylon-scene-port.mjs +64 -0
- package/src/graph-view/babylon/index.mjs +2 -0
- package/src/graph-view/babylon/navigator.mjs +312 -0
- package/src/graph-view/babylon/provenance.mjs +36 -0
- package/src/graph-view/babylon/scene-controller.mjs +131 -0
- package/src/graph-view/babylon/semantic-picking.mjs +35 -0
- package/src/graph-view/babylon/web-host.mjs +188 -0
- package/src/graph-view/cli.mjs +3 -0
- package/src/graph-view/command.mjs +34 -0
- package/src/graph-view/contracts.mjs +79 -0
- package/src/graph-view/errors.mjs +5 -0
- package/src/graph-view/index.mjs +4 -0
- package/src/graph-view/intents.mjs +30 -0
- package/src/graph-view/query.mjs +213 -0
- package/src/graph-view/refs.mjs +2 -0
- package/src/graph-view/structured/browser.mjs +262 -0
- package/src/graph-view/structured/styles.mjs +8 -0
- package/src/graph-workspace/authoring.mjs +185 -0
- package/src/graph-workspace/browser/constellation.mjs +369 -0
- package/src/graph-workspace/browser/dom.mjs +23 -0
- package/src/graph-workspace/browser/index.mjs +6 -0
- package/src/graph-workspace/browser/review.mjs +55 -0
- package/src/graph-workspace/browser/styles.mjs +11 -0
- package/src/graph-workspace/browser/workbench.mjs +351 -0
- package/src/graph-workspace/browser/workspace.mjs +431 -0
- package/src/graph-workspace/disclosure.mjs +39 -0
- package/src/graph-workspace/geometry.mjs +78 -0
- package/src/graph-workspace/index.mjs +11 -0
- package/src/graph-workspace/labels.mjs +50 -0
- package/src/graph-workspace/model.mjs +109 -0
- package/src/graph-workspace/recipes.mjs +88 -0
- package/src/graph-workspace/scale.mjs +95 -0
- package/src/graph-workspace/theme.mjs +156 -0
- package/src/ingestion/optional/graphify/graphify_supplier.py +5 -0
- package/src/ingestion/optional/graphify/native-closure-pins.json +275 -0
- package/src/ingestion/optional/graphify/native-pins.json +306 -0
- package/src/knowledge/ontology-guide.mjs +152 -0
- package/src/knowledge-health/proof/installed-check.mjs +2 -2
- package/src/knowledge-health/rule-identity.mjs +14 -9
- package/src/knowledge-health/workshop.mjs +22 -2
- package/src/personal-workspace/index.mjs +1 -1
- package/src/personal-workspace/selection.mjs +34 -3
- package/src/project/config.mjs +1 -1
- package/src/project/path-match.mjs +2 -1
- package/src/project/providers/github.mjs +24 -0
- package/src/project/repo-identity.mjs +3 -22
- package/src/projection/obsidian/contracts.mjs +1 -1
- package/src/projection/obsidian/materialize/path-registry.mjs +1 -1
- package/src/projection/obsidian/materialize/prepare-view.mjs +88 -6
- package/src/projection/obsidian/materialize/redaction.mjs +1 -1
- package/src/projection/obsidian/personal-workspace.mjs +84 -5
- package/src/projection/obsidian/plugin-bridge/channel.mjs +1 -1
- package/src/projection/obsidian/proposals/adapter.mjs +46 -23
- package/src/projection/obsidian/proposals/observation.mjs +40 -2
- package/src/projection/obsidian/publication/publisher.mjs +96 -8
- package/src/projection/project.mjs +21 -16
- package/src/readiness/readiness.mjs +20 -11
- package/src/readiness-protocols/bundled-pack.mjs +14 -766
- package/src/readiness-protocols/bundled-selection.mjs +32 -0
- package/src/readiness-protocols/evidence.mjs +2 -1
- package/src/readiness-protocols/packs/mnstry.mjs +766 -0
- package/src/readiness-protocols/runtime.mjs +43 -6
- package/src/runtime/obsidian/engine.mjs +387 -76
- package/src/runtime/obsidian/lifecycle.mjs +20 -15
- package/src/runtime/obsidian/login-item.mjs +6 -3
- package/src/runtime/obsidian/machine-settings.mjs +52 -8
- package/src/runtime/obsidian/observation.mjs +36 -4
- package/src/runtime/obsidian/opening.mjs +4 -3
- package/src/runtime/obsidian/personal-selection.mjs +187 -0
- package/src/runtime/obsidian/pipeline.mjs +115 -6
- package/src/runtime/obsidian/private-lock.mjs +50 -6
- package/src/runtime/obsidian/selection-continuity.mjs +124 -0
- package/src/runtime/obsidian/service-main.mjs +68 -16
- package/src/runtime/obsidian/service.mjs +80 -6
- package/src/runtime/obsidian/unheld-evidence.mjs +1 -1
- package/src/runtime/obsidian/view-permission.mjs +335 -0
- package/src/ui/control-system.mjs +201 -0
- package/src/ui/html-primitives.mjs +3 -0
- package/src/upgrade/closure-diagnostics.mjs +135 -0
- package/src/upgrade/closure.mjs +649 -0
- package/src/upgrade/upgrade.mjs +42 -11
- package/templates/distribution-workspace/README.md +2 -2
- package/templates/external-project-workspace/atelier.project.json +3 -0
- package/templates/external-project-workspace/pack-lifecycle.json +3 -1
- package/templates/knowledge-workspace/README.md +2 -2
- package/docs/integration-and-review-plan.md +0 -409
- package/docs/integration-contract-decisions.md +0 -44
- package/docs/knowledge-health/devday/facilitator.md +0 -16
- package/docs/knowledge-health/devday/public-default.md +0 -107
- package/docs/knowledge-health/devday/quickstart.md +0 -18
- package/docs/knowledge-health/devday/support.md +0 -22
- package/docs/knowledge-health/exercise.md +0 -17
- package/docs/knowledge-health/support.md +0 -34
- package/docs/presentation-review-disposition.md +0 -47
- package/docs/progressive-ingestion-acceptance.md +0 -89
- package/docs/progressive-ingestion.md +0 -235
- /package/docs/{exact-upgrades.md → guides/exact-upgrades.md} +0 -0
- /package/docs/{guided-upgrades.md → guides/guided-upgrades.md} +0 -0
- /package/docs/{local-review.md → guides/local-review.md} +0 -0
- /package/docs/{skill-steward.md → guides/skill-steward.md} +0 -0
- /package/docs/{template-upgrades.md → guides/template-upgrades.md} +0 -0
- /package/docs/{assurance-controls.md → maintainers/assurance-controls.md} +0 -0
- /package/docs/{attestation.md → reference/attestation.md} +0 -0
- /package/docs/{coauthor-session.md → reference/coauthor-session.md} +0 -0
- /package/docs/{continuity.md → reference/continuity.md} +0 -0
- /package/docs/{contract-stability.md → reference/contract-stability.md} +0 -0
- /package/docs/{decision-practices.md → reference/decision-practices.md} +0 -0
- /package/docs/{evidence-navigation.md → reference/evidence-navigation.md} +0 -0
- /package/docs/{extension-pack-lifecycle.md → reference/extension-pack-lifecycle.md} +0 -0
- /package/docs/{interaction-and-reflection.md → reference/interaction-and-reflection.md} +0 -0
- /package/docs/{local-state.md → reference/local-state.md} +0 -0
- /package/docs/{ontology.md → reference/ontology.md} +0 -0
- /package/docs/{optional-ingestion.md → reference/optional-ingestion.md} +0 -0
- /package/docs/{project-command-inventory.md → reference/project-command-inventory.md} +0 -0
- /package/docs/{semantic-ingestion.md → reference/semantic-ingestion.md} +0 -0
- /package/docs/{vault-service.md → reference/vault-service.md} +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Co-authoring with agents
|
|
2
|
+
|
|
3
|
+
A body of work is authored together, in the structure of the work itself
|
|
4
|
+
rather than in a document tool or an email thread. People read and question
|
|
5
|
+
the pages. Agents draft from the graph and the questions. Where the checks
|
|
6
|
+
run in the commit path, every change, by a person or an agent, passes the
|
|
7
|
+
same checks, and that is what makes the agentic
|
|
8
|
+
process (an agent acting inside a governed workflow) reliable.
|
|
9
|
+
|
|
10
|
+
This page describes the loop, the record it leaves, and what has to be in
|
|
11
|
+
place for it to hold. The files are yours. The package supplies the graph,
|
|
12
|
+
the checks and the collaboration records. The harness supplies the agent.
|
|
13
|
+
Nothing here changes what the package will and will not do to a source:
|
|
14
|
+
README section 4, "The local runtime serves people and agents", states that,
|
|
15
|
+
and the will-not-do block states the rest.
|
|
16
|
+
|
|
17
|
+
## The loop
|
|
18
|
+
|
|
19
|
+
Three actors take part: a person, an agent running in the harness, and the
|
|
20
|
+
package. In this loop the package records, checks and refuses; the edit and
|
|
21
|
+
the commit are the agent's or the person's.
|
|
22
|
+
|
|
23
|
+
1. **A person asks on the page.** A reader selects the sentence they mean on
|
|
24
|
+
the projected page and leaves a question, a correction or a discussion. The
|
|
25
|
+
review surface (the package's optional `atelier dev --review`, or a
|
|
26
|
+
consumer adapter built on the collaboration ledger) records the note and
|
|
27
|
+
pins it to that passage and to the digest of that revision of the source.
|
|
28
|
+
2. **An agent drafts from the graph.** In the harness it reads the open
|
|
29
|
+
questions on the file, follows the graph to every file declared to depend
|
|
30
|
+
on it, and edits those files in the working tree. Where they are wired in,
|
|
31
|
+
the graph check and the boundary guard run against its work as they would
|
|
32
|
+
against anyone's.
|
|
33
|
+
3. **A person decides, and the change lands.** The person reviews the draft
|
|
34
|
+
and, where the workflow records decisions, records one with its rationale
|
|
35
|
+
through the consumer adapter or the team's workflow. The optional review
|
|
36
|
+
workspace records decisions on review-run claims, not decisions about a draft
|
|
37
|
+
change. The package does not require or check a decision before a commit. The
|
|
38
|
+
person or the agent commits the change through the boundary guard, and the
|
|
39
|
+
graph and the pages built from it follow on their next build.
|
|
40
|
+
|
|
41
|
+
The next question starts from the updated source.
|
|
42
|
+
|
|
43
|
+
## Provenance is built in
|
|
44
|
+
|
|
45
|
+
The review store pins notes and reading positions to a document's digest and
|
|
46
|
+
the passage they address, and binds decisions to the evidence they judged.
|
|
47
|
+
A contribution made against a stale version is refused. A later decision
|
|
48
|
+
supersedes an earlier one, and the history keeps both. Each record carries the
|
|
49
|
+
name its author gives, which the package records as locally asserted, not
|
|
50
|
+
authenticated. `docs/guides/local-review.md` describes the store and its refusals. When the source changes, earlier notes stay pinned to
|
|
51
|
+
the wording they addressed, so "what has been questioned about this passage"
|
|
52
|
+
is a lookup, not a memory.
|
|
53
|
+
|
|
54
|
+
A change by an agent passes the same checks as a change by a person: the graph
|
|
55
|
+
check and the boundary guard, where they are wired in. A team that wants every
|
|
56
|
+
change to carry a recorded decision adds that rule to its own workflow; the
|
|
57
|
+
package does not enforce it.
|
|
58
|
+
|
|
59
|
+
## Giving an agent a job
|
|
60
|
+
|
|
61
|
+
This section describes the system (the package with a harness and connected
|
|
62
|
+
tools), not the package alone.
|
|
63
|
+
|
|
64
|
+
You define the outcome and constraints. An agent uses the relevant files,
|
|
65
|
+
works through the task with connected tools and returns work to review.
|
|
66
|
+
Approved changes become part of the shared record for the next task. The
|
|
67
|
+
agent's instructions (its skill and the harness's permissions, not a package
|
|
68
|
+
gate) specify which records it may use, what it may change and when approval
|
|
69
|
+
is required.
|
|
70
|
+
|
|
71
|
+
The team defines a goal and reviews a proposed plan before the agent starts,
|
|
72
|
+
then reviews the outputs and approves consequential actions. Accepted changes
|
|
73
|
+
update the shared knowledge, so the next task starts from the latest agreed
|
|
74
|
+
material rather than from a fresh briefing.
|
|
75
|
+
|
|
76
|
+
What has to be connected: the agent, access to the relevant files, and
|
|
77
|
+
whatever other tools the chosen workflow uses,
|
|
78
|
+
plus agreed review responsibilities and action permissions. The package
|
|
79
|
+
organizes source material and review contributions; agent execution and
|
|
80
|
+
external delivery are integrations you configure in the harness.
|
|
81
|
+
|
|
82
|
+
## What the loop rests on
|
|
83
|
+
|
|
84
|
+
- **A harness with the skills installed.** `atelier skills sync` installs the
|
|
85
|
+
package's skill files into the workspace from a digest-confirmed plan (by
|
|
86
|
+
default from the package's `skills/codex` into `.agents/skills`; `--source`
|
|
87
|
+
and `--target` change that). Whether a harness discovers and follows them
|
|
88
|
+
is the harness's matter. See `docs/guides/skill-steward.md`.
|
|
89
|
+
- **Gates in the commit path.** The boundary guard hooks
|
|
90
|
+
(`atelier boundary install-hooks`) and the graph check in CI. The sentence
|
|
91
|
+
"every change passes the same checks" is true where the checks run on every
|
|
92
|
+
commit.
|
|
93
|
+
- **A contribution surface.** The package's loopback projection carries the
|
|
94
|
+
page and its passages. Its optional review workspace (`atelier dev --review`,
|
|
95
|
+
described in `docs/guides/local-review.md`) records passage notes and decisions
|
|
96
|
+
on review-run claims. A consumer adapter built on the collaboration ledger
|
|
97
|
+
or the team's workflow records decisions about a draft change;
|
|
98
|
+
`docs/reference/coauthor-session.md` describes the experimental portable
|
|
99
|
+
session reducer. These records do not apply a source change; the agent in
|
|
100
|
+
the harness does, and the checks run against it.
|
|
101
|
+
- **Examples with expected results.** By convention, each round of authoring
|
|
102
|
+
adds reviewed examples with expected results beside the rules they test. The
|
|
103
|
+
package keeps them and their links in the graph; it does not run them. An
|
|
104
|
+
agent in the harness runs them against its drafts, and because they stay in
|
|
105
|
+
the record, a later draft can be checked against the same cases.
|
|
106
|
+
|
|
107
|
+
## What the package does not do here
|
|
108
|
+
|
|
109
|
+
It does not draft. It does not apply a proposal to a source. It does not
|
|
110
|
+
grant an agent write access. It does not decide. It records the question,
|
|
111
|
+
checks the change, and records a decision when one is given, and it refuses
|
|
112
|
+
a contribution made against a stale version. The rest is the harness's work
|
|
113
|
+
and the people's.
|
|
@@ -39,7 +39,7 @@ changes what a root command means is a fork, not a distribution.
|
|
|
39
39
|
Distributions must carry MNSTRY attribution. The normative wording of this
|
|
40
40
|
requirement lives in `TRADEMARKS.md` under "Required attribution" — this
|
|
41
41
|
document deliberately does not restate it, so the two cannot drift. See also
|
|
42
|
-
`docs/attestation.md` for how admission decisions are recorded.
|
|
42
|
+
`docs/reference/attestation.md` for how admission decisions are recorded.
|
|
43
43
|
|
|
44
44
|
Three related obligations live alongside it:
|
|
45
45
|
|
|
@@ -149,8 +149,10 @@ Workspace projections read
|
|
|
149
149
|
}
|
|
150
150
|
```
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
When the bundled readiness pack is selected, the rendered projection keeps the
|
|
153
|
+
"MNSTRY Tenant Readiness" heading: it names that pack. An explicit
|
|
154
|
+
`readiness.includeBundled: false` in the project's `ext["mnstry.atelier"]` omits
|
|
155
|
+
the section; absent or `true` retains the existing default.
|
|
154
156
|
|
|
155
157
|
### 5. Add an extension pack
|
|
156
158
|
|
|
@@ -165,10 +167,13 @@ The manifest carries the advisory attribution key:
|
|
|
165
167
|
}
|
|
166
168
|
```
|
|
167
169
|
|
|
168
|
-
Extension protocols load alongside the bundled twelve
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
Extension protocols load alongside the bundled twelve by default. A project
|
|
171
|
+
can [deselect the bundle](tenant-readiness.md#select-the-readiness-pack) and use
|
|
172
|
+
only its selected custom protocols; this does not create a replacement tenant
|
|
173
|
+
journey or packet. When the bundle is selected, pack contributions to the tenant
|
|
174
|
+
readiness packet ride in an unschema'd runtime document
|
|
175
|
+
(`mnstry.tenant-readiness-packet@v1`) whose shape is pinned by tests, not by the
|
|
176
|
+
versioned contracts the compat gate checks.
|
|
172
177
|
|
|
173
178
|
Declared pack paths resolve from the directory holding `atelier.project.json`
|
|
174
179
|
and may not contain `..` segments, so the pack directory has to sit inside the
|
|
@@ -216,5 +221,5 @@ a stylistic preference.
|
|
|
216
221
|
|
|
217
222
|
A distribution changes branding, not authority. Admission of any payload into
|
|
218
223
|
a MNSTRY destination is decided and recorded exactly as for the root package —
|
|
219
|
-
see `docs/attestation.md` for the admission model and how attestations record
|
|
224
|
+
see `docs/reference/attestation.md` for the admission model and how attestations record
|
|
220
225
|
those decisions.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Custom database extensions
|
|
2
|
+
|
|
3
|
+
Use `atelier extension init --directory ./custom-extension --id sample.counter`
|
|
4
|
+
to generate a TypeScript Postgres backend. The destination must not exist.
|
|
5
|
+
The command writes files only. It creates no database, starts no process and
|
|
6
|
+
grants no access. Apply the emitted migration to a customer-owned PostgreSQL 17
|
|
7
|
+
database with a separate migration role; keep the application login restricted.
|
|
8
|
+
|
|
9
|
+
The generated backend is a host adapter. Its host supplies the database client,
|
|
10
|
+
verified root public keys, pinned installation/release and an admission origin.
|
|
11
|
+
The server authenticates a short-lived invocation and obtains durable root
|
|
12
|
+
admission before creating its in-process effect scope. The Postgres helper
|
|
13
|
+
keeps a native transaction API and atomically commits custom writes with their
|
|
14
|
+
operation receipts. Credentials and application data stay in the customer backend.
|
|
15
|
+
|
|
16
|
+
Import portable wire types from `@mnstry/atelier/extensions`, member/admin clients
|
|
17
|
+
from `/extensions/client`, and backend helpers from `/extensions/server` and
|
|
18
|
+
`/extensions/postgres`. Browser clients never import database drivers or server keys.
|
|
19
|
+
The Postgres driver is installed in the generated project, not in Atelier.
|
|
20
|
+
|
|
21
|
+
Studio installation and member permission are separate. An authenticated host
|
|
22
|
+
owns membership, consent and product access. The manifest declares requested
|
|
23
|
+
capabilities; it grants none. Root-bound results use a separate authorized action.
|
|
24
|
+
The generated `atelier.extension-pack.json` reuses Atelier's canonical pack identity,
|
|
25
|
+
loader and lock adoption. Its namespaced `runtimeManifest` field pins this component's
|
|
26
|
+
manifest file and release digest. The runtime manifest describes the backend protocol;
|
|
27
|
+
it does not create another pack identity. Declare the emitted pack in your existing
|
|
28
|
+
project and adopt it with the normal validation/lock workflow. Pack loading remains
|
|
29
|
+
non-executing and grants no backend or root authority. Standalone hosts can consume
|
|
30
|
+
the portable SDK without an Atelier project.
|
|
31
|
+
|
|
32
|
+
Use `extension validate --directory ...` to check source/schema/release digests.
|
|
33
|
+
After reviewing an edit, use `extension seal --directory ...` to update them.
|
|
34
|
+
A valid seal identifies bytes; it proves neither publisher trust nor deployment.
|
|
35
|
+
Keep the package lockfile after installation. Lost write replies require explicit
|
|
36
|
+
lookup/recovery; neither client silently retries or refreshes a generation.
|
|
37
|
+
|
|
38
|
+
Scaffold profiles include postgres-sql, drizzle-db-first, drizzle-code-first,
|
|
39
|
+
prisma-7-postgres and convex-native. Drizzle retains its native query builder and transaction API;
|
|
40
|
+
Prisma retains its native generated client and pg adapter. Convex uses the native
|
|
41
|
+
starter described below. Prisma 8 remains an unqualified separate experiment. Scaffolding, synthetic
|
|
42
|
+
protocol tests, real provider tests, actual supported hosts, public release and
|
|
43
|
+
customer acceptance carry separate evidence. Private runtime bindings are not
|
|
44
|
+
distributed in this package.
|
|
45
|
+
|
|
46
|
+
The runtime parser is required after JSON Schema validation: it enforces unique IDs and cross-references, recovery scope/effect, current-schema readability, Unicode and total JSON bounds. Native Postgres operation results are capped at 60 KiB inside the transaction, leaving room for the original-operation recovery proof within the 64 KiB action output bound. Every failure after successful admission remains an uncertain operation; inspect its durable receipt before deciding what to do next.
|
|
47
|
+
|
|
48
|
+
The candidate SDK version 0.2.0-alpha.15 is unpublished. Before its release,
|
|
49
|
+
pack the reviewed Atelier checkout with `npm pack --ignore-scripts` and install
|
|
50
|
+
the resulting local tarball in the generated project with
|
|
51
|
+
`npm install /absolute/path/to/mnstry-atelier-0.2.0-alpha.15.tgz`. Then run
|
|
52
|
+
`npm run typecheck` and reseal the reviewed project. Do not expect the unpublished
|
|
53
|
+
version to install from the public registry. String length limits use Unicode
|
|
54
|
+
code points, matching JSON Schema; ill-formed surrogate sequences remain refused.
|
|
55
|
+
|
|
56
|
+
The source seal covers package.json, tsconfig.json, src/, present npm lockfiles,
|
|
57
|
+
and present Drizzle/Prisma configuration and Prisma schema files. Installing or
|
|
58
|
+
changing a lockfile requires an explicit reseal. It does not cover an arbitrary
|
|
59
|
+
external host or deployed image. Schema bytes cover schemas/ and migrations/.
|
|
60
|
+
Each source file is limited to 1 MiB; each canonical digest map is limited to
|
|
61
|
+
128 KiB. Deterministic invalid pack state refuses before rewriting the manifest.
|
|
62
|
+
The manifest and pack remain separate files: an interruption between their writes
|
|
63
|
+
is detected as stale by validation and requires an explicit reseal.
|
|
64
|
+
|
|
65
|
+
Choose a profile with `atelier extension init --profile drizzle-db-first` (or
|
|
66
|
+
`drizzle-code-first`, `prisma-7-postgres`). DB-first uses native `drizzle-kit pull`
|
|
67
|
+
restricted to extension_data, then normalizes the generated local relation import
|
|
68
|
+
for Node ESM. Review and retain the generated schema before resealing. Code-first
|
|
69
|
+
uses native generation: review and apply its SQL before the explicit forced-RLS
|
|
70
|
+
governance migration. Export the schema declaration so generation creates it.
|
|
71
|
+
Prisma 7 uses native client generation and the explicit application DSN supplied
|
|
72
|
+
by the customer host; the reviewed SQL still installs RLS. Generator output is
|
|
73
|
+
a proposed source change, never permission to mutate a shared or Root database.
|
|
74
|
+
Optional provider dependencies are installed in the generated app, never Atelier.
|
|
75
|
+
|
|
76
|
+
Custom native configuration, schema and migration locations must be listed in the
|
|
77
|
+
generated package.json `files` array as literal project-relative files or directories.
|
|
78
|
+
This reuses the project's native package input list; it adds no second project catalog
|
|
79
|
+
and never executes a TypeScript config during sealing. The list itself is sealed.
|
|
80
|
+
Conventional generated paths and present npm locks are included automatically.
|
|
81
|
+
Globs, parent paths, dependency directories, hidden paths except Git ignore/attribute files, and self-referential
|
|
82
|
+
manifest/pack inputs refuse. The seal identifies these declared inputs; it does not
|
|
83
|
+
claim an arbitrary external host, build artifact or dependency outside the project.
|
|
84
|
+
|
|
85
|
+
Prisma interactive transactions use a 12-second transaction timeout and a 10-second
|
|
86
|
+
SQL statement timeout. A manifest may allow up to 30 seconds, but the native
|
|
87
|
+
transaction can roll back sooner and the handler then reports operation unknown.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
After reviewing and sealing a project, `atelier extension bundle --directory
|
|
91
|
+
./custom-extension --json` writes its registration bundle to stdout. It contains
|
|
92
|
+
the pinned manifest, exact schema strings and migration hashes. It uses the same
|
|
93
|
+
file checks as sealing and refuses stale inputs. It creates no account, database,
|
|
94
|
+
process or installation and applies no migration.
|
|
95
|
+
|
|
96
|
+
Pass this bundle to `createExtensionAdminClient(transport).registerRelease(bundle)`
|
|
97
|
+
through the consuming host's authenticated transport, then configure the returned
|
|
98
|
+
release using the existing connection and lifecycle methods. The receiving host
|
|
99
|
+
must independently verify every release and file digest and apply its publisher
|
|
100
|
+
policy. A registration receipt is separate from health, enablement and consent.
|
|
101
|
+
An older host without registration refuses with `unavailable`; clients do not
|
|
102
|
+
silently enable or repeat the operation.
|
|
103
|
+
|
|
104
|
+
A generic counter response is custom application data. A host's result-recording
|
|
105
|
+
contract can require a different schema and narrower bounds. Author that result
|
|
106
|
+
explicitly, update its action output schema, review and reseal it, and request the
|
|
107
|
+
host's separate permission before recording it. Declaring a root-write permission
|
|
108
|
+
alone does not make an arbitrary action result compatible.
|
|
109
|
+
|
|
110
|
+
## Native Convex starter
|
|
111
|
+
|
|
112
|
+
Use `atelier extension init --profile convex-native --directory ./custom-extension`
|
|
113
|
+
for a TypeScript project pinned to Convex 1.46.0. This optional adapter uses native
|
|
114
|
+
Convex schema/functions, indexes and OCC transactions. It installs no SQL driver
|
|
115
|
+
and adds no Convex dependency to Atelier itself. Import native backend helpers
|
|
116
|
+
from `@mnstry/atelier/extensions/convex`; browser clients use the same portable
|
|
117
|
+
`/extensions/client` interface as the SQL profiles.
|
|
118
|
+
|
|
119
|
+
The HTTP action verifies the original Root delegation and consumes admission
|
|
120
|
+
once. It then passes that token and the canonical payload to an **internal
|
|
121
|
+
mutation**, which verifies them again. A serialized scope or an `admitted`
|
|
122
|
+
boolean is not authority. Native writes and the indexed operation result commit
|
|
123
|
+
in one mutation. Output validators refuse invalid values and preserve canonical
|
|
124
|
+
result bytes, so response and durable lookup cannot diverge. Root callbacks and provider commits remain separate. A lost
|
|
125
|
+
reply requires a new admitted lookup operation, without repeating the write.
|
|
126
|
+
No ordinary public mutation/query exposes the generated member tables. `GET /health`
|
|
127
|
+
reports only the immutable release/schema health envelope after native index checks.
|
|
128
|
+
|
|
129
|
+
The customer owns its Convex project and deployment. Set the public verification
|
|
130
|
+
keys, issuer, exact invocation audience, opaque installation reference and Root
|
|
131
|
+
admission origin in that deployment. Keep admin keys and member identities out
|
|
132
|
+
of the browser and runtime request. HTTPS is required by default. The explicit
|
|
133
|
+
local test option additionally requires both provider deployment URLs to be
|
|
134
|
+
literal loopback addresses; Convex can set `NODE_ENV` to production even locally.
|
|
135
|
+
|
|
136
|
+
The versioned native schema is `migrations/001-schema.ts`; `convex/schema.ts`
|
|
137
|
+
re-exports it. The existing schema digest binds those migration bytes. Native
|
|
138
|
+
source and generated code are sealed as bundle inputs. Generate provider code,
|
|
139
|
+
strictly typecheck, seal, validate and export the bundle; validate again after
|
|
140
|
+
deployment. Any changed generated input requires resealing and requalification.
|
|
141
|
+
Atelier's CLI performs no provider login, process startup or deployment.
|
|
142
|
+
|
|
143
|
+
The sample supports scoped set/get/export/delete and durable lookup. Deletion
|
|
144
|
+
atomically clears live sample rows and older operation results for up to 500
|
|
145
|
+
operations; larger histories refuse and need an explicit paginated erasure design.
|
|
146
|
+
Backups remain subject to the operator's retention policy. In-flight admitted
|
|
147
|
+
mutations may finish after disable. Public reactive feeds, revocation on feed
|
|
148
|
+
reconnect, schema backfills, portability and complete host/privacy acceptance
|
|
149
|
+
remain unqualified. The native starter's provider proof does not enable a
|
|
150
|
+
receiving host's Convex profile or establish a complete customer journey.
|
|
151
|
+
|
|
152
|
+
## Readiness extension packs
|
|
153
|
+
|
|
154
|
+
Local readiness protocols use the existing extension-pack declarations in
|
|
155
|
+
`atelier.project.json`. They are separate from database runtime adapters. A
|
|
156
|
+
project can select custom protocols without the bundled MNSTRY readiness pack:
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"ext": {
|
|
161
|
+
"mnstry.atelier": {
|
|
162
|
+
"readiness": { "includeBundled": false },
|
|
163
|
+
"extensionPacks": [
|
|
164
|
+
{
|
|
165
|
+
"id": "sample.readiness",
|
|
166
|
+
"version": "v1",
|
|
167
|
+
"path": "packs/sample-pack.v1.json",
|
|
168
|
+
"enabled": true
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Review the pack, then run `atelier extension-pack validate` and
|
|
177
|
+
`atelier lock write`, both with `--project ./atelier.project.json`.
|
|
178
|
+
Use `atelier readiness protocols --project ./atelier.project.json` to list the
|
|
179
|
+
selected protocols, then pass a full namespaced ID to `atelier readiness run`
|
|
180
|
+
or `atelier review run` with the same project. Evidence-bound review still
|
|
181
|
+
requires the existing [pack compatibility declaration](../reference/extension-pack-lifecycle.md).
|
|
182
|
+
Existing answer, proposal and evidence rules continue to apply.
|
|
183
|
+
|
|
184
|
+
Omitting `readiness.includeBundled` or setting it to `true` keeps custom
|
|
185
|
+
protocols alongside the bundle. With `false`, bundled IDs and aliases are
|
|
186
|
+
unavailable to project runs. A standalone `readiness protocols` invocation
|
|
187
|
+
without a project selection still lists the bundle. Generic graph, project and
|
|
188
|
+
readiness checks remain available; the MNSTRY journey, packet and readiness
|
|
189
|
+
export commands refuse. See [pack selection and lock transitions](tenant-readiness.md#select-the-readiness-pack).
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Graph projection refresh
|
|
2
|
+
|
|
3
|
+
This is an experimental host integration module in `src/graph-refresh/`. It is
|
|
4
|
+
not enabled by `atelier dev --knowledge`, and has no published package export.
|
|
5
|
+
It adds no listener, daemon, graph database, identity or grant authority. A host
|
|
6
|
+
attaches its start and stop to the existing sidecar lifecycle. The first proof
|
|
7
|
+
uses invented graph-view fixtures; authenticated host receiving is separate.
|
|
8
|
+
|
|
9
|
+
The Git source, canonical graph builder and knowledge plan still own source
|
|
10
|
+
identity and semantics. Refresh consumes complete authorized projections. It
|
|
11
|
+
does not extract a second graph, accept a relation, change a plan or apply a
|
|
12
|
+
proposal. The existing graph file cache supplies incremental source reuse.
|
|
13
|
+
|
|
14
|
+
## Lifecycle ports
|
|
15
|
+
|
|
16
|
+
`createGraphRefresh` takes these host functions:
|
|
17
|
+
|
|
18
|
+
| Port | Contract |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| `build({generation,binding,signal})` | Return one complete authorized graph-view projection. Compute in isolation, honor cancellation, and bound execution. Do not write a current output from inside the builder. |
|
|
21
|
+
| `validate(projection)` | Return exactly `true` only for a supported, complete projection with a verified digest. Use the projection owner's validator. It may be asynchronous. |
|
|
22
|
+
| `revalidate(binding,projection)` | Return exactly `true` only while this host-issued binding and every requested historical or current projection are still readable. `projection` is null before the build. Errors and other values refuse. It may be asynchronous. |
|
|
23
|
+
| `stage({projection,generation,signal})` | Optional preparation of a complete host output, isolated from readers. Return `{commit,discard}`. It may be asynchronous. The default uses only the controller's in-memory pointer. |
|
|
24
|
+
| `commit()` | Synchronously and atomically replace the host's current output. Never queue an asynchronous current write. A promise result is unsupported and refuses controller publication. |
|
|
25
|
+
| `discard()` | Idempotently remove only this uncommitted staging output. It may be asynchronous. Failure retains cleanup custody even after supersession, access loss or stop. |
|
|
26
|
+
| `clear()` | Synchronously clear host reader caches, inspectors, selections, search results and renderer resources. A failure or promise result blocks accepting a replacement binding. |
|
|
27
|
+
| `onCleanup(outcome)` | Optional trusted host notification `{cleanupId,state,code}` for resolved or failed staging cleanup. It carries no source, path, binding or raw exception and is never a reader event. |
|
|
28
|
+
|
|
29
|
+
`setAccess({key,expiresAtMs,...privateHostState})` accepts a trusted host binding.
|
|
30
|
+
The key binds principal, exact authorized repositories, grant revision and
|
|
31
|
+
expiry, policy and request filter. This is a cache and lifecycle key, not proof
|
|
32
|
+
of a grant. Keep any instance-issued capability object in private host state;
|
|
33
|
+
do not clone that capability or reconstruct it from browser JSON. Each access
|
|
34
|
+
replacement first purges prior history, projection and selection. A host access
|
|
35
|
+
adapter must revalidate the actual capability, not just compare the key.
|
|
36
|
+
|
|
37
|
+
`start()` starts a pending build only when a binding is present. `invalidate()`
|
|
38
|
+
immediately marks an existing view stale, aborts a superseded build and requests
|
|
39
|
+
a replacement. Bursts share a fixed coalescing window, default 40 ms. Only one
|
|
40
|
+
build and staging operation runs at a time. An abort-ignoring builder must
|
|
41
|
+
settle before its successor can compute; its late result cannot publish.
|
|
42
|
+
|
|
43
|
+
Every awaited build, validation, access check and staging step is followed by a
|
|
44
|
+
generation fence. A final current access check and fence precede synchronous
|
|
45
|
+
commit and pointer replacement without an intervening await. Partial builds,
|
|
46
|
+
failed saves and obsolete generations never become the controller's current
|
|
47
|
+
view. A conforming staging adapter is required for equivalent disk behavior.
|
|
48
|
+
|
|
49
|
+
Cleanup custody is separate from publication and reader eligibility.
|
|
50
|
+
`cleanupStatus()` returns sanitized host-only records with a `cleanupId` and
|
|
51
|
+
`cleaning` or `failed` state. A failed discard retains its transaction handle;
|
|
52
|
+
new builds and staging stop until the host resolves it with
|
|
53
|
+
`await retryCleanup(cleanupId)`. Concurrent retries share the complete operation
|
|
54
|
+
and its result, including a rejection. A failed attempt requires a separate host
|
|
55
|
+
call to retry; a waiting caller never starts another attempt automatically.
|
|
56
|
+
Success releases the handle and requests a fresh build if the host is running
|
|
57
|
+
with current access. Rejection remains retained and notifies the host again.
|
|
58
|
+
This bounds unresolved custody to one transaction without a retry daemon.
|
|
59
|
+
|
|
60
|
+
The host must consume these operational outcomes and keep the controller until
|
|
61
|
+
cleanup is resolved. Never serialize cleanup records into a reader response.
|
|
62
|
+
Grant loss still purges private reader state immediately; resource custody does
|
|
63
|
+
not authorize any old view delivery. `stop()` retains unresolved cleanup, and
|
|
64
|
+
`await flush()` settles an already in-flight operation even after stop. Process
|
|
65
|
+
restart recovery belongs to the staging adapter's existing resource journal;
|
|
66
|
+
this controller does not add a persistent store or trust a saved projection.
|
|
67
|
+
|
|
68
|
+
`read(digest?)` revalidates before returning a detached copy. A previous view is
|
|
69
|
+
returned with `stale:true` after a source edit or failure, and `historical:true`
|
|
70
|
+
when it is no longer the published snapshot. History is in memory, bounded to
|
|
71
|
+
three previous digests by default, and available only under the same still-valid
|
|
72
|
+
binding. A missing digest returns no projection. It does not fall back to a
|
|
73
|
+
different snapshot. Restart requires fresh host access and a successful rebuild;
|
|
74
|
+
there is no automatic trust of saved projections.
|
|
75
|
+
|
|
76
|
+
`select(ref,digest)` accepts a current qualified `{repoId,localId}` only against
|
|
77
|
+
the exact published digest. `compare(beforeDigest,afterDigest)` revalidates both
|
|
78
|
+
retained snapshots and fences access changes before returning their comparison.
|
|
79
|
+
|
|
80
|
+
## Revocation and UI receiving
|
|
81
|
+
|
|
82
|
+
On a grant or policy notification the host first retires its access capability,
|
|
83
|
+
then calls `invalidateAccess()`. This synchronously aborts work and drops the
|
|
84
|
+
current projection, all history, selection and host caches. Expiry and a refused
|
|
85
|
+
read or build check do the same. They cannot wait for a replacement build. Each
|
|
86
|
+
read still checks access, covering a missed notification before another delivery.
|
|
87
|
+
The controller cannot detect remote revocation without its host's notification
|
|
88
|
+
or revalidation; this module does not establish an authenticated access host.
|
|
89
|
+
|
|
90
|
+
Subscribe with `subscribe(listener)` and dispose with its returned unsubscribe
|
|
91
|
+
function. Events contain only `{type,phase,generation,stale,failure}`. On `clear`,
|
|
92
|
+
the UI must immediately dispose its graph, inspector, selection, query caches
|
|
93
|
+
and pending render work, including all WebGL resources that retain private
|
|
94
|
+
labels or topology. A previous browser copy cannot be recalled by clearing the
|
|
95
|
+
controller alone. Conforming hosts must connect this event and `clear` to their
|
|
96
|
+
own state and verify the visible result. Do not keep the old graph on screen
|
|
97
|
+
while fetching a narrower replacement. Old refs and diagnostics are absent
|
|
98
|
+
from clear events. A listener failure does not prevent other listeners running.
|
|
99
|
+
|
|
100
|
+
| Phase | Meaning |
|
|
101
|
+
| --- | --- |
|
|
102
|
+
| `stopped` | No delivery; snapshots and selections cleared. |
|
|
103
|
+
| `denied` | No current host binding or access refused/expired; no delivery. |
|
|
104
|
+
| `pending` | Authorized first build requested. |
|
|
105
|
+
| `building` | Build or staging in progress; an existing view is explicitly stale. |
|
|
106
|
+
| `stale` | Source change invalidated the published generation. |
|
|
107
|
+
| `current` | Latest complete generation passed validation and access checks. |
|
|
108
|
+
| `failed` | Build, save or staging cleanup failed. An authorized old view may remain stale. |
|
|
109
|
+
| `unsupported` | Host validator refused the projection. An authorized old view may remain stale. |
|
|
110
|
+
|
|
111
|
+
Failures expose generic codes, never arbitrary build exceptions or source paths.
|
|
112
|
+
The host can keep source-level details in an independently authorized diagnostic
|
|
113
|
+
channel. `flush()` awaits pending work for a drill or on-demand build; it is not
|
|
114
|
+
a background completion promise. `stop()` purges immediately and fences late
|
|
115
|
+
results. The host must also await its own resource cleanup where required.
|
|
116
|
+
|
|
117
|
+
## Local watcher binding
|
|
118
|
+
|
|
119
|
+
`createLocalGraphRefresh({roots,...ports})` reuses Atelier's existing filesystem
|
|
120
|
+
watcher factory. Roots are trusted host inputs for the exact current permitted
|
|
121
|
+
repository set. It does not discover, clone or authorize repositories. Start it
|
|
122
|
+
with the existing sidecar, and call `stop()` from that sidecar's close path.
|
|
123
|
+
On a replacement access decision, pass the new permitted roots explicitly as
|
|
124
|
+
`setAccess(binding,roots)`. Old watchers close on clear; delayed events from a
|
|
125
|
+
retired watcher cannot invalidate the replacement reader's projection.
|
|
126
|
+
|
|
127
|
+
Watch events are hints. A periodic rebuild, default every 30 seconds, reconciles
|
|
128
|
+
dropped events using the canonical builder and file cache. It does not interrupt
|
|
129
|
+
an in-flight build. `status().watchState` is `watching`, `unavailable` or `stopped`;
|
|
130
|
+
failure to watch remains visible while periodic reconciliation can continue.
|
|
131
|
+
Neither watcher nor reconciliation timer keeps a second process alive.
|
|
132
|
+
|
|
133
|
+
## Snapshot comparison
|
|
134
|
+
|
|
135
|
+
`compareGraphSnapshots(before,after)` is a pure derived comparison. Trusted callers
|
|
136
|
+
must revalidate both snapshots first; controller `compare` performs that check.
|
|
137
|
+
The pure function refuses incompatible schemas, different access contexts or
|
|
138
|
+
filters, duplicate qualified refs and dangling references. It does not turn
|
|
139
|
+
matching access metadata into authentication.
|
|
140
|
+
|
|
141
|
+
Nodes compare by qualified ref, sources by repository and path with all exact
|
|
142
|
+
pins retained, edges by edge id, and questions by question id. A rename does not
|
|
143
|
+
merge identities. Assertions sharing a semantic triple retain separate edge ids.
|
|
144
|
+
Changed bytes, revision, locator, edge support or question state are included.
|
|
145
|
+
Possible question impact conservatively follows permitted edges in either
|
|
146
|
+
direction within the supplied slice. It is explicitly possible impact, not
|
|
147
|
+
proof of a semantic dependency or completeness outside that slice. No model,
|
|
148
|
+
provider, source write or accepted history mutation occurs.
|
|
149
|
+
|
|
150
|
+
Run `node --test test/graph-refresh-*.test.mjs` for the synthetic lifecycle,
|
|
151
|
+
comparison and real local file-edit/restart drills. These checks do not qualify
|
|
152
|
+
the held sidecar integration, a real recipient access host, or a browser renderer.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Graph workspace
|
|
2
|
+
|
|
3
|
+
A graph workspace lets a person explore a whole knowledge graph, then shape its concepts one step at a time. It is built in three layers, and the last one belongs to the owner:
|
|
4
|
+
|
|
5
|
+
1. **Atelier** ships primitives and defaults: the read model, scale and layout helpers, label placement, recipes, themes, authoring and the browser rooms.
|
|
6
|
+
2. **A coach** builds tooling for a cohort from those pieces: their own recipes, a theme, perhaps a different shell around the same rooms.
|
|
7
|
+
3. **The owner** shapes their own system from everything they receive: hiding what they do not use, renaming, adding their own recipes and appearance.
|
|
8
|
+
|
|
9
|
+
Nothing in a layer is hard-coded into the one below it. Recipes and themes are data that compose by name, and every resolved recipe field records which layer set it.
|
|
10
|
+
|
|
11
|
+
## One graph, three rooms
|
|
12
|
+
|
|
13
|
+
- **Constellation.** Every readable record, alive on a night-sky canvas (the default), with soft glows for the owner's folders and folder names at a distance. Names fade in by importance as you zoom in and never overlap each other or the controls. Hovering lights a neighbourhood; clicking selects without moving the map. "Let it move" turns on live physics.
|
|
14
|
+
- **Workbench.** A sparse set of rich cards (incoming on the left, outgoing on the right) beside a focused authoring sheet. One subject at a time, one step at a time, with deferral and structural guidance. Drafts belong to one workspace identity (and reader scope, where the host has one), so two workspaces never see each other's drafts. Without an identity they live in this tab only. With `profile.id` or `draftIdentity` they persist in this browser, and with a host storage port they persist there. The interface says which.
|
|
15
|
+
- **Review.** Before and proposed, the state of the evidence, and that a person decides. Nothing is sent.
|
|
16
|
+
|
|
17
|
+
A work **recipe** picks the room, the lens and the single primary action. Lenses (`question`, `concept`, `zone`) belong to the constellation, subjects (`record`, `concept`, `relation`) to the workbench, and the review room takes neither. The primary action is one of `search`, `open-evidence`, `next-step`, `walk`, `review` or `pick`, and only one the recipe's room can carry out (`primaryActionsFor`). Combinations the shell cannot honour are refused when recipes are composed, and recipes the workspace cannot run (a relation recipe with no relations, say) are not offered. Defaults: *Explore*, *Answer a question*, *Refine a concept*, *Inspect a record*. A command bar (⌘K or `/`) replaces persistent navigation. Text view lists every record, and without WebGL every task remains available through Text view and the workbench.
|
|
18
|
+
|
|
19
|
+
## Honesty rules the primitives keep
|
|
20
|
+
|
|
21
|
+
- Zones come only from the owner's folder structure. No computed clusters are drawn.
|
|
22
|
+
- A record belongs to a concept only when the record carries the concept's tag itself. Text matches are offered as suggestions labelled "not members".
|
|
23
|
+
- Edge direction is preserved. Edges fall into three classes: written links, folder containment and declared relations. Only declared relations are drawn with arrows and emphasis.
|
|
24
|
+
- Links to records outside the readable set are counted, never drawn.
|
|
25
|
+
- "Ready for human review" means complete and grounded in readable records. It is not a verdict on truth.
|
|
26
|
+
|
|
27
|
+
## Scale
|
|
28
|
+
|
|
29
|
+
`planConstellation()` decides whether to draw every record or to show zones. The default budget is 12,000 records or 60,000 links. Above it, `aggregateZones()` gives counts by zone and directed bundles between zones, and `zoneSlice()` opens one zone at a time. Every link touching the zone is accounted for exactly once (drawn, omitted inside the zone, to another zone, or omitted to another zone), and plan concepts list only the kept records that declare them, with the rest counted. Aggregating 30,000 records is part of the test suite. On a laptop GPU the constellation holds 60 fps at 5,000 records, with labels and zone glows.
|
|
30
|
+
|
|
31
|
+
## Build a workspace
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
import Graph from 'graphology'
|
|
35
|
+
import Sigma from 'sigma'
|
|
36
|
+
import { EdgeArrowProgram } from 'sigma/rendering'
|
|
37
|
+
import forceAtlas2 from 'graphology-layout-forceatlas2'
|
|
38
|
+
import FA2Layout from 'graphology-layout-forceatlas2/worker'
|
|
39
|
+
import { buildWorkspaceModel, layoutWorkspace, composeRecipes, composeTheme, DEFAULT_THEME } from '@mnstry/atelier/graph-workspace'
|
|
40
|
+
import { mountGraphWorkspace } from '@mnstry/atelier/graph-workspace/browser'
|
|
41
|
+
|
|
42
|
+
// graph: an Atelier knowledge graph the host has already limited to this reader.
|
|
43
|
+
const model = buildWorkspaceModel({ graph, plan, zoneRule: { prefix: 'notes/', depth: 1 } })
|
|
44
|
+
layoutWorkspace(model, { Graph, forceAtlas2 }) // or store positions at build time
|
|
45
|
+
|
|
46
|
+
const recipes = composeRecipes({ coach: coachRecipes, owner: ownerRecipes }).recipes
|
|
47
|
+
const theme = composeTheme(DEFAULT_THEME, coachTheme, ownerTheme) // every layer is checked; one bad layer refuses the theme
|
|
48
|
+
|
|
49
|
+
mountGraphWorkspace(element, { model, recipes, theme, deps: { Sigma, Graph, EdgeArrowProgram, FA2Layout },
|
|
50
|
+
profile: { id: 'workspace-id', name: 'My notebook', vocabulary: { record: 'note', records: 'notes', zone: 'folder' } },
|
|
51
|
+
// Optional: persist drafts to the host instead of this browser.
|
|
52
|
+
// storage: hostDraftPort, draftIdentity: { workspace: 'workspace-id', reader: readerScope },
|
|
53
|
+
})
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Atelier does not depend on `sigma` or `graphology`; the host injects them. Pin sigma 3 and graphology 0.25 or later in the consuming application.
|
|
57
|
+
|
|
58
|
+
## Keeping a shareable layer clean
|
|
59
|
+
|
|
60
|
+
A coach or owner who builds on private workspaces can check that nothing from them reaches a shareable layer. `fingerprintsFrom()` derives distinctive strings from a private graph and plan (record ids, paths, long titles, summary openings, plan wording and names). `scanForFingerprints()` reports where any of them appears in shareable text, naming the file and a masked sample only.
|
|
61
|
+
|
|
62
|
+
## What this does not do
|
|
63
|
+
|
|
64
|
+
It does not authenticate a reader, grant access, read source bodies, save to a source or apply a plan change. Drafts that outlive the browser, and proposals, need a host storage port bound to the coauthor ledger, and the host's ontology guide remains the authority on guidance. See the [reference](../reference/graph-workspace.md) for every export.
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# Progressive local ingestion
|
|
2
2
|
|
|
3
|
-
Status: experimental
|
|
3
|
+
Status: experimental. Shipped since 0.2.0-alpha.13 as the `atelier ingest`
|
|
4
|
+
command and the `@mnstry/atelier/ingestion` export.
|
|
4
5
|
The local runner preserves explicitly selected files and makes bounded text
|
|
5
6
|
search useful before semantic interpretation. It composes the existing
|
|
6
|
-
[immutable intake](intake-and-guides.md) with a resumable plan. It never enrolls
|
|
7
|
+
[immutable intake](../reference/intake-and-guides.md) with a resumable plan. It never enrolls
|
|
7
8
|
raw captures into the canonical graph or treats extracted text as accepted
|
|
8
|
-
knowledge.
|
|
9
|
-
|
|
9
|
+
knowledge. Host integrations use the existing [semantic proposal processor](../reference/semantic-ingestion.md),
|
|
10
|
+
[semantic operation](../reference/semantic-operation.md) and [optional suppliers](../reference/optional-ingestion.md)
|
|
11
|
+
under their documented profiles and limits.
|
|
10
12
|
|
|
11
13
|
## Start with a purpose and selected sources
|
|
12
14
|
|
|
@@ -16,8 +18,7 @@ traversal, symlinks and implicit external reads are refused. The local CLI is
|
|
|
16
18
|
for a trusted workspace owner. Its workspace identifier is a binding against
|
|
17
19
|
accidental cross-workspace reuse, not an authenticated identity or tenant ACL.
|
|
18
20
|
|
|
19
|
-
The following examples
|
|
20
|
-
version containing this command. Released alpha.7 does not contain it.
|
|
21
|
+
The following examples need 0.2.0-alpha.13 or later.
|
|
21
22
|
|
|
22
23
|
```sh
|
|
23
24
|
atelier ingest plan <<'JSON'
|
|
@@ -169,13 +170,13 @@ verification and correction effort. Compare cost per useful accepted result,
|
|
|
169
170
|
with quality floors and rare exceptions preserved. Keep private examples and
|
|
170
171
|
methods in their owning workspace.
|
|
171
172
|
|
|
172
|
-
##
|
|
173
|
+
## Host responsibilities and limits
|
|
173
174
|
|
|
174
|
-
The
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
175
|
+
The local runner supplies no richer document/media processors, connector census,
|
|
176
|
+
permission-change orchestration or provider execution. Semantic processing and
|
|
177
|
+
graph decisions use separate APIs and require qualified host integration.
|
|
178
|
+
Native scheduling, installed processors, provider credentials/budgets, progress
|
|
179
|
+
and source review, cancellation, notifications and scoped harness delivery belong
|
|
180
|
+
to the host. The public reference path remains usable without a proprietary
|
|
181
|
+
runtime. Neither private material nor private methodology belongs in public
|
|
182
|
+
fixtures or distributed proprietary prompts.
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Discovery Harness and Research Harness
|
|
2
2
|
|
|
3
|
-
Status:
|
|
4
|
-
|
|
5
|
-
source checkout, or `atelier inquiry help` from a package built from it.
|
|
3
|
+
Status: shipped since 0.2.0-alpha.13. Run `atelier inquiry help` for the
|
|
4
|
+
commands.
|
|
6
5
|
|
|
7
6
|
Discovery frames questions, compares explanations and prepares decisions.
|
|
8
7
|
Research gathers and checks evidence and returns a portable bundle. People set
|