ltcai 11.2.0 → 11.5.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/README.md +50 -53
- package/docs/CHANGELOG.md +87 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +1 -1
- package/docs/MULTI_AGENT_RUNTIME.md +1 -1
- package/docs/ONBOARDING.md +1 -1
- package/docs/OPERATIONS.md +6 -2
- package/docs/PERMISSION_MODE.md +1 -1
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/kg-schema.md +2 -2
- package/docs/v11.3.0_PLAN.md +202 -0
- package/docs/v11.4.0_RUST_FOUNDATION_PLAN.md +181 -0
- package/docs/v11.5.0_RUST_COMPLETE_PLAN.md +145 -0
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/graph/_kg_common/__init__.py +287 -0
- package/lattice_brain/graph/_kg_common/extraction.py +516 -0
- package/lattice_brain/graph/_kg_common/relations.py +161 -0
- package/lattice_brain/graph/_kg_common/text.py +479 -0
- package/lattice_brain/graph/discovery_index/__init__.py +35 -0
- package/lattice_brain/graph/discovery_index/cleanup.py +182 -0
- package/lattice_brain/graph/discovery_index/extract.py +137 -0
- package/lattice_brain/graph/discovery_index/scan.py +411 -0
- package/lattice_brain/graph/discovery_index/upsert.py +495 -0
- package/lattice_brain/graph/projection/__init__.py +42 -0
- package/lattice_brain/graph/projection/curation.py +500 -0
- package/lattice_brain/graph/{projection.py → projection/v2_schema.py} +15 -477
- package/lattice_brain/graph/retrieval/__init__.py +54 -0
- package/lattice_brain/graph/retrieval/context.py +197 -0
- package/lattice_brain/graph/retrieval/graph_view.py +319 -0
- package/lattice_brain/graph/retrieval/hybrid.py +488 -0
- package/lattice_brain/graph/retrieval/maintenance.py +121 -0
- package/lattice_brain/graph/retrieval/signals.py +95 -0
- package/lattice_brain/graph/retrieval_vector/__init__.py +42 -0
- package/lattice_brain/graph/retrieval_vector/fingerprint.py +97 -0
- package/lattice_brain/graph/retrieval_vector/indexing.py +347 -0
- package/lattice_brain/graph/retrieval_vector/search.py +560 -0
- package/lattice_brain/graph/retrieval_vector/status.py +374 -0
- package/lattice_brain/ingestion/__init__.py +130 -0
- package/lattice_brain/ingestion/_contract.py +90 -0
- package/lattice_brain/ingestion/constants.py +127 -0
- package/lattice_brain/ingestion/folder_scan.py +57 -0
- package/lattice_brain/ingestion/folders.py +258 -0
- package/lattice_brain/ingestion/hashing.py +26 -0
- package/lattice_brain/ingestion/jobs_api.py +107 -0
- package/lattice_brain/ingestion/models.py +80 -0
- package/lattice_brain/ingestion/pipeline.py +486 -0
- package/lattice_brain/ingestion/quality.py +209 -0
- package/lattice_brain/ingestion/routing.py +295 -0
- package/lattice_brain/multimodal/__init__.py +164 -0
- package/lattice_brain/multimodal/audio.py +77 -0
- package/lattice_brain/multimodal/common.py +118 -0
- package/lattice_brain/multimodal/images.py +498 -0
- package/lattice_brain/multimodal/ports.py +169 -0
- package/lattice_brain/multimodal/video.py +410 -0
- package/lattice_brain/portability/__init__.py +90 -0
- package/lattice_brain/portability/_contract.py +42 -0
- package/lattice_brain/portability/backups.py +338 -0
- package/lattice_brain/portability/bundles.py +136 -0
- package/lattice_brain/portability/constants.py +93 -0
- package/lattice_brain/portability/fsops.py +138 -0
- package/lattice_brain/portability/service.py +41 -0
- package/lattice_brain/{portability.py → portability/sharing.py} +44 -677
- package/lattice_brain/runtime/__init__.py +1 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/chronicle.py +63 -0
- package/latticeai/api/index_jobs.py +145 -0
- package/latticeai/core/agent/__init__.py +93 -0
- package/latticeai/core/agent/_contract.py +79 -0
- package/latticeai/core/agent/context.py +57 -0
- package/latticeai/core/agent/deps.py +125 -0
- package/latticeai/core/agent/execution.py +622 -0
- package/latticeai/core/agent/planning.py +145 -0
- package/latticeai/core/agent/recovery.py +157 -0
- package/latticeai/core/agent/runtime.py +210 -0
- package/latticeai/core/agent/verification.py +231 -0
- package/latticeai/core/embedding_providers/__init__.py +151 -0
- package/latticeai/core/embedding_providers/base.py +199 -0
- package/latticeai/core/embedding_providers/captions.py +162 -0
- package/latticeai/core/embedding_providers/profiles.py +126 -0
- package/latticeai/core/embedding_providers/text.py +350 -0
- package/latticeai/core/embedding_providers/vision.py +352 -0
- package/latticeai/core/file_generation/__init__.py +115 -0
- package/latticeai/core/file_generation/bundles.py +76 -0
- package/latticeai/core/file_generation/extraction.py +154 -0
- package/latticeai/core/file_generation/inference.py +235 -0
- package/latticeai/core/file_generation/orchestration.py +152 -0
- package/latticeai/core/file_generation/prompting.py +117 -0
- package/latticeai/core/file_generation/repair.py +114 -0
- package/latticeai/core/file_generation/sanitize.py +61 -0
- package/latticeai/core/file_generation/validation.py +201 -0
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/messages.py +14 -0
- package/latticeai/core/workspace_os_constants.py +1 -1
- package/latticeai/integrations/telegram_bot/__init__.py +123 -0
- package/latticeai/integrations/telegram_bot/__main__.py +17 -0
- package/latticeai/integrations/telegram_bot/config.py +86 -0
- package/latticeai/integrations/telegram_bot/dispatch.py +311 -0
- package/latticeai/integrations/telegram_bot/flows.py +478 -0
- package/latticeai/integrations/telegram_bot/helpers.py +322 -0
- package/latticeai/integrations/telegram_bot/screens.py +394 -0
- package/latticeai/models/router/__init__.py +88 -0
- package/latticeai/models/router/_contract.py +66 -0
- package/latticeai/models/router/branding.py +56 -0
- package/latticeai/models/router/catalog.py +69 -0
- package/latticeai/models/router/documents.py +199 -0
- package/latticeai/models/router/errors.py +37 -0
- package/latticeai/models/router/generation.py +258 -0
- package/latticeai/models/router/loading.py +291 -0
- package/latticeai/models/router/local_models.py +85 -0
- package/latticeai/models/router/registry.py +147 -0
- package/latticeai/runtime/build_phases/__init__.py +82 -0
- package/latticeai/runtime/build_phases/features.py +421 -0
- package/latticeai/runtime/build_phases/foundation.py +555 -0
- package/latticeai/runtime/build_phases/web.py +492 -0
- package/latticeai/runtime/runtime_context.py +1 -0
- package/latticeai/services/architecture_readiness.py +48 -19
- package/latticeai/services/brain_intelligence/__init__.py +58 -0
- package/latticeai/services/brain_intelligence/_contract.py +71 -0
- package/latticeai/services/brain_intelligence/consistency.py +193 -0
- package/latticeai/services/brain_intelligence/constants.py +47 -0
- package/latticeai/services/brain_intelligence/digest.py +258 -0
- package/latticeai/services/brain_intelligence/health.py +331 -0
- package/latticeai/services/brain_intelligence/proposals.py +264 -0
- package/latticeai/services/brain_intelligence/sampling.py +84 -0
- package/latticeai/services/brain_intelligence/service.py +48 -0
- package/latticeai/services/chronicle.py +557 -0
- package/latticeai/services/memory_service/__init__.py +52 -0
- package/latticeai/services/memory_service/_contract.py +100 -0
- package/latticeai/services/memory_service/brief.py +431 -0
- package/latticeai/services/memory_service/constants.py +57 -0
- package/latticeai/services/memory_service/maintenance.py +138 -0
- package/latticeai/services/memory_service/manager.py +186 -0
- package/latticeai/services/memory_service/proof.py +136 -0
- package/latticeai/services/memory_service/recall.py +225 -0
- package/latticeai/services/memory_service/service.py +48 -0
- package/latticeai/services/memory_service/stores.py +110 -0
- package/latticeai/services/model_runtime/__init__.py +322 -0
- package/latticeai/services/model_runtime/cloud.py +87 -0
- package/latticeai/services/model_runtime/download.py +282 -0
- package/latticeai/services/model_runtime/engines.py +341 -0
- package/latticeai/services/model_runtime/loading.py +178 -0
- package/latticeai/services/model_runtime/service.py +129 -0
- package/latticeai/services/model_runtime/state.py +131 -0
- package/latticeai/services/model_runtime/status.py +255 -0
- package/latticeai/services/product_readiness.py +15 -7
- package/latticeai/setup/wizard/__init__.py +126 -0
- package/latticeai/setup/wizard/catalog.py +172 -0
- package/latticeai/setup/wizard/detect.py +323 -0
- package/latticeai/setup/wizard/install.py +348 -0
- package/latticeai/setup/wizard/paths.py +168 -0
- package/latticeai/setup/wizard/plans.py +74 -0
- package/latticeai/setup/wizard/recommend.py +320 -0
- package/package.json +6 -2
- package/scripts/bump_version.py +14 -0
- package/scripts/capture_release_evidence.mjs +33 -21
- package/scripts/check_current_release_docs.mjs +1 -1
- package/scripts/check_i18n_namespace_coverage.mjs +41 -4
- package/scripts/check_max_file_lines.mjs +102 -0
- package/scripts/check_release_evidence_bound.mjs +30 -15
- package/scripts/check_screenshot_pixel_delta.py +34 -4
- package/scripts/check_server_i18n.mjs +2 -0
- package/scripts/chunking_parity_corpus.py +449 -0
- package/scripts/generate_agent_parity_fixtures.py +752 -0
- package/scripts/generate_chunking_parity_fixtures.py +259 -0
- package/scripts/generate_rust_parity_fixtures.py +997 -0
- package/scripts/lib/mock_server_fingerprint.mjs +94 -0
- package/scripts/release_screen_claims.json +42 -2
- package/src-tauri/Cargo.lock +404 -3
- package/src-tauri/Cargo.toml +13 -1
- package/src-tauri/src/backend.rs +460 -0
- package/src-tauri/src/folder.rs +33 -0
- package/src-tauri/src/main.rs +109 -399
- package/src-tauri/src/topology.rs +356 -0
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +41 -37
- package/static/app/assets/Act-CWnxSCgN.js +1 -0
- package/static/app/assets/AdminConsole-BEQYU6kF.js +1 -0
- package/static/app/assets/{Brain-tuhI4sOC.js → Brain-DWu1BhFg.js} +2 -2
- package/static/app/assets/BrainHome-95Hilr9R.js +2 -0
- package/static/app/assets/BrainSignals-QdeqCpAF.js +1 -0
- package/static/app/assets/Capture-BHpCxnzb.js +1 -0
- package/static/app/assets/Chronicle-B4xYKoed.js +1 -0
- package/static/app/assets/CommandPalette-BVXnttSz.js +1 -0
- package/static/app/assets/Library-DgYcHome.js +1 -0
- package/static/app/assets/{LivingBrain-DBwhto14.js → LivingBrain-CrJLDbf7.js} +1 -1
- package/static/app/assets/ProductFlow-DFlScKoJ.js +1 -0
- package/static/app/assets/ReviewCard-Cy5f48Pj.js +3 -0
- package/static/app/assets/System-NF8IfhTa.js +1 -0
- package/static/app/assets/arrow-left-DwkSYrjR.js +1 -0
- package/static/app/assets/{bot-Cia42c2h.js → bot-CucuhLhm.js} +1 -1
- package/static/app/assets/brain-BBnSryW_.js +1 -0
- package/static/app/assets/{button-2j2Ijzgq.js → button-C2GUj2Ai.js} +1 -1
- package/static/app/assets/circle-check-CxOVPwYq.js +1 -0
- package/static/app/assets/{circle-pause-BEFeWpVW.js → circle-pause-CbkWzBmG.js} +1 -1
- package/static/app/assets/{circle-play-ujXMcHxl.js → circle-play-7lEaqHdJ.js} +1 -1
- package/static/app/assets/{cpu-k4awryFq.js → cpu-DAlCXlIy.js} +1 -1
- package/static/app/assets/{download-DFbLJ_ig.js → download-RNhuuJwh.js} +1 -1
- package/static/app/assets/{folder-open-7y_b6xkM.js → folder-open-CLW4odzM.js} +1 -1
- package/static/app/assets/{hard-drive-Bidh02Kr.js → hard-drive-NKEiDIAJ.js} +1 -1
- package/static/app/assets/{index-DwDl9-8Y.css → index-BLPb5lmE.css} +1 -1
- package/static/app/assets/index-DMurvUuR.js +10 -0
- package/static/app/assets/input-D2UhPC1X.js +1 -0
- package/static/app/assets/link-2-6amKbP_P.js +1 -0
- package/static/app/assets/{permissionCopy-Bpb83Hx9.js → permissionCopy-Cu9TZtdR.js} +1 -1
- package/static/app/assets/primitives-gPsccucr.js +1 -0
- package/static/app/assets/search-Cj_TKk_2.js +1 -0
- package/static/app/assets/{share-2-BH1M-WNi.js → share-2-Bau7KkPq.js} +1 -1
- package/static/app/assets/{shield-alert-BlKdBXcG.js → shield-alert-BufNYypi.js} +1 -1
- package/static/app/assets/{textarea-CCWbUfFB.js → textarea-BQnVWhYs.js} +1 -1
- package/static/app/assets/{useFocusTrap-YdHQ7pJ1.js → useFocusTrap-B3_w60si.js} +1 -1
- package/static/app/assets/useMutation-BHhCflT6.js +1 -0
- package/static/app/assets/{useQuery-CXQiwbVT.js → useQuery-rBWfI-5t.js} +1 -1
- package/static/app/assets/utils-V_5-wxr5.js +4 -0
- package/static/app/assets/workspace-K1zjYUHj.js +1 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/lattice_brain/graph/_kg_common.py +0 -1331
- package/lattice_brain/graph/discovery_index.py +0 -1141
- package/lattice_brain/graph/retrieval.py +0 -1120
- package/lattice_brain/graph/retrieval_vector.py +0 -1293
- package/lattice_brain/ingestion.py +0 -1525
- package/lattice_brain/multimodal.py +0 -1258
- package/latticeai/core/agent.py +0 -1465
- package/latticeai/core/embedding_providers.py +0 -1196
- package/latticeai/core/file_generation.py +0 -1047
- package/latticeai/integrations/telegram_bot.py +0 -1390
- package/latticeai/models/router.py +0 -1007
- package/latticeai/runtime/build_phases.py +0 -1450
- package/latticeai/services/brain_intelligence.py +0 -1083
- package/latticeai/services/memory_service.py +0 -1177
- package/latticeai/services/model_runtime.py +0 -1281
- package/latticeai/setup/wizard.py +0 -1310
- package/static/app/assets/Act-AWf0SAKp.js +0 -1
- package/static/app/assets/AdminConsole-D0u8Tiyj.js +0 -1
- package/static/app/assets/BrainHome-Ts7G_Ila.js +0 -2
- package/static/app/assets/BrainSignals-jMYgQ2Ar.js +0 -1
- package/static/app/assets/Capture-CqOSzyPr.js +0 -1
- package/static/app/assets/CommandPalette-DC0Bzh-I.js +0 -1
- package/static/app/assets/Library-CX-bbhmK.js +0 -1
- package/static/app/assets/ProductFlow-BHA2cfKI.js +0 -1
- package/static/app/assets/ReviewCard-BUhCKRNM.js +0 -3
- package/static/app/assets/System-Bu2t5hn1.js +0 -1
- package/static/app/assets/arrow-left-Dzwa5zRb.js +0 -1
- package/static/app/assets/brain-DJMoqrwx.js +0 -1
- package/static/app/assets/index-BpYkzcVm.js +0 -10
- package/static/app/assets/input-DSlJJxRs.js +0 -1
- package/static/app/assets/primitives-BCx6TvfG.js +0 -1
- package/static/app/assets/search-Cgy8cCFJ.js +0 -1
- package/static/app/assets/utils-zqPZJxdx.js +0 -4
- package/static/app/assets/workspace-DXTihhfU.js +0 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fingerprint of the release-capture mock API surface.
|
|
3
|
+
*
|
|
4
|
+
* Release screenshots are shot against the visual mock server, so the evidence
|
|
5
|
+
* is only trustworthy while that server still returns the payloads it returned
|
|
6
|
+
* during capture. `capture_release_evidence.mjs` records this fingerprint in
|
|
7
|
+
* SCREENSHOT_INDEX.md and `check_release_evidence_bound.mjs` re-computes it on
|
|
8
|
+
* every lint; a mismatch means the mock changed after capture.
|
|
9
|
+
*
|
|
10
|
+
* v11.3.0: `tests/visual/mock_server.cjs` became a thin entry that composes the
|
|
11
|
+
* route modules under `tests/visual/mock_server/`. Both scripts used to hash the
|
|
12
|
+
* entry alone, so every payload edit — which now lands in a route module — was
|
|
13
|
+
* invisible to the gate. They share this module precisely so the two sides of
|
|
14
|
+
* the binding cannot drift apart again.
|
|
15
|
+
*
|
|
16
|
+
* The digest covers the entry plus every `*.cjs` in the directory, ordered by
|
|
17
|
+
* repo-relative POSIX path, and mixes each path into the hash so a rename is a
|
|
18
|
+
* change even when the bytes are identical.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from "node:crypto";
|
|
21
|
+
import fs from "node:fs";
|
|
22
|
+
import path from "node:path";
|
|
23
|
+
|
|
24
|
+
/** Repo-relative path of the entry file (POSIX separators). */
|
|
25
|
+
export const MOCK_SERVER_ENTRY = "tests/visual/mock_server.cjs";
|
|
26
|
+
/** Repo-relative path of the directory holding the composed route modules. */
|
|
27
|
+
export const MOCK_SERVER_DIR = "tests/visual/mock_server";
|
|
28
|
+
/** Human-readable name for the whole surface, for error messages. */
|
|
29
|
+
export const MOCK_SERVER_LABEL = `${MOCK_SERVER_ENTRY} + ${MOCK_SERVER_DIR}/*.cjs`;
|
|
30
|
+
|
|
31
|
+
function toPosix(relativePath) {
|
|
32
|
+
return relativePath.split(path.sep).join("/");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Every file the fingerprint covers, as absolute paths in digest order.
|
|
37
|
+
* Returns null when the entry file is missing (nothing to bind to).
|
|
38
|
+
*/
|
|
39
|
+
export function mockServerFiles(repoRoot) {
|
|
40
|
+
const entry = path.join(repoRoot, ...MOCK_SERVER_ENTRY.split("/"));
|
|
41
|
+
if (!fs.existsSync(entry)) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const dir = path.join(repoRoot, ...MOCK_SERVER_DIR.split("/"));
|
|
45
|
+
const modules = fs.existsSync(dir)
|
|
46
|
+
? fs
|
|
47
|
+
.readdirSync(dir)
|
|
48
|
+
.filter((name) => name.endsWith(".cjs"))
|
|
49
|
+
.map((name) => path.join(dir, name))
|
|
50
|
+
: [];
|
|
51
|
+
// "tests/visual/mock_server.cjs" sorts before "tests/visual/mock_server/x.cjs"
|
|
52
|
+
// ("." < "/"), so the entry always leads — but sort explicitly rather than
|
|
53
|
+
// relying on that, and sort on the POSIX form so Windows agrees with CI.
|
|
54
|
+
return [entry, ...modules].sort((a, b) => {
|
|
55
|
+
const left = toPosix(path.relative(repoRoot, a));
|
|
56
|
+
const right = toPosix(path.relative(repoRoot, b));
|
|
57
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* `{ sha256, mtime, bytes, files }` for the mock API surface, or null when the
|
|
63
|
+
* entry file is missing.
|
|
64
|
+
*
|
|
65
|
+
* - `sha256` digest over `<relative path>\0<per-file sha256>\n` for each file
|
|
66
|
+
* - `mtime` newest mtime in the set (the last edit that could have moved a payload)
|
|
67
|
+
* - `bytes` total size of the set
|
|
68
|
+
* - `files` how many files the digest covers
|
|
69
|
+
*/
|
|
70
|
+
export function mockServerFingerprint(repoRoot) {
|
|
71
|
+
const files = mockServerFiles(repoRoot);
|
|
72
|
+
if (!files) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const digest = createHash("sha256");
|
|
76
|
+
let bytes = 0;
|
|
77
|
+
let newest = 0;
|
|
78
|
+
for (const file of files) {
|
|
79
|
+
const body = fs.readFileSync(file);
|
|
80
|
+
const stat = fs.statSync(file);
|
|
81
|
+
bytes += body.length;
|
|
82
|
+
newest = Math.max(newest, stat.mtime.getTime());
|
|
83
|
+
digest.update(toPosix(path.relative(repoRoot, file)));
|
|
84
|
+
digest.update("\0");
|
|
85
|
+
digest.update(createHash("sha256").update(body).digest("hex"));
|
|
86
|
+
digest.update("\n");
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
sha256: digest.digest("hex"),
|
|
90
|
+
mtime: new Date(newest).toISOString(),
|
|
91
|
+
bytes,
|
|
92
|
+
files: files.length,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -21,6 +21,44 @@
|
|
|
21
21
|
"specific, not less."
|
|
22
22
|
],
|
|
23
23
|
|
|
24
|
+
"11.5.0": {
|
|
25
|
+
"_why": [
|
|
26
|
+
"Rust Complete release: backend/desktop-topology architecture only",
|
|
27
|
+
"(router mounts, front-door default, scheduler, safety kernel). The",
|
|
28
|
+
"frontend bundle is untouched; no captured screen changes on purpose.",
|
|
29
|
+
"All thirteen measured but not gated. Known jitter: 05-memory-graph",
|
|
30
|
+
"moves ~2-3% between captures from the cytoscape layout (observed at",
|
|
31
|
+
"11.3.0 and 11.4.0 with zero source change)."
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
"11.4.0": {
|
|
36
|
+
"_why": [
|
|
37
|
+
"Rust Foundation release: backend architecture only (rust/ workspace,",
|
|
38
|
+
"supervisor, native search gateway). No intentional change to any",
|
|
39
|
+
"captured screen — the frontend bundle is untouched. All thirteen are",
|
|
40
|
+
"measured but not gated; 13-chronicle.png now has a v11.3.0 baseline.",
|
|
41
|
+
"Known jitter: 05-memory-graph moves ~2-3% between captures from the",
|
|
42
|
+
"cytoscape layout, with zero source change (also observed at 11.3.0)."
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
"11.3.0": {
|
|
47
|
+
"_why": [
|
|
48
|
+
"Chronicle release. 13-chronicle.png is NEW this release (no baseline",
|
|
49
|
+
"in v11.2.0 — the pixel gate reports it as 'new' and cannot diff it).",
|
|
50
|
+
"The No Big Files track proved the CSS bundle byte-identical, so the",
|
|
51
|
+
"only deliberate pixel change on existing screens is the everyday nav's",
|
|
52
|
+
"fourth item (연대기). Measured on capture: at the capture viewport the",
|
|
53
|
+
"shell nav is visible on 05-memory-graph (2.65% moved, claimed below);",
|
|
54
|
+
"the other shells render the nav collapsed or unchanged (0.00–0.07%),",
|
|
55
|
+
"so they are measured but not claimed."
|
|
56
|
+
],
|
|
57
|
+
"05-memory-graph.png": {
|
|
58
|
+
"min_pct": 1.5
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
|
|
24
62
|
"11.2.0": {
|
|
25
63
|
"04-brain-chat-home.png": {
|
|
26
64
|
"_why": [
|
|
@@ -92,8 +130,10 @@
|
|
|
92
130
|
"construction. The welcome step's compaction lives under",
|
|
93
131
|
"`@media (max-height: 820px)` and captures run at 1440x900; the capture",
|
|
94
132
|
"pills' focus border only differs while an input inside them has focus,",
|
|
95
|
-
"which no screenshot holds.
|
|
96
|
-
"
|
|
133
|
+
"which no screenshot holds. The visual suite asserts both directly",
|
|
134
|
+
"instead — `tests/visual/v3.home.spec.js` pins the welcome height and",
|
|
135
|
+
"`tests/visual/v3.surfaces.spec.js` pins the focus border — because a",
|
|
136
|
+
"pixel diff is the wrong instrument for either."
|
|
97
137
|
]
|
|
98
138
|
}
|
|
99
139
|
}
|