@entrorove/skill 0.1.69 → 0.1.71

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.
@@ -0,0 +1,96 @@
1
+ import ts from 'typescript';
2
+ import { uniConditionalError, uniConditionalLimitError } from './local-scope-uni-expressions.mjs';
3
+
4
+ function directive(source, start, end, text, syntax, filename, output) {
5
+ const match = /^\s*#([a-z]+)\b([\s\S]*)$/i.exec(text);
6
+ if (!match) return;
7
+ const kind = match[1].toLowerCase(), expression = match[2].trim();
8
+ if (!['ifdef', 'ifndef', 'if', 'else', 'endif', 'elif', 'elseif', 'exec', 'include', 'define', 'exclude', 'endexclude'].includes(kind)) return;
9
+ if (!['ifdef', 'ifndef', 'if', 'else', 'endif'].includes(kind) || /[\r\n]/.test(expression)
10
+ || ['else', 'endif'].includes(kind) && expression) {
11
+ throw uniConditionalError(filename, start, 'Conditional directive syntax is unsupported', source);
12
+ }
13
+ if (output.length >= 256) throw uniConditionalLimitError(filename, start, 'Conditional directives exceed their 256-entry bound', source);
14
+ output.push({ start, end, kind, expression, syntax });
15
+ }
16
+ function literalRanges(content, kind, filename, start, source) {
17
+ const parsed = ts.createSourceFile('uni-script.ts', content, ts.ScriptTarget.Latest, true, kind);
18
+ const pending = [parsed], ranges = []; let nodes = 0;
19
+ while (pending.length) {
20
+ const node = pending.pop();
21
+ if (++nodes > 200_000) throw uniConditionalLimitError(filename, start, 'Conditional lexical inspection exceeds its 200000-node bound', source);
22
+ if (ts.isStringLiteralLike(node) || ts.isRegularExpressionLiteral(node)
23
+ || [ts.SyntaxKind.TemplateHead, ts.SyntaxKind.TemplateMiddle, ts.SyntaxKind.TemplateTail].includes(node.kind)) {
24
+ ranges.push({ start: node.getStart(parsed), end: node.end });
25
+ } else ts.forEachChild(node, child => { pending.push(child); });
26
+ }
27
+ return ranges.sort((a, b) => a.start - b.start);
28
+ }
29
+ function scriptComments(source, start, end, filename, output, kind) {
30
+ const content = source.slice(start, end), literals = literalRanges(content, kind, filename, start, source); let literal = 0;
31
+ for (let index = 0; index < content.length;) {
32
+ while (literals[literal]?.end <= index) literal++;
33
+ if (literals[literal]?.start <= index) { index = literals[literal].end; continue; }
34
+ if (content.startsWith('//', index)) {
35
+ let next = index + 2; while (next < content.length && !['\r', '\n'].includes(content[next])) next++;
36
+ directive(source, start + index, start + next, content.slice(index + 2, next), 'js', filename, output); index = next;
37
+ } else if (content.startsWith('/*', index)) {
38
+ const finish = content.indexOf('*/', index + 2), next = finish < 0 ? content.length : finish + 2;
39
+ directive(source, start + index, start + next, content.slice(index + 2, finish < 0 ? next : finish), 'js', filename, output); index = next;
40
+ } else index++;
41
+ }
42
+ }
43
+ function quoteEnd(source, index, quote, end = source.length) {
44
+ for (let cursor = index + 1; cursor < end; cursor++) {
45
+ if (source[cursor] === '\\') cursor++;
46
+ else if (source[cursor] === quote) return cursor + 1;
47
+ }
48
+ return end;
49
+ }
50
+ function styleComments(source, start, end, filename, output) {
51
+ for (let cursor = start; cursor < end;) {
52
+ if (['"', "'"].includes(source[cursor])) cursor = quoteEnd(source, cursor, source[cursor], end);
53
+ else if (source.startsWith('/*', cursor)) {
54
+ const finish = source.indexOf('*/', cursor + 2), next = finish < 0 || finish >= end ? end : finish + 2;
55
+ directive(source, cursor, next, source.slice(cursor + 2, next - 2), 'css', filename, output); cursor = next;
56
+ } else cursor++;
57
+ }
58
+ }
59
+ function tagEnd(source, start) {
60
+ for (let cursor = start; cursor < source.length; cursor++) {
61
+ if (['"', "'"].includes(source[cursor])) cursor = quoteEnd(source, cursor, source[cursor]) - 1;
62
+ else if (source[cursor] === '>') return cursor + 1;
63
+ }
64
+ return source.length;
65
+ }
66
+ function interpolationEnd(source, start) {
67
+ for (let cursor = start + 2; cursor < source.length; cursor++) {
68
+ if (['"', "'", '`'].includes(source[cursor])) cursor = quoteEnd(source, cursor, source[cursor]) - 1;
69
+ else if (source.startsWith('}}', cursor)) return cursor + 2;
70
+ }
71
+ return source.length;
72
+ }
73
+ export function uniDirectives(source, filename) {
74
+ const output = []; let inTag = false;
75
+ for (let cursor = 0; cursor < source.length;) {
76
+ if (source.startsWith('<!--', cursor)) {
77
+ const finish = source.indexOf('-->', cursor + 4), next = finish < 0 ? source.length : finish + 3;
78
+ directive(source, cursor, next, source.slice(cursor + 4, finish < 0 ? next : finish), 'html', filename, output); cursor = next;
79
+ } else if (inTag && ['"', "'"].includes(source[cursor])) cursor = quoteEnd(source, cursor, source[cursor]);
80
+ else if (source.startsWith('{{', cursor)) cursor = interpolationEnd(source, cursor);
81
+ else {
82
+ const block = /^<(script|style)\b/i.exec(source.slice(cursor, cursor + 16));
83
+ if (block) {
84
+ const start = tagEnd(source, cursor), closing = new RegExp(`</${block[1]}\\s*>`, 'ig'); closing.lastIndex = start;
85
+ const match = closing.exec(source), end = match?.index ?? source.length;
86
+ if (block[1].toLowerCase() === 'script') {
87
+ const header = source.slice(cursor, start), language = /\blang\s*=\s*['"]([^'"]+)['"]/i.exec(header)?.[1];
88
+ scriptComments(source, start, end, filename, output, ['ts', 'typescript'].includes(language) ? ts.ScriptKind.TS : ts.ScriptKind.TSX);
89
+ }
90
+ else styleComments(source, start, end, filename, output);
91
+ cursor = match ? closing.lastIndex : source.length; inTag = false;
92
+ } else { if (source[cursor] === '<') inTag = true; else if (source[cursor] === '>') inTag = false; cursor++; }
93
+ }
94
+ }
95
+ return output;
96
+ }
@@ -0,0 +1,106 @@
1
+ // Interpret a bounded subset of uni-app conditions; never evaluate source code.
2
+ // Grammar and macro families: https://uniapp.dcloud.net.cn/tutorial/platform.html
3
+ const platforms = ['H5', 'APP-PLUS', 'APP-HARMONY', 'APP-ANDROID', 'APP-IOS', 'MP-WEIXIN', 'MP-ALIPAY',
4
+ 'MP-BAIDU', 'MP-TOUTIAO', 'MP-LARK', 'MP-QQ', 'MP-KUAISHOU', 'MP-JD', 'MP-360', 'MP-HARMONY',
5
+ 'MP-XHS', 'QUICKAPP-NATIVE', 'QUICKAPP-WEBVIEW-UNION', 'QUICKAPP-WEBVIEW-HUAWEI'];
6
+ const flags = ['WEB', 'APP', 'APP-VUE', 'APP-NVUE', 'APP-PLUS-NVUE', 'APP-UVUE', 'MP',
7
+ 'QUICKAPP-WEBVIEW', 'VUE2', 'VUE3', 'VUE3-VAPOR', 'UNI-APP-X'];
8
+ const known = new Set([...platforms, ...flags]);
9
+ export function uniConditionalError(filename, offset, reason, source = '') {
10
+ const prefix = (typeof source === 'string' ? source : '').slice(0, Math.max(0, offset)), lines = prefix.split(/\r\n|\r|\n/);
11
+ const line = lines.length, column = lines.at(-1).length + 1;
12
+ return Object.assign(new Error(`${filename}:${line}:${column}: ${reason}`), {
13
+ code: 'ENTROROVE_IMPORT_UNSUPPORTED', path: filename, line, column, loc: { start: { offset } } });
14
+ }
15
+ export function uniConditionalLimitError(filename, offset, reason, source = '') {
16
+ return Object.assign(uniConditionalError(filename, offset, reason, source), { code: 'ENTROROVE_SCOPE_LIMIT' });
17
+ }
18
+ const limit = (fail, reason) => Object.assign(fail(reason), { code: 'ENTROROVE_SCOPE_LIMIT' });
19
+ export function uniCondition(expression, fail) {
20
+ if (expression.length > 512) throw limit(fail, 'Conditional expression exceeds its 512-character bound');
21
+ const tokens = expression.match(/uniVersion|[A-Za-z_][A-Za-z0-9_-]*|\d+(?:\.\d+)?|\|\||&&|>=|<=|===|!==|==|!=|[!()<>]|\S/g) ?? [];
22
+ if (!tokens.length) throw fail('Conditional expression requires a supported expression');
23
+ if (tokens.length > 128) throw limit(fail, 'Conditional expression exceeds its 128-token bound');
24
+ let cursor = 0, depth = 0;
25
+ const versions = [], macros = new Set();
26
+ const atom = () => {
27
+ if (++depth > 24) throw limit(fail, 'Conditional expression exceeds its nesting bound');
28
+ let result; const token = tokens[cursor++];
29
+ if (token === '!') result = { kind: 'not', value: atom() };
30
+ else if (token === '(') { result = disjunction(); if (tokens[cursor++] !== ')') throw fail('Conditional parentheses are not balanced'); }
31
+ else if (token === 'uniVersion') {
32
+ const operator = tokens[cursor++], literal = tokens[cursor++], value = Number(literal);
33
+ if (!['>', '>=', '<', '<=', '==', '===', '!=', '!=='].includes(operator)
34
+ || !/^\d+(?:\.\d+)?$/.test(literal ?? '') || !Number.isFinite(value) || value > 1_000_000) {
35
+ throw fail('uniVersion requires a supported comparison with a finite nonnegative version literal');
36
+ }
37
+ versions.push(value); result = { kind: 'version', operator, value };
38
+ } else {
39
+ const name = token?.replaceAll('_', '-');
40
+ if (!known.has(name)) throw fail('Conditional macro is unknown; its build definition cannot be proven by this scanner');
41
+ macros.add(name); result = { kind: 'macro', name };
42
+ }
43
+ depth--; return result;
44
+ };
45
+ const conjunction = () => {
46
+ let left = atom();
47
+ while (tokens[cursor] === '&&') { cursor++; left = { kind: 'and', left, right: atom() }; }
48
+ return left;
49
+ };
50
+ const disjunction = () => {
51
+ let left = conjunction();
52
+ while (tokens[cursor] === '||') { cursor++; left = { kind: 'or', left, right: conjunction() }; }
53
+ return left;
54
+ };
55
+ const tree = disjunction();
56
+ if (cursor !== tokens.length) throw fail('Conditional expression uses unsupported syntax');
57
+ return { tree, versions, macros: [...macros], tokens: tokens.length };
58
+ }
59
+ export function evaluateUniCondition(node, context) {
60
+ if (node.kind === 'macro') return context.macros.has(node.name);
61
+ if (node.kind === 'not') return !evaluateUniCondition(node.value, context);
62
+ if (node.kind === 'and') return evaluateUniCondition(node.left, context) && evaluateUniCondition(node.right, context);
63
+ if (node.kind === 'or') return evaluateUniCondition(node.left, context) || evaluateUniCondition(node.right, context);
64
+ const a = context.version, b = node.value;
65
+ return ({ '>': () => a > b, '>=': () => a >= b, '<': () => a < b, '<=': () => a <= b,
66
+ '==': () => a === b, '===': () => a === b, '!=': () => a !== b, '!==': () => a !== b })[node.operator]();
67
+ }
68
+ function versionSamples(conditions, fail) {
69
+ const values = [...new Set(conditions.flatMap(condition => condition.versions))].sort((a, b) => a - b);
70
+ if (values.length > 8) throw limit(fail, 'Conditional versions exceed their eight-boundary inspection limit');
71
+ const samples = new Set([0, ...values]);
72
+ for (let index = 0; index < values.length; index++) {
73
+ const previous = values[index - 1] ?? 0;
74
+ if (values[index] > previous) samples.add(previous + (values[index] - previous) / 2);
75
+ }
76
+ if (values.length) samples.add(values.at(-1) + 1);
77
+ return [...samples];
78
+ }
79
+ function platformMacros(platform, engine) {
80
+ const macros = new Set([platform, engine.endsWith('2') ? 'VUE2' : 'VUE3']);
81
+ if (platform === 'H5') macros.add('WEB');
82
+ if (platform.startsWith('MP-')) macros.add('MP');
83
+ if (platform.startsWith('QUICKAPP-WEBVIEW')) macros.add('QUICKAPP-WEBVIEW');
84
+ if (platform.startsWith('APP-')) {
85
+ macros.add('APP'); macros.add(engine.startsWith('x') ? 'APP-UVUE' : engine.startsWith('nvue') ? 'APP-NVUE' : 'APP-VUE');
86
+ if (engine.startsWith('nvue')) macros.add('APP-PLUS-NVUE');
87
+ if (platform !== 'APP-HARMONY' && !engine.startsWith('x')) macros.add('APP-PLUS');
88
+ if (!engine.startsWith('x')) { macros.delete('APP-ANDROID'); macros.delete('APP-IOS'); }
89
+ }
90
+ if (engine.startsWith('x')) macros.add('UNI-APP-X');
91
+ if (engine === 'x-vapor') macros.add('VUE3-VAPOR');
92
+ return macros;
93
+ }
94
+ export function uniConditionContexts(conditions, fail) {
95
+ const samples = versionSamples(conditions, fail), output = [], seen = new Set();
96
+ for (const platform of platforms) for (const engine of ['vue2', 'vue3', 'nvue2', 'nvue3', 'x', 'x-vapor']) for (const version of samples) {
97
+ if (engine.startsWith('nvue') && !platform.startsWith('APP-')) continue;
98
+ const context = { macros: platformMacros(platform, engine), version, label: `${platform}/${engine}` };
99
+ const key = conditions.map(condition => evaluateUniCondition(condition.tree, context) ? '1' : '0').join('');
100
+ if (!seen.has(key)) {
101
+ seen.add(key); output.push({ ...context, key });
102
+ if (output.length > 64) throw limit(fail, 'Conditional compilation exceeds its 64-variant inspection bound');
103
+ }
104
+ }
105
+ return output;
106
+ }
@@ -1,10 +1,11 @@
1
1
  import path from 'node:path';
2
2
  import { promises as fs } from 'node:fs';
3
- import { scopeFail, scopePath, scopeRead, scopeTarget } from './local-scope-files.mjs';
3
+ import { scopeFail, scopePath, scopeBuildSourceRead, scopeTarget } from './local-scope-files.mjs';
4
+ import { observeScopeDirectory } from './local-scope-read-set.mjs';
4
5
 
5
6
  async function manifest(root, relative, input) {
6
7
  try {
7
- const read = await scopeRead(root, relative, input);
8
+ const read = await scopeBuildSourceRead(root, relative, input);
8
9
  return { value: JSON.parse(read.content.toString('utf8')), path: relative, sha256: read.sha256 };
9
10
  } catch (error) {
10
11
  if (error.code === 'ENOENT') return null;
@@ -19,7 +20,7 @@ async function patterns(root, input) {
19
20
  if (!Array.isArray(result)) result = result.packages;
20
21
  if (!Array.isArray(result) || result.some(pattern => typeof pattern !== 'string')) scopeFail('ENTROROVE_PACKAGE_INVALID', 'workspace patterns must be a literal string array');
21
22
  try {
22
- const read = await scopeRead(root, 'pnpm-workspace.yaml', input); const yaml = read.content.toString('utf8'); let active = false;
23
+ const read = await scopeBuildSourceRead(root, 'pnpm-workspace.yaml', input); const yaml = read.content.toString('utf8'); let active = false;
23
24
  metadata.push({ path: 'pnpm-workspace.yaml', sha256: read.sha256 });
24
25
  for (const line of yaml.split('\n')) {
25
26
  if (/^packages:\s*$/.test(line)) { active = true; continue; }
@@ -32,14 +33,25 @@ async function patterns(root, input) {
32
33
  } catch (error) { if (error.code !== 'ENOENT') throw error; }
33
34
  return { patterns: [...new Set(result)], metadata };
34
35
  }
36
+ async function directoryNames(root, parent) {
37
+ const target = await scopeTarget(root, parent);
38
+ if (!target.stat.isDirectory()) scopeFail('ENTROROVE_PACKAGE_INVALID', 'workspace parent must be a real directory');
39
+ const names = [], directory = await fs.opendir(target.target);
40
+ for await (const entry of directory) {
41
+ if (names.length >= 10_000) scopeFail('ENTROROVE_SCOPE_LIMIT', 'workspace directory exceeds its bounded entry inspection');
42
+ names.push(entry.name);
43
+ }
44
+ return names.sort();
45
+ }
35
46
  async function packageDirectories(root, pattern) {
36
47
  if (!pattern.includes('*')) { scopePath(pattern); return [pattern]; }
37
48
  if (!pattern.endsWith('/*') || pattern.slice(0, -2).includes('*')) scopeFail('ENTROROVE_PACKAGE_INVALID', 'workspace glob needs a literal parent and a single terminal wildcard');
38
49
  const parent = scopePath(pattern.slice(0, -2)); const item = await scopeTarget(root, parent, true);
39
50
  if (!item.exists) return [];
40
51
  if (!item.stat.isDirectory()) scopeFail('ENTROROVE_PACKAGE_INVALID', 'workspace parent must be a real directory');
41
- const result = [];
42
- for (const name of (await fs.readdir(item.target)).sort()) {
52
+ const result = [], names = await directoryNames(root, parent);
53
+ observeScopeDirectory(root, parent, names, () => directoryNames(root, parent));
54
+ for (const name of names) {
43
55
  const directory = `${parent}/${name}`; const target = await scopeTarget(root, directory);
44
56
  if (target.stat.isDirectory()) result.push(directory);
45
57
  }
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "entrorove.skill-manifest/1.0",
3
3
  "name": "entrorove",
4
- "version": "0.1.69",
4
+ "version": "0.1.71",
5
5
  "endpoint": "https://entrorove.com",
6
6
  "requestSchemaVersion": "entrorove.skill.request/2.0",
7
7
  "supportedRequestSchemaVersions": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entrorove/skill",
3
- "version": "0.1.69",
3
+ "version": "0.1.71",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "entrorove": "cli.mjs"
@@ -311,7 +311,21 @@
311
311
  "package-archive.mjs",
312
312
  "package-replacement.mjs",
313
313
  "rollback-history.mjs",
314
- "rollback-runner.mjs"
314
+ "rollback-runner.mjs",
315
+ "scope-context-journal.mjs",
316
+ "cloud-locale.mjs",
317
+ "cloud-locale.d.mts",
318
+ "local-scope-uni-expressions.mjs",
319
+ "local-scope-uni-directives.mjs",
320
+ "local-scope-uni-conditional.mjs",
321
+ "local-scope-uni-build.mjs",
322
+ "local-scope-read-set.mjs",
323
+ "release-source-groups.mjs",
324
+ "local-scope-build-read.mjs",
325
+ "local-scope-build-io.mjs",
326
+ "local-scope-build-facts.mjs",
327
+ "local-scope-build-data.mjs",
328
+ "local-scope-build-readset.mjs"
315
329
  ],
316
330
  "scripts": {
317
331
  "test": "node test/run.mjs",
@@ -0,0 +1,39 @@
1
+ export const swarmSourceFiles = Object.freeze([
2
+ 'local-swarm-authority.mjs',
3
+ 'local-swarm-baseline.mjs',
4
+ 'local-swarm-completion.mjs',
5
+ 'local-swarm-contracts.mjs',
6
+ 'local-swarm-mutation.mjs',
7
+ 'local-swarm-priority.mjs',
8
+ 'local-swarm-state.mjs',
9
+ 'local-swarm-storage.mjs',
10
+ 'local-swarm.mjs',
11
+ ])
12
+ export const coordination17SourceFiles = Object.freeze([
13
+ 'local-autocoord17-authority.mjs',
14
+ 'local-autocoord17-controller.mjs',
15
+ 'local-autocoord17-peers.mjs',
16
+ 'local-autocoord17-store.mjs',
17
+ 'local-autocoord17-tasks.mjs',
18
+ 'local-autocoord17-waits.mjs',
19
+ 'local-validator-isolation17.mjs',
20
+ 'local-calctool-composition17.mjs',
21
+ ])
22
+ export const preservedMutationSourceFiles = Object.freeze([
23
+ 'local-preserved-mutation-protection.mjs', 'local-preserved-mutation-signer.mjs',
24
+ 'local-preserved-mutation-state.mjs', 'local-preserved-mutation-wire.mjs',
25
+ 'local-delegated-modify-analysis.mjs', 'mutation-client.mjs', 'cloud-mutation-authority.mjs',
26
+ ])
27
+ export const memberContinuationSourceFiles = Object.freeze([
28
+ 'connected-cli.mjs',
29
+ 'local-approved-process.mjs',
30
+ 'local-approved-supervisor.mjs',
31
+ 'local-mutation-consumption.mjs',
32
+ 'workflow-local-acceptance.mjs',
33
+ 'workflow-observation-client.mjs',
34
+ 'workflow-observation-connection.mjs',
35
+ 'workflow-observation-remote.mjs',
36
+ 'workflow-observation-runner.mjs',
37
+ 'workflow-observation-state.mjs',
38
+ 'workflow-observation-wire.mjs',
39
+ ])
@@ -1,15 +1,24 @@
1
1
  {
2
2
  "schemaVersion": "entrorove.release-state/1.0",
3
- "version": "0.1.69",
4
- "digest": "4302b1f59039183c75228114755903be6ee5974bfdb95b6f7f72596f1039ff58",
3
+ "version": "0.1.71",
4
+ "digest": "365984167bef91bf1b780eb3c479b0d0fddd6ba79b2df59bc6ae9c8dc4f48e15",
5
5
  "files": {
6
- "scope-context-client.mjs": "a21cfe75b3e13a5c5c0619cf14c84c579289d98221c6e280019dbecebfb444b9",
7
- "scope-context-observer.mjs": "533d5096fd7f17ec255b2a7b308162e093179c1bb1f1db976aef072b8ddae76f",
6
+ "release-source-groups.mjs": "6dc0915b79aa495759e7fd1e8dfebde36ab2b6e50f22a2d716eca14b5f9957f9",
7
+ "local-scope-build-read.mjs": "361d4b461cfa2c77b4ec22bc59a0a1c78fed2cfb0ea2e05a8da5c2551ecd88ac",
8
+ "local-scope-build-io.mjs": "8af69722738fa094780f9a2dfcddaf12993fc3b936a75c56c4b0d4f90cb20fd1",
9
+ "local-scope-build-facts.mjs": "8b0bd19347d06d1cb66d8cd2d6784103af9d00ea691d7f4acea523d994b874fb",
10
+ "local-scope-build-data.mjs": "b6e272ca4385629326b4517a53408c561272f5f1a01e5b701f17eaa4c5e64b2e",
11
+ "local-scope-build-readset.mjs": "fd1cb1470c54b3902a4612056281746e947cf96d1f5c03a09ea0becbcd79cc45",
12
+ "scope-context-client.mjs": "dbfec7db0e118f3025a0e45475f3328a171e4cd1dd86e6c8d326d779ce61b459",
13
+ "scope-context-observer.mjs": "25a84339512c1e80711aca53baed20da556fa2ae5d84e83fa95d58dcdca7cf7d",
8
14
  "scope-context-observation.mjs": "d92f2fca3c923caa6f0c5c9cc60b4f12bdae212071da64da6692e3e99b251969",
9
15
  "scope-context-remote.mjs": "b52cdee03e845edc15eae6bb3ccfaea9c4482c03f2fae7001439e4abcb2acd33",
10
16
  "scope-context-state.mjs": "7bc434620bfc505ee290f1977e64ef22e50f72665d75e7dfd6805deab4e81826",
11
17
  "scope-context-wire.mjs": "a15d0b966615b8293e53e4229edc8fb444fb144cc336dbd6354ac995f33e8cc8",
12
- "scope-context-release.mjs": "32238648219cd35a9b2c4bc01784d2150af57df16da2975fd93e94ab4f3e6065",
18
+ "scope-context-journal.mjs": "753821f546e36185b2e891e8f38758a2d15a591f700f0650d478892c8d958a45",
19
+ "scope-context-release.mjs": "3b6f5d3bf7abe25e1a1edd0521053f4c1b1e3487b7f37d5f7c6080d32bc0c044",
20
+ "cloud-locale.mjs": "0627ac75b98b439563b61ab217aacb55a099c1d0c8ed3b118776d2007c52dd70",
21
+ "cloud-locale.d.mts": "aff4bced9bbac140f73fd0de24681287349389be5750d89d96abe0f8a2167664",
13
22
  "cloud-task-images.mjs": "a260a94b6b1b47df97a8cc8657dfdce1fd37ec752f1cc2bad2542eaa28622bdb",
14
23
  "model-images.mjs": "ab85ac0c44d857c1f460de3e9c06eb1d37b57688b4a6061405c0a44ae4d40bd7",
15
24
  "model-images.d.mts": "f1506cfb8ad287869f92f4d9074c7c759c6c28b182aeb325dd5f22a38926f24c",
@@ -41,7 +50,7 @@
41
50
  "local-preserved-mutation-signer.mjs": "2b0771cbdd18ba00267aa441b7892cd04feab9f8543ae5e2703430b1e580747f",
42
51
  "local-preserved-mutation-state.mjs": "337a172b2d0a03b0d5a89b8483afdd9a043a4999fe38f87679633c98c450126b",
43
52
  "local-preserved-mutation-wire.mjs": "6768ce5713d70f7c0bd05f2286bc4b32cd9b8bb1d3c8b9cc7a451cb9b176824d",
44
- "local-delegated-modify-analysis.mjs": "f87148ddb023b79e241ca97db582991da8d0e1a51b26b1d9bc2799a76efd7297",
53
+ "local-delegated-modify-analysis.mjs": "f8769bd9890a041be48db5cb6724873d59300c102a5ddaf0a937e5e4f3f1983a",
45
54
  "mutation-client.mjs": "8f1066db3246f7639dd0b557e7b2c6175181e52f9087146e218d0912f791808e",
46
55
  "cloud-mutation-authority.mjs": "c7226e882a4f3be4d2f55728f515d5a815c0aa1f21aa5e4689314e6e6a8c66a2",
47
56
  "ide-code-mode.mjs": "f8ba4de33632ab4c6df52dab52f392414b4632c7e94b218b8065677970c075c7",
@@ -73,7 +82,7 @@
73
82
  "runtime/validator-runtime-v7.0.44.d.mts": "7797edbfe2f7de24da370204dce4dfd22822a1bd80df93514fff900b98afe36f",
74
83
  "snapshot-retention.mjs": "ca46aeb36b1a5a24fe7e967031a71b9a3d33f40cb715d344402cbe0dc9c425cb",
75
84
  "snapshot-cleanup-journal.mjs": "76a9684cc95b4eb076e1298d78a9dff37948b00d9607b8f546c599072d3ed331",
76
- "IDE-EXECUTION.md": "1b58e8ef0c4c95606184ba24bd0b674e3f318000d4164ec40989bda5e1eb645f",
85
+ "IDE-EXECUTION.md": "26d4f32de1694c7f29ceefc5a5e5f4bba717efc5f91c37a91c399faa1574a191",
77
86
  "REUSE-DISCIPLINE.md": "a2452911c2b50c4762b4a1374f1958059eb03efd59f63e1b50e1650c52b0dc98",
78
87
  "install-identity.mjs": "41b8c8d8b3e265d2057a07bf7dc98066c34d6b05c65bf7159ca9609c01ee4646",
79
88
  "package-archive.mjs": "e06db8d709db8710bead254ee950b78928088be01c58dcea383beaa5eb574e59",
@@ -91,7 +100,7 @@
91
100
  "design-declaration.mjs": "f6c7f56e4697a05a0a832fcdb5a3b07ffe60aa602ba0681cfd09948bdcafc8ad",
92
101
  "design-frameworks.mjs": "5d09a8e56068302f951a6236f36cb50e655fb6d6ffbeb2e4eb4b19f025c8a411",
93
102
  "design-gate.mjs": "567eb666937704123ef72f26ad1145d9d32f7dfde59553381286de083e4146cb",
94
- "design-lint.mjs": "9e27d0a6041fbb7f7f2b88b0c46d69dd790582426b534ad436b151d81512a66e",
103
+ "design-lint.mjs": "76adb33d0faf0cfcdef7583a2f4835eccc7e49811480e2fd2b09779a81c0cbab",
95
104
  "design-local-contracts.mjs": "f331bd1d21f30994596bd9c46008e551f3ed2b6d5eea19d4546c7da0663b768a",
96
105
  "design-operations.mjs": "e21e9fcf9fd16115c72558c7cd7a57f7213a30934bde0f1b649aec647d1205f7",
97
106
  "design-policy.d.mts": "48fed97fca0f97fef786f182f666d7e6e33efb814cda1991239e1c38984cf80e",
@@ -149,13 +158,13 @@
149
158
  "install-cleanup.mjs": "8a8e1a7dfe37427f86cd4d6e317890d0829894a9949d4216674a716b36edbc54",
150
159
  "review-client.mjs": "3491eef68ed533174b31db3c53febb6519b8f088f71a9964644714a9a4c03c77",
151
160
  "version.mjs": "85284d4cd5e3314b449e6ae124243f96397bcc274817b5983a79cfdd903d46fd",
152
- "SKILL.md": "4722190a3110d40ab7b18dcdcdf53bd6b378f5dd6015c7e6855773456d236198",
161
+ "SKILL.md": "910bc4b97159582d6faa6e34785d94b8b7cd484b9a39ef4106edcffc767be9d2",
153
162
  "CAPABILITY-MAP.md": "517809bb20750e5de89b2dab5705c902a27fa68cf4f3f392a5d8cf2f19818888",
154
163
  "AGREEMENT.md": "f93a68e92c457200dd024610e65f74e478b8f60860f951da818b70561f1b9bf8",
155
164
  "DELIVERY-BOUNDARIES.md": "cb23ce71b2197085c8441ba7c5b6c05fb21f2a954bf66b4d60cfef8b15895b8b",
156
- "package.json": "68c2b335cd192d783a516de6b5449e284e16a1c3eb4adb4e7717f5d002282dcc",
165
+ "package.json": "6aeead2f5dd48f4715cf45c0695f8462c362cdc3c2929439565f201b2576bd2f",
157
166
  "manifest.json": "ab06e307795bc9da5add926752b6c4dbdaf18625090261a035aa356a679c504f",
158
- "release.mjs": "575204085e0595cc7073a78f321d8c9243cd2c0910a6d15951efe8d93ba77512",
167
+ "release.mjs": "a1c8f8a6945687658e43f75892bfcca58dee6c4947dc9ea002f31bee0ab67538",
159
168
  "local-cli.mjs": "058ac9a4653bc12e0d031b72034ebfe6a72b91b9b23353b9fee04881c7d2e098",
160
169
  "local-state-lock.mjs": "1dbf64264642a0851faf043e07ee9f66d2ad0508e9f799b0626246e42fae893e",
161
170
  "local-execution.mjs": "721ed7d29bbe4ce6d088909cd84ffc440978c3c9eb0946c49a4281ee685fe3aa",
@@ -184,17 +193,22 @@
184
193
  "local-budget-handoff-contracts.mjs": "bb53ebf135ec7ecfbecee858cfb354f03fee9cfb3940fa5d967d45008bf9aac5",
185
194
  "local-budget-lock.mjs": "ab0722630e1792843a94a6d01e79422cd578fe9e4d423b59d63e636770381236",
186
195
  "local-budget-handoff-completion.mjs": "f8bc45df7c18a064d0b5aac7338131deb709da5193bfe9a1d20300585ea9acb6",
187
- "local-budget-reads.mjs": "9baa12cbebe84a8abf1e55cbf02eb5414540973bde804d96609e914169bef5b1",
196
+ "local-budget-reads.mjs": "91eab0bf12a057709a6d5685c5602debe5299a58fbd6624f6e0d0f3876dc918b",
188
197
  "local-budget-source-bindings.mjs": "cfe97b257fd2da0dd45f95f5e45be20baa6445d11ac6d03538a0105b4985b8ff",
189
198
  "local-budget-store.mjs": "2ae36c977ecd32d81f88e2eaa697ce8c228cb4405ecc5c4169cdda104c8ce138",
190
199
  "local-budget-transition.mjs": "3894f05d4b5d4d6e16e3f201ff8902e6311cf6434010262934e0d1251aa8b9f0",
191
- "local-budget.mjs": "857bf879addbfbc13bd95d0957b223e05e73a69b8092f1d1933f09ff7968659a",
200
+ "local-budget.mjs": "378348e583d6889a731679e1427e645f56f6cb7c547d48d300e00b9e10050516",
192
201
  "local-flow-lifecycle.mjs": "47534e16599002e5e7cf7d3e95195f4d7a364d2b651ec339d8c6c017d71c1b05",
193
202
  "local-stage-boundary.mjs": "84c3bb5beab29306274c5ca8a78f19a83ed664ae1b93a8372bb493158b304fe3",
194
203
  "local-scope-candidate.mjs": "8f0bd9606e70d4a0ebacdd3cd600ec3afed85e2bb3e1760aa1144cf55d4e028a",
195
204
  "local-scope-context.mjs": "79753abfc6c76089d17f003a1be537dfaea10d6731c542f7fc53f2a9996ed164",
196
- "local-scope-files.mjs": "db8b3baf8118c6cfd5525cbc008e054f9f33390b9ffce5ba72ee986b832f33e3",
197
- "local-scope-repository.mjs": "df584d45473353a19d9b5238c814456362f3004c9db183fca66f64c1fa86ec34",
205
+ "local-scope-files.mjs": "b8c98b8ca8bb4953f3d2d9ae1fa71b2a54286032c9dd660d3061b584e77778cb",
206
+ "local-scope-repository.mjs": "fe5187824744233b9fce59d7b964a3f24349a3fe31415181654a1b3a70e8de9c",
207
+ "local-scope-read-set.mjs": "a5137d2e7ecffe669143fb51f0f3fba7526a881b512269858ea1e3504d9a50b2",
208
+ "local-scope-uni-expressions.mjs": "626247c87a4fd5f6162e548aa907d3f983d5a77d341e640b6f42a539f0c84405",
209
+ "local-scope-uni-directives.mjs": "e546be317962e30a3547aea376db9a7b8d7641055daf9e3dce4a9ef55cd872af",
210
+ "local-scope-uni-conditional.mjs": "f143a142af069279fcac0a01206744ce323c8dfc4496c2f6cc1f0b229c4e5f5e",
211
+ "local-scope-uni-build.mjs": "1dafd4802859b4c53504395f6186b003ee2657fc16f373ca2637e438e4d1b9e5",
198
212
  "local-scope-create-require.mjs": "6b6a209bfcad8fe1398e99c5c8cc3af189c120b9c38e244a73dd1a99c3d91295",
199
213
  "local-scope-require-resolution.mjs": "b24596462c8776cbefa6f0a74749d665aa928d1643c68d44798eb93e2dd5ad42",
200
214
  "local-scope-git.mjs": "53bbbb6c4795db711b5bc164591a6ad79a561427da046d6bbe997dae6eb82829",
@@ -220,15 +234,15 @@
220
234
  "local-budget-git-system-attributes.mjs": "367a4e5a88490c4d4c3717bc893a271970fe70d7705f0c1c72d6f76a442d5d21",
221
235
  "runtime/git-native-linux-v1.mjs": "cf5cb91426a105e62c0f07a8a230dec592dba46f85a3f708b4c4e8cfcd1126c6",
222
236
  "runtime/git-native-darwin-v1.mjs": "f88aab72dc86f94eb1115784872957cb8ed0f74205ae70e1ecd1939e7790e310",
223
- "local-scope-signature.mjs": "99b7d9e563d897c1f1bcf70894cd6370dd41ddf9a136c20822083481ef706fca",
237
+ "local-scope-signature.mjs": "3804b84d5ddca5c1ac991b31151d84cddc508517eff7500351ba1bcffdf3c672",
224
238
  "local-scope-config-imports.mjs": "a399407227bbdd14468633bb6d25586df7c6a30a1ef0d1a80ab7c7b499d3fadf",
225
239
  "local-scope-config-extends.mjs": "3ab4150b846b247e9e0851221123f220c5574699af651830e751f026ab33659e",
226
240
  "local-scope-snapshot.mjs": "c0f851470b98863a1d187825ed61ee6072d1c057b178fdc85ae29af02a3b250f",
227
- "local-scope-state.mjs": "8b600a91fc0068d7a8c0bb752ddba7ed30ada93daafb118d6cba2368fd94cb27",
228
- "local-scope-workspaces.mjs": "a44c34537e5ed2dcaf193a985e5bc05957989fbb160a650f9e37ba7d66eb2de8",
241
+ "local-scope-state.mjs": "7a6d275d6267a4d0bb55582e1bcc7654c502ecba9221b84b2149a98f0ee7518f",
242
+ "local-scope-workspaces.mjs": "8a75ce7b6639b5682370b5738c5c2a90408e3130729608e008f03053cd50351f",
229
243
  "local-task-routing.mjs": "6e2e506b2fb0e2e8d8c5147d7df32849b57a4e94a23634f01a355d45735858e4",
230
244
  "remote-client.mjs": "d30fd61fab3171a9e41546706a57ae372786d20ea9e9c01cad39d9863c156b40",
231
- "cloud-task-client.mjs": "603a7de8e1d56a77588f08f7d1ae93685b553b40815e268d7bd17018eb767c37",
245
+ "cloud-task-client.mjs": "f9085c5e6af6f179282670d2e872b85bfabac2657d3d232b1246dc23f5a6ccdd",
232
246
  "scope-runner-client.mjs": "b85999bca05efd804325f97b6e5704623ac3fcf751c6f9760717a23f40661ad1",
233
247
  "scope-amendment-client.mjs": "64a38deddc2dbfae543fead2cff8c9c78771b576391cc903aa58db925a138ad7",
234
248
  "scope-amendment-state.mjs": "922c4fd5a71101651d40fdb11f94f09c904cc244ff2574ae6b6ee004448aad06",
@@ -240,9 +254,9 @@
240
254
  "native-client.mjs": "6f5575909bae9daba643287f876ffa0f9ff1c53a367b32a40145d740456d6605",
241
255
  "native-notification.mjs": "8859a26c6f13d222711f763acf49ed8546b3306cf71f990643ac31a5ccaf1ba1",
242
256
  "local-peer-status.mjs": "a971bcc69d60bb32b875ca5bb4297d948631d5d2821b812c279613ea059a8b4f",
243
- "cloud-watch-client.mjs": "5b93935c19a104d72afed07d4a56746c9617707e075884b93d22050c95cee0c1",
257
+ "cloud-watch-client.mjs": "2042392cd62f1596a35ef3f6cb376f8ed67790351576b007e32f134ce018aec1",
244
258
  "cloud-event-stream.mjs": "e0eec9fc3e0613094523929634f25030df5ca5c5b5fe2c1e1a4586ab10574808",
245
- "ide-presentation.mjs": "3bac21bfc824fcdad63aafb0d7c3326cd6456923f4224106dd5c38682060f315",
259
+ "ide-presentation.mjs": "d826afe0dfcc38906ba76dcbbe021807731587c38026148624546c334057e7f3",
246
260
  "automatic-feedback-client.mjs": "532312d29e66fa211ea3fe879d9add1dd48841ee5ce82800b4b06252a160a255",
247
261
  "task-entry-client.mjs": "940fb068afe28a2a34fe96e285e149afdd9ba79649c0c65cde37ec4ed71ae39d",
248
262
  "task-identity.mjs": "e0e6cf1f48bfa5ee3c5cb86a3c21adfce6d66b4220f4a164ca099263c7a09fb4",
@@ -271,7 +285,7 @@
271
285
  "local-contract-types.mjs": "85e71fa4dd67e351a4b67573c740bcdb1661cede53f097189f11837771e75e91",
272
286
  "local-archguard-ast.mjs": "7ff7df9dab0d98ed62983add751c80edea598bc94ef4f38ede0ebd4d41226c87",
273
287
  "local-archguard-checkpoint.mjs": "37896902520cc995720c96288e4a5ed3585952b55c9c35be281f91fa754c71ec",
274
- "local-archguard-components.mjs": "a8fb3d0fd787f9160905013fd333cc0b9e8cf624cce797461f36f4ab31d170ad",
288
+ "local-archguard-components.mjs": "07d0554355eebba7989b373d019682d194a0d37a031abbcc6b4b24b19f0a75e8",
275
289
  "local-archguard-contract.mjs": "cfc397a1ce171ab84f8bf1db152e6d8d280b7ca041da56a7a4cd62b02c2e2e89",
276
290
  "local-archguard-contracts.mjs": "29e9b86f14dc086aa0b791c874d6efc50d849f806b3f2b8725481114f01ba8ba",
277
291
  "local-archguard-evaluate.mjs": "c34f0956e7a4f1afaa1554c03e238a350dc8a981dc595cf4ed065fb14f733f93",
package/release.mjs CHANGED
@@ -9,47 +9,10 @@ import { fileURLToPath } from 'node:url'
9
9
  import { chainReleaseLabels } from './local-chain-release-labels.mjs'
10
10
 
11
11
  const directory = path.dirname(fileURLToPath(import.meta.url))
12
- const swarmSourceFiles = Object.freeze([
13
- 'local-swarm-authority.mjs',
14
- 'local-swarm-baseline.mjs',
15
- 'local-swarm-completion.mjs',
16
- 'local-swarm-contracts.mjs',
17
- 'local-swarm-mutation.mjs',
18
- 'local-swarm-priority.mjs',
19
- 'local-swarm-state.mjs',
20
- 'local-swarm-storage.mjs',
21
- 'local-swarm.mjs',
22
- ])
23
- const coordination17SourceFiles = Object.freeze([
24
- 'local-autocoord17-authority.mjs',
25
- 'local-autocoord17-controller.mjs',
26
- 'local-autocoord17-peers.mjs',
27
- 'local-autocoord17-store.mjs',
28
- 'local-autocoord17-tasks.mjs',
29
- 'local-autocoord17-waits.mjs',
30
- 'local-validator-isolation17.mjs',
31
- 'local-calctool-composition17.mjs',
32
- ])
33
- const preservedMutationSourceFiles = Object.freeze([
34
- 'local-preserved-mutation-protection.mjs', 'local-preserved-mutation-signer.mjs',
35
- 'local-preserved-mutation-state.mjs', 'local-preserved-mutation-wire.mjs',
36
- 'local-delegated-modify-analysis.mjs', 'mutation-client.mjs', 'cloud-mutation-authority.mjs',
37
- ])
38
- const memberContinuationSourceFiles = Object.freeze([
39
- 'connected-cli.mjs',
40
- 'local-approved-process.mjs',
41
- 'local-approved-supervisor.mjs',
42
- 'local-mutation-consumption.mjs',
43
- 'workflow-local-acceptance.mjs',
44
- 'workflow-observation-client.mjs',
45
- 'workflow-observation-connection.mjs',
46
- 'workflow-observation-remote.mjs',
47
- 'workflow-observation-runner.mjs',
48
- 'workflow-observation-state.mjs',
49
- 'workflow-observation-wire.mjs',
50
- ])
12
+ import { swarmSourceFiles, coordination17SourceFiles, preservedMutationSourceFiles, memberContinuationSourceFiles } from './release-source-groups.mjs'
51
13
  const sourceFiles = [
52
- ...SCOPE_CONTEXT_SOURCE_FILES, 'cloud-task-images.mjs', 'model-images.mjs', 'model-images.d.mts', 'cli-input.mjs',
14
+ 'release-source-groups.mjs', 'local-scope-build-read.mjs', 'local-scope-build-io.mjs', 'local-scope-build-facts.mjs', 'local-scope-build-data.mjs', 'local-scope-build-readset.mjs',
15
+ ...SCOPE_CONTEXT_SOURCE_FILES, 'cloud-locale.mjs', 'cloud-locale.d.mts', 'cloud-task-images.mjs', 'model-images.mjs', 'model-images.d.mts', 'cli-input.mjs',
53
16
  'scope-amendment-retirement.mjs', 'scope-amendment-consumption.mjs', 'mutation-connection-state.mjs', 'mutation-challenge-refresh.mjs',
54
17
  'local-scope-font.mjs', 'local-scope-zip.mjs', 'member-producer-repair-authority.mjs',
55
18
  'local-mutation-completion-evidence.mjs', 'local-mutation-environment-observation.mjs', 'local-mutation-finder-observation.mjs', 'local-finder-store.mjs', 'local-finder-plist.mjs',
@@ -91,7 +54,7 @@ const sourceFiles = [
91
54
  'local-scope-candidate.mjs',
92
55
  'local-scope-context.mjs',
93
56
  'local-scope-files.mjs',
94
- 'local-scope-repository.mjs',
57
+ 'local-scope-repository.mjs', 'local-scope-read-set.mjs', 'local-scope-uni-expressions.mjs', 'local-scope-uni-directives.mjs', 'local-scope-uni-conditional.mjs', 'local-scope-uni-build.mjs',
95
58
  'local-scope-create-require.mjs',
96
59
  'local-scope-require-resolution.mjs',
97
60
  'local-scope-git.mjs',
@@ -342,6 +305,8 @@ const archguardReleaseLabels = {
342
305
  }
343
306
  function releaseLabels() {
344
307
  return withFinalGate16ReleaseLabels({ ...designGateReleaseLabels, ...reuseDisciplineReleaseLabels, ...calctoolReleaseLabels, ...mutationReleaseLabels, ...swarmReleaseLabels, ...coordination17ReleaseLabels, ...nativeReadReleaseLabels, ...feedbackReleaseLabels, ...invocationReleaseLabels, ...chainReleaseLabels, ...taskEntryReleaseLabels, ...archguardReleaseLabels,
308
+ ...Object.fromEntries(['local-scope-build-read.mjs', 'local-scope-build-io.mjs', 'local-scope-build-facts.mjs', 'local-scope-build-data.mjs', 'local-scope-build-readset.mjs', 'local-scope-uni-build.mjs', 'local-scope-uni-expressions.mjs', 'local-scope-uni-directives.mjs', 'local-scope-uni-conditional.mjs'].map(name => [name, { zh: '源码事实与未知构建行为分离', en: 'raw source facts and opaque build observation' }])),
309
+ 'release-source-groups.mjs': { zh: '自动版本源文件清单', en: 'automatic version source inventory' },
345
310
  ...Object.fromEntries(['cloud-task-images.mjs', 'model-images.mjs', 'model-images.d.mts', 'cli-input.mjs'].map(name => [name, { zh: '受限图片输入通道', en: 'bounded image input channel' }])),
346
311
  ...Object.fromEntries(['scope-amendment-retirement.mjs', 'scope-amendment-consumption.mjs', 'mutation-connection-state.mjs', 'mutation-challenge-refresh.mjs', 'member-producer-repair-authority.mjs'].map(name => [name, { zh: '原授权恢复与请求生命周期', en: 'original-authority recovery and request lifecycle' }])),
347
312
  ...Object.fromEntries(['local-scope-font.mjs', 'local-scope-zip.mjs'].map(name => [name, { zh: '字体与 ZIP 完整结构核验', en: 'font and ZIP structural verification' }])),
package/releases.json CHANGED
@@ -1,4 +1,16 @@
1
1
  [
2
+ {
3
+ "version": "0.1.71",
4
+ "date": "2026-10-20",
5
+ "zh": "通用分离源码依赖事实与未知构建行为:动态配置、宏及加载器保留真实哈希与只读来源,不执行项目代码,不把构建未知标为完整。原审批与独立 S/M 签名仅允许已知源码的非结构修改;隐私文件、路径、资源预算、未知目标及配置漂移继续明确拒绝,实际构建与测试仍需原流程验收。",
6
+ "en": "Separate raw source dependency facts from opaque build behavior across projects. Preserve actual hashes and read-only origins for dynamic configuration, macros and loaders without executing project code or claiming compiled completeness. Original approvals and separate S/M signatures permit only known-source nonstructural modifications; private files, unsafe paths, resource budgets, unknown targets and configuration drift remain explicit refusals. Actual builds and tests still require original-flow acceptance."
7
+ },
8
+ {
9
+ "version": "0.1.70",
10
+ "date": "2026-10-20",
11
+ "zh": "云端沙箱固定中英文输出语言,界面、通知和 Blueprint 文档正文按对应语种显示,原始证据单列来源并保留旧流程精确版本。修复 uni-app 默认条件编译分支解析与长扫描后的原任务签名挑战衔接,核对真实读集并保留原审批、完整路径、快照及失败历史。",
12
+ "en": "Freeze cloud sandbox output language across presentation, notifications and Blueprint document prose; preserve original source evidence and exact historical runtimes. Fix default uni-app conditional branch inspection and renew the original signing challenge after long scans, rechecking actual reads while retaining approvals, complete paths, snapshots and failure history."
13
+ },
2
14
  {
3
15
  "version": "0.1.69",
4
16
  "date": "2026-10-20",