mirai-graph 1.0.0-rc.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/README.md +5 -5
- package/docs/repository-purpose.md +3 -3
- package/package.json +1 -1
- package/packages/cli/mirai-graph.js +3 -3
- package/packages/cli/validate-project-technology.js +42 -2
- package/packages/project-technology/index.js +41 -2
- package/releases/1.0.0-rc.10.md +14 -0
- package/releases/1.0.0-rc.11.md +14 -0
- package/releases/1.0.0-rc.9.md +14 -0
- package/releases/1.0.0.md +23 -0
- package/releases/README.md +2 -1
- package/standard/project-technology.md +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,47 @@ All notable changes to Mirai Graph will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.0.0] - 2026-08-17
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Project Technology is now the stable public execution mechanism for ordinary
|
|
12
|
+
projects, skills, platforms and multi-repository systems.
|
|
13
|
+
- The package, CLI and programmatic API leave release-candidate status without
|
|
14
|
+
changing the public `graph.json` schema or the accepted safety boundaries.
|
|
15
|
+
|
|
16
|
+
### Evidence Boundary
|
|
17
|
+
|
|
18
|
+
- Stable means the documented contracts and release checks are supported for
|
|
19
|
+
production adoption. It does not claim that every project outcome is correct
|
|
20
|
+
without project-specific goals, evidence and review.
|
|
21
|
+
|
|
22
|
+
## [1.0.0-rc.11] - 2026-08-17
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- The bounded architecture contract now preserves the exact human architecture
|
|
27
|
+
owner together with component, capability and operational ownership data.
|
|
28
|
+
- Federation adapters can consume the public contract without reconstructing
|
|
29
|
+
owner identity from a package owner.
|
|
30
|
+
|
|
31
|
+
## [1.0.0-rc.10] - 2026-08-17
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
- Project Technology now reads complete tracked-file inventories in large
|
|
36
|
+
repositories instead of accepting Node's default child-process buffer.
|
|
37
|
+
- A regression proves that an accepted target remains discoverable after more
|
|
38
|
+
than one megabyte of earlier tracked paths.
|
|
39
|
+
|
|
40
|
+
## [1.0.0-rc.9] - 2026-08-17
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- `mirai-graph technology ...` now resolves an omitted repository or `.` from
|
|
45
|
+
the caller's working directory instead of the installed package directory.
|
|
46
|
+
- CLI regressions cover omitted, relative and absolute repository selection.
|
|
47
|
+
|
|
7
48
|
## [1.0.0-rc.8] - 2026-08-17
|
|
8
49
|
|
|
9
50
|
### Added
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ Use it when a software project has useful knowledge spread across README files,
|
|
|
10
10
|
docs, issues, chats, code comments and AI prompts, and you need a small
|
|
11
11
|
machine-readable map that developers and AI assistants can validate and reuse.
|
|
12
12
|
|
|
13
|
-
Status: public `1.0.0
|
|
13
|
+
Status: stable public `1.0.0` release.
|
|
14
14
|
|
|
15
15
|
## What Problem Does It Solve?
|
|
16
16
|
|
|
@@ -42,8 +42,8 @@ Start with a normal repository and use Mirai Graph to:
|
|
|
42
42
|
|
|
43
43
|
## Current Installation Status
|
|
44
44
|
|
|
45
|
-
The repository is ready as the `mirai-graph@1.0.0
|
|
46
|
-
|
|
45
|
+
The repository is ready as the stable `mirai-graph@1.0.0` package. To verify a
|
|
46
|
+
repository checkout directly, use:
|
|
47
47
|
|
|
48
48
|
```bash
|
|
49
49
|
git clone https://github.com/zabarov/mirai-graph.git
|
|
@@ -52,7 +52,7 @@ npm install
|
|
|
52
52
|
npm run release:check
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
External projects use:
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
npm install -D mirai-graph
|
|
@@ -272,7 +272,7 @@ routes. See [Profile Boundaries](standard/profile-boundaries.md).
|
|
|
272
272
|
|
|
273
273
|
## Release Candidate
|
|
274
274
|
|
|
275
|
-
The
|
|
275
|
+
The stable 1.0 release consolidates the validator-backed public standard
|
|
276
276
|
across the core model, profiles, executable process control, instrumentation,
|
|
277
277
|
Character Layer, adopter kit and evidence boundaries.
|
|
278
278
|
|
|
@@ -23,7 +23,7 @@ The repository should become the public source of truth for:
|
|
|
23
23
|
- synthetic benchmarks and playground materials;
|
|
24
24
|
- publications, citations and research evidence.
|
|
25
25
|
|
|
26
|
-
For the current
|
|
26
|
+
For the current stable release, "source of truth" means public
|
|
27
27
|
standardization and reproducible examples. It does not mean that private
|
|
28
28
|
project graphs, internal workflows or generated context packs are published
|
|
29
29
|
here.
|
|
@@ -87,7 +87,7 @@ The model is not just a knowledge graph. It combines:
|
|
|
87
87
|
- implementation and adoption methods.
|
|
88
88
|
- organization-governance coordination patterns.
|
|
89
89
|
|
|
90
|
-
The
|
|
90
|
+
The stable 1.0 release also makes the operating model executable
|
|
91
91
|
enough to test:
|
|
92
92
|
|
|
93
93
|
- launch records define bounded work permission;
|
|
@@ -182,7 +182,7 @@ test the model:
|
|
|
182
182
|
|
|
183
183
|
Synthetic evidence must be clearly separated from real-world validation.
|
|
184
184
|
|
|
185
|
-
In the
|
|
185
|
+
In the stable release, `playground/` is an index of runnable CLI
|
|
186
186
|
examples. A hosted or interactive playground is future work.
|
|
187
187
|
|
|
188
188
|
### 6. Link Publications And Research Evidence
|
package/package.json
CHANGED
|
@@ -31,9 +31,9 @@ function usage() {
|
|
|
31
31
|
console.error(" Reports explain validation decisions. They do not authorize canonical updates.");
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
function run(script, args) {
|
|
34
|
+
function run(script, args, cwd = root) {
|
|
35
35
|
const result = spawnSync(node, [path.join(root, script), ...args], {
|
|
36
|
-
cwd
|
|
36
|
+
cwd,
|
|
37
37
|
stdio: "inherit"
|
|
38
38
|
});
|
|
39
39
|
process.exit(result.status === null ? 1 : result.status);
|
|
@@ -53,7 +53,7 @@ if (command === "technology") {
|
|
|
53
53
|
usage();
|
|
54
54
|
process.exit(1);
|
|
55
55
|
}
|
|
56
|
-
run("packages/cli/project-technology.js", [subcommand, ...rest]);
|
|
56
|
+
run("packages/cli/project-technology.js", [subcommand, ...rest], process.cwd());
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
if (command === "init" || command === "detect" || command === "bootstrap") {
|
|
@@ -58,8 +58,15 @@ function executionContract() {
|
|
|
58
58
|
}],
|
|
59
59
|
architecture_contract: {
|
|
60
60
|
contract_ref: "contract.fixture.architecture",
|
|
61
|
-
acceptance_ref: "decision.fixture.accepted", lifecycle: "accepted",
|
|
62
|
-
owner_ids: ["runtime"],
|
|
61
|
+
acceptance_ref: "decision.fixture.accepted", architecture_owner_id: "human.fixture.owner", lifecycle: "accepted",
|
|
62
|
+
owner_ids: ["runtime"], component_ids: ["component.fixture.runtime"],
|
|
63
|
+
package_ids: ["fixture/runtime"], capability_ids: ["capability.fixture.runtime"],
|
|
64
|
+
ownership_boundaries: [{
|
|
65
|
+
subject_ref: "capability.fixture.runtime", data_owner: "runtime", access_owner: "runtime",
|
|
66
|
+
lifecycle_owner: "runtime", interface_owner: "runtime", runtime_owner: "runtime",
|
|
67
|
+
}],
|
|
68
|
+
required_relations: ["component.fixture.runtime->capability.fixture.runtime"],
|
|
69
|
+
allowed_relations: [], forbidden_relations: ["capability.fixture.runtime->capability.fixture.legacy"],
|
|
63
70
|
required_dependencies: [], forbidden_dependencies: ["fixture/runtime->fixture/legacy"],
|
|
64
71
|
},
|
|
65
72
|
};
|
|
@@ -222,10 +229,43 @@ try {
|
|
|
222
229
|
const disabled = technology.execute("disable", skill, { apply: true });
|
|
223
230
|
check("disabled_state_fails_closed", disabled.status === "success" && technology.verify(skill, { significantWork: true }).status === "blocked");
|
|
224
231
|
|
|
232
|
+
const largeProvider = initRepo(root, "large-provider");
|
|
233
|
+
addTarget(largeProvider);
|
|
234
|
+
const emptyBlob = spawnSync("git", ["hash-object", "-w", "--stdin"], {
|
|
235
|
+
cwd: largeProvider, input: "", encoding: "utf8",
|
|
236
|
+
}).stdout.trim();
|
|
237
|
+
const padding = "x".repeat(190);
|
|
238
|
+
const indexInfo = Array.from({ length: 5200 }, (_, index) =>
|
|
239
|
+
`100644 ${emptyBlob}\tarchive/${String(index).padStart(5, "0")}-${padding}.txt\n`
|
|
240
|
+
).join("");
|
|
241
|
+
const indexed = spawnSync("git", ["update-index", "--index-info"], {
|
|
242
|
+
cwd: largeProvider, input: indexInfo, encoding: "utf8", maxBuffer: 64 * 1024 * 1024,
|
|
243
|
+
});
|
|
244
|
+
check("large_repository_fixture_created", indexed.status === 0, indexed.stderr);
|
|
245
|
+
git(largeProvider, "commit", "-qm", "large tracked index");
|
|
246
|
+
const largeRevision = git(largeProvider, "rev-parse", "HEAD");
|
|
247
|
+
check("large_repository_enable", technology.execute("enable", largeProvider, { apply: true }).status === "success");
|
|
248
|
+
const largeProvided = technology.execute("provide", largeProvider, {
|
|
249
|
+
apply: true, targetId: TARGET_ID, semanticDigest: SEMANTIC_DIGEST, providerRevision: largeRevision,
|
|
250
|
+
});
|
|
251
|
+
check("large_repository_target_is_not_lost_to_process_buffer", largeProvided.status === "success", largeProvided.blockers);
|
|
252
|
+
|
|
225
253
|
const cli = spawnSync(process.execPath, [path.join(__dirname, "mirai-graph.js"), "technology", "explain", federation], { encoding: "utf8" });
|
|
226
254
|
const cliResult = JSON.parse(cli.stdout);
|
|
227
255
|
check("unified_cli_contract", cli.status === 0 && cliResult.operation_id === "mirai.project_technology.explain" && cliResult.operation_mode === "read_only");
|
|
228
256
|
|
|
257
|
+
const cliFromCwd = spawnSync(process.execPath, [path.join(__dirname, "mirai-graph.js"), "technology", "status"], {
|
|
258
|
+
cwd: federation, encoding: "utf8",
|
|
259
|
+
});
|
|
260
|
+
const cliFromCwdResult = JSON.parse(cliFromCwd.stdout);
|
|
261
|
+
check("unified_cli_defaults_to_caller_cwd", cliFromCwd.status === 0 && cliFromCwdResult.repository_id === "fixture-federation", cliFromCwdResult);
|
|
262
|
+
|
|
263
|
+
const cliDot = spawnSync(process.execPath, [path.join(__dirname, "mirai-graph.js"), "technology", "status", "."], {
|
|
264
|
+
cwd: federation, encoding: "utf8",
|
|
265
|
+
});
|
|
266
|
+
const cliDotResult = JSON.parse(cliDot.stdout);
|
|
267
|
+
check("unified_cli_resolves_relative_repo_from_caller_cwd", cliDot.status === 0 && cliDotResult.repository_id === "fixture-federation", cliDotResult);
|
|
268
|
+
|
|
229
269
|
process.stdout.write(`${JSON.stringify({ status: "success", checks_passed: checks.length, checks_failed: 0, checks }, null, 2)}\n`);
|
|
230
270
|
} finally {
|
|
231
271
|
fs.rmSync(root, { recursive: true, force: true });
|
|
@@ -77,7 +77,11 @@ function result(operation, operationMode, status, extra = {}) {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
function git(repo, ...args) {
|
|
80
|
-
const completed = spawnSync("git", args, {
|
|
80
|
+
const completed = spawnSync("git", args, {
|
|
81
|
+
cwd: repo,
|
|
82
|
+
encoding: "utf8",
|
|
83
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
84
|
+
});
|
|
81
85
|
return completed.status === 0 ? completed.stdout.trim() : "";
|
|
82
86
|
}
|
|
83
87
|
|
|
@@ -225,16 +229,44 @@ function normalizeExecutionContract(value) {
|
|
|
225
229
|
scopes.sort((a, b) => canonicalBytes(a).localeCompare(canonicalBytes(b)));
|
|
226
230
|
|
|
227
231
|
const architecture = value.architecture_contract && typeof value.architecture_contract === "object" && !Array.isArray(value.architecture_contract) ? value.architecture_contract : {};
|
|
228
|
-
const architectureAllowed = new Set([
|
|
232
|
+
const architectureAllowed = new Set([
|
|
233
|
+
"contract_ref", "acceptance_ref", "architecture_owner_id", "lifecycle", "owner_ids", "component_ids",
|
|
234
|
+
"package_ids", "capability_ids", "ownership_boundaries", "required_relations",
|
|
235
|
+
"allowed_relations", "forbidden_relations", "required_dependencies", "forbidden_dependencies",
|
|
236
|
+
]);
|
|
229
237
|
if (Object.keys(architecture).some((key) => !architectureAllowed.has(key))) blockers.push("provider_architecture_contract_not_bounded");
|
|
230
238
|
const contractRef = String(architecture.contract_ref || "").trim();
|
|
231
239
|
const acceptanceRef = String(architecture.acceptance_ref || "").trim();
|
|
240
|
+
const architectureOwnerId = String(architecture.architecture_owner_id || "").trim();
|
|
232
241
|
const lifecycle = String(architecture.lifecycle || "").trim();
|
|
233
242
|
if (!REF_RE.test(contractRef)) blockers.push("provider_architecture_contract_ref_missing_or_unsafe");
|
|
234
243
|
if (!REF_RE.test(acceptanceRef)) blockers.push("provider_architecture_acceptance_ref_missing_or_unsafe");
|
|
244
|
+
if (!REF_RE.test(architectureOwnerId)) blockers.push("provider_architecture_owner_missing_or_unsafe");
|
|
235
245
|
if (!ACCEPTED_LIFECYCLES.has(lifecycle)) blockers.push("provider_architecture_not_accepted");
|
|
236
246
|
const ownerIds = boundedRefs(architecture.owner_ids, "architecture_owner_ids", blockers);
|
|
247
|
+
const componentIds = boundedRefs(architecture.component_ids, "architecture_component_ids", blockers);
|
|
237
248
|
const packageIds = boundedRefs(architecture.package_ids, "architecture_package_ids", blockers);
|
|
249
|
+
const capabilityIds = boundedRefs(architecture.capability_ids, "architecture_capability_ids", blockers);
|
|
250
|
+
const ownershipBoundaries = [];
|
|
251
|
+
if (!Array.isArray(architecture.ownership_boundaries) || architecture.ownership_boundaries.length === 0) blockers.push("provider_architecture_ownership_boundaries_empty");
|
|
252
|
+
else for (const boundary of architecture.ownership_boundaries) {
|
|
253
|
+
const keys = ["subject_ref", "data_owner", "access_owner", "lifecycle_owner", "interface_owner", "runtime_owner"];
|
|
254
|
+
if (!boundary || typeof boundary !== "object" || Array.isArray(boundary) || Object.keys(boundary).some((key) => !keys.includes(key))) {
|
|
255
|
+
blockers.push("provider_architecture_ownership_boundary_invalid"); continue;
|
|
256
|
+
}
|
|
257
|
+
const normalizedBoundary = Object.fromEntries(keys.map((key) => [key, String(boundary[key] || "").trim()]));
|
|
258
|
+
if (Object.values(normalizedBoundary).some((id) => !REF_RE.test(id))) {
|
|
259
|
+
blockers.push("provider_architecture_ownership_boundary_unsafe"); continue;
|
|
260
|
+
}
|
|
261
|
+
if (![...componentIds, ...packageIds, ...capabilityIds].includes(normalizedBoundary.subject_ref)) blockers.push("provider_architecture_ownership_subject_unknown");
|
|
262
|
+
if (["data_owner", "access_owner", "lifecycle_owner", "interface_owner", "runtime_owner"].some((key) => !ownerIds.includes(normalizedBoundary[key]))) blockers.push("provider_architecture_boundary_owner_unapproved");
|
|
263
|
+
ownershipBoundaries.push(normalizedBoundary);
|
|
264
|
+
}
|
|
265
|
+
ownershipBoundaries.sort((a, b) => canonicalBytes(a).localeCompare(canonicalBytes(b)));
|
|
266
|
+
const requiredRelations = boundedRelations(architecture.required_relations, "architecture_required_relations", blockers);
|
|
267
|
+
const allowedRelations = boundedRelations(architecture.allowed_relations, "architecture_allowed_relations", blockers);
|
|
268
|
+
const forbiddenRelations = boundedRelations(architecture.forbidden_relations, "architecture_forbidden_relations", blockers);
|
|
269
|
+
if (requiredRelations.some((item) => forbiddenRelations.includes(item))) blockers.push("provider_architecture_forbidden_relation");
|
|
238
270
|
const requiredDependencies = boundedRelations(architecture.required_dependencies, "required_dependencies", blockers);
|
|
239
271
|
const forbiddenDependencies = boundedRelations(architecture.forbidden_dependencies, "forbidden_dependencies", blockers);
|
|
240
272
|
if (requiredDependencies.some((item) => forbiddenDependencies.includes(item))) blockers.push("provider_architecture_forbidden_dependency");
|
|
@@ -253,9 +285,16 @@ function normalizeExecutionContract(value) {
|
|
|
253
285
|
architecture_contract: {
|
|
254
286
|
contract_ref: contractRef,
|
|
255
287
|
acceptance_ref: acceptanceRef,
|
|
288
|
+
architecture_owner_id: architectureOwnerId,
|
|
256
289
|
lifecycle,
|
|
257
290
|
owner_ids: ownerIds,
|
|
291
|
+
component_ids: componentIds,
|
|
258
292
|
package_ids: packageIds,
|
|
293
|
+
capability_ids: capabilityIds,
|
|
294
|
+
ownership_boundaries: ownershipBoundaries,
|
|
295
|
+
required_relations: requiredRelations,
|
|
296
|
+
allowed_relations: allowedRelations,
|
|
297
|
+
forbidden_relations: forbiddenRelations,
|
|
259
298
|
required_dependencies: requiredDependencies,
|
|
260
299
|
forbidden_dependencies: forbiddenDependencies,
|
|
261
300
|
},
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Mirai Graph 1.0.0-rc.10
|
|
2
|
+
|
|
3
|
+
This release candidate completes the public Project Technology pilot against
|
|
4
|
+
the real Federation graph.
|
|
5
|
+
|
|
6
|
+
## Verified outcome
|
|
7
|
+
|
|
8
|
+
- commands without a repository argument use the caller's project;
|
|
9
|
+
- large tracked-file inventories are read completely;
|
|
10
|
+
- accepted target objects cannot disappear because of a process-output limit;
|
|
11
|
+
- the Project Technology contract and fail-closed safety rules are unchanged.
|
|
12
|
+
|
|
13
|
+
Stable `1.0.0` remains deferred until this RC has been exercised by the SIMAI
|
|
14
|
+
Federation and all release-managed skills.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Mirai Graph 1.0.0-rc.11
|
|
2
|
+
|
|
3
|
+
This release candidate closes the final architecture-owner gap found by the
|
|
4
|
+
real Federation process resolver.
|
|
5
|
+
|
|
6
|
+
## Verified outcome
|
|
7
|
+
|
|
8
|
+
- complete large-repository target discovery;
|
|
9
|
+
- exact human architecture owner in the bounded contract;
|
|
10
|
+
- component, package, capability and operational ownership remain digest-bound;
|
|
11
|
+
- no private source or full provider graph is exported.
|
|
12
|
+
|
|
13
|
+
Stable `1.0.0` remains deferred until Federation 8.20.0 and all managed skills
|
|
14
|
+
complete their release checks.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Mirai Graph 1.0.0-rc.9
|
|
2
|
+
|
|
3
|
+
This release candidate fixes the public Project Technology CLI boundary found
|
|
4
|
+
during the Federation migration pilot.
|
|
5
|
+
|
|
6
|
+
## Verified outcome
|
|
7
|
+
|
|
8
|
+
- a command run from a project without a repository argument uses that project;
|
|
9
|
+
- an explicit `.` is resolved from the caller's working directory;
|
|
10
|
+
- absolute repository paths keep working;
|
|
11
|
+
- the Project Technology contract and safety gates are unchanged from RC.8.
|
|
12
|
+
|
|
13
|
+
Stable `1.0.0` remains deferred until this RC has been exercised by the SIMAI
|
|
14
|
+
Federation and all release-managed skills.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Mirai Graph 1.0.0
|
|
2
|
+
|
|
3
|
+
Mirai Graph 1.0.0 is the first stable public release.
|
|
4
|
+
|
|
5
|
+
## What is stable
|
|
6
|
+
|
|
7
|
+
- one `graph.json` manifest and exact `graph.lock.json` imports;
|
|
8
|
+
- public Project Technology CLI and programmatic API;
|
|
9
|
+
- task-scoped context, accepted target and architecture checks;
|
|
10
|
+
- bounded provider export/import and safe refresh-binding;
|
|
11
|
+
- fail-closed verification for stale, incomplete or tampered contracts;
|
|
12
|
+
- read-only diagnostics and idempotent transactional operations.
|
|
13
|
+
|
|
14
|
+
## Verified use
|
|
15
|
+
|
|
16
|
+
The release-candidate series was integrated into Federation 8.20.0 across 25
|
|
17
|
+
managed skills. Stable 1.0 keeps the same public schema and safety boundaries.
|
|
18
|
+
|
|
19
|
+
## Claim boundary
|
|
20
|
+
|
|
21
|
+
Stable status covers the published contracts, CLI and release checks. Project
|
|
22
|
+
results still require project-specific goals, evidence, tests and human
|
|
23
|
+
decisions at product or architecture boundaries.
|
package/releases/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Mirai Graph Release Process
|
|
2
2
|
|
|
3
|
-
Status: 1.0 release
|
|
3
|
+
Status: stable 1.0 release process
|
|
4
4
|
|
|
5
5
|
## Purpose
|
|
6
6
|
|
|
@@ -15,6 +15,7 @@ Release notes must separate:
|
|
|
15
15
|
|
|
16
16
|
## Release Notes
|
|
17
17
|
|
|
18
|
+
- [v1.0.0](1.0.0.md) - stable Project Technology, CLI and public contract.
|
|
18
19
|
- [v1.0.0-rc.6](1.0.0-rc.6.md) - anti-drift / quality-control release
|
|
19
20
|
consolidation across Semantic Intent, Dynamic Episode, Goal Vector and
|
|
20
21
|
Technology Quality Feedback.
|
|
@@ -47,6 +47,11 @@ references, Done When, requirements and acceptance references, constraints,
|
|
|
47
47
|
non-goals, deferred boundaries, approved repository/owner/package/file/action
|
|
48
48
|
scope, the accepted architecture boundary and a contract digest.
|
|
49
49
|
|
|
50
|
+
The architecture boundary carries exact component, package and capability
|
|
51
|
+
identities, ownership for data/access/lifecycle/interface/runtime, required and
|
|
52
|
+
forbidden relations, and dependency constraints. This keeps an imported target
|
|
53
|
+
executable without copying the provider's private source or full graph.
|
|
54
|
+
|
|
50
55
|
## Hybrid Source Of Truth
|
|
51
56
|
|
|
52
57
|
Project Technology may select graph objects and point to raw sources. It must
|