@lazyingart/agintiflow 0.20.302 → 0.20.303

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.
@@ -650,3 +650,28 @@ append-only repairs when replacement is required, and caps repair schemas so a
650
650
  small local model receives only the actionable tool surface. Focused coding,
651
651
  truthful-completion, writing-routing, progressive-tool, document-quality, and
652
652
  dynamic-budget suites pass. These fixes are prepared for AgInTiFlow `0.20.302`.
653
+
654
+ ### Host-scoped deliverables without false source mutation
655
+
656
+ LabCanvas research run `browser-agent-stale-ui-research-085` showed that
657
+ DeepSeek had already completed current web research and written valid task
658
+ artifacts, but AgInTiFlow rejected `finish` because every file-producing task
659
+ inherited a fresh project-source mutation requirement. The artifact directory
660
+ was intentionally excluded from project mutation accounting, so the runtime
661
+ could never satisfy its own gate and eventually reached the step limit.
662
+
663
+ The runtime now distinguishes a requested deliverable inside the host-owned
664
+ artifact root from a requested source-code change. Reports, notes, PDFs,
665
+ figures, CAD, presentations, and similar scoped outputs may complete from their
666
+ verified artifact evidence without fabricating a repository edit. A request to
667
+ fix, implement, or modify project source still requires a fresh project
668
+ mutation, even when it also asks for a sidecar report.
669
+
670
+ Fresh LabCanvas retest `browser-agent-stale-ui-research-086` used the same
671
+ imperfect prompt and a new persistent AgInTi session. It recovered a malformed
672
+ DeepSeek tool call, ran web research, wrote and registered two substantial
673
+ Markdown artifacts with current primary-source citations, separated
674
+ demonstrated evidence from inferred recommendations, and finished normally.
675
+ The retained trace contains no completion-evidence rejection or forced
676
+ source-mutation loop. Focused completion, evidence, progressive-tool, runtime,
677
+ and dynamic-budget suites plus the full npm suite pass for `0.20.303`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazyingart/agintiflow",
3
- "version": "0.20.302",
3
+ "version": "0.20.303",
4
4
  "type": "module",
5
5
  "description": "AgInTiFlow is a project-aware agent workspace for hybrid wet-dry R&D, hardware-aware intelligence, software automation, and industrial workflows.",
6
6
  "license": "Apache-2.0",
@@ -230,7 +230,7 @@
230
230
  "publish:env": "node scripts/npm-publish-from-env.js publish --access public",
231
231
  "publish:env:whoami": "node scripts/npm-publish-from-env.js whoami",
232
232
  "pretest": "npm run smoke:planning-timeout-recovery",
233
- "test": "npm run check && npm run smoke:integration-production-mount && npm run smoke:integration-production-runtime-bundle && npm run smoke:integration-retained-idempotency-store && npm run smoke:integration-storage-authority && npm run smoke:integration-retained-durable-common && npm run smoke:integration-retained-file-lock && npm run smoke:integration-retained-event-ledger && npm run smoke:integration-retained-event-ledger-bundle && npm run smoke:integration-retained-repository-kernel && npm run smoke:integration-retained-session-state-store && npm run smoke:integration-retained-native-session-repository-state && npm run smoke:integration-retained-native-execution-evidence && npm run smoke:integration-retained-runtime-repository-surface && npm run smoke:integration-retained-runtime-repository-phase-b && npm run smoke:integration-runtime-repository-contract && npm run smoke:integration-runtime-authority && npm run smoke:localllm-provider && npm run smoke:localllm-model-tiers && npm run smoke:localllm-code-routing && npm run smoke:local-failure-recovery && npm run smoke:localllm-auto-max && npm run smoke:local-resource-policy && npm run smoke:context-budget-recovery && npm run smoke:session-runtime && npm run smoke:runtime-core && npm run smoke:progressive-tools && npm run smoke:truthful-completion && npm run smoke:document-artifact-quality && npm run smoke:writing-specialist-routing && npm run smoke:workspace-secret-false-positive && npm run smoke:provider-handoff && npm run eval:local-first-agent && npm run eval:provider-attribution && npm run smoke:runtime-compat && npm run smoke:autoupdate && npm run smoke:web-api && npm run smoke:math-rendering && npm run smoke:web-ui && npm run smoke:web-autostart && npm run smoke:webapp-command && npm run smoke:web-port-fallback && npm run smoke:docker-command && npm run smoke:coding-tools && npm run smoke:dynamic-step-budget && npm run smoke:execution-policy && npm run smoke:aaps-adapter && npm run smoke:auxiliary-tools && npm run smoke:perception-research && npm run smoke:deep-research && npm run smoke:public-research && npm run smoke:safe-chat && npm run smoke:auth && npm run smoke:agentlink && npm run smoke:canvas-artifacts && npm run smoke:capabilities && npm run smoke:mcp && npm run smoke:model-roles && npm run smoke:platform && npm run smoke:permission-modes && npm run smoke:skills && npm run smoke:skillmesh && npm run smoke:supervision-ledger && npm run smoke:tmux-tools && npm run smoke:long-jobs && npm run smoke:run-stdin && npm run smoke:cli-chat && npm run smoke:inbox",
233
+ "test": "npm run check && npm run smoke:integration-production-mount && npm run smoke:integration-production-runtime-bundle && npm run smoke:integration-retained-idempotency-store && npm run smoke:integration-storage-authority && npm run smoke:integration-retained-durable-common && npm run smoke:integration-retained-file-lock && npm run smoke:integration-retained-event-ledger && npm run smoke:integration-retained-event-ledger-bundle && npm run smoke:integration-retained-repository-kernel && npm run smoke:integration-retained-session-state-store && npm run smoke:integration-retained-native-session-repository-state && npm run smoke:integration-retained-native-execution-evidence && npm run smoke:integration-retained-runtime-repository-surface && npm run smoke:integration-retained-runtime-repository-phase-b && npm run smoke:integration-runtime-repository-contract && npm run smoke:integration-runtime-authority && npm run smoke:localllm-provider && npm run smoke:localllm-model-tiers && npm run smoke:localllm-code-routing && npm run smoke:local-failure-recovery && npm run smoke:localllm-auto-max && npm run smoke:local-resource-policy && npm run smoke:context-budget-recovery && npm run smoke:session-runtime && npm run smoke:runtime-core && npm run smoke:progressive-tools && npm run smoke:scoped-artifact-research && npm run smoke:truthful-completion && npm run smoke:document-artifact-quality && npm run smoke:writing-specialist-routing && npm run smoke:workspace-secret-false-positive && npm run smoke:provider-handoff && npm run eval:local-first-agent && npm run eval:provider-attribution && npm run smoke:runtime-compat && npm run smoke:autoupdate && npm run smoke:web-api && npm run smoke:math-rendering && npm run smoke:web-ui && npm run smoke:web-autostart && npm run smoke:webapp-command && npm run smoke:web-port-fallback && npm run smoke:docker-command && npm run smoke:coding-tools && npm run smoke:dynamic-step-budget && npm run smoke:execution-policy && npm run smoke:aaps-adapter && npm run smoke:auxiliary-tools && npm run smoke:perception-research && npm run smoke:deep-research && npm run smoke:public-research && npm run smoke:safe-chat && npm run smoke:auth && npm run smoke:agentlink && npm run smoke:canvas-artifacts && npm run smoke:capabilities && npm run smoke:mcp && npm run smoke:model-roles && npm run smoke:platform && npm run smoke:permission-modes && npm run smoke:skills && npm run smoke:skillmesh && npm run smoke:supervision-ledger && npm run smoke:tmux-tools && npm run smoke:long-jobs && npm run smoke:run-stdin && npm run smoke:cli-chat && npm run smoke:inbox",
234
234
  "pack:dry-run": "npm pack --dry-run",
235
235
  "smoke:capabilities": "node scripts/smoke-capabilities.js"
236
236
  },
@@ -138,7 +138,9 @@ try {
138
138
  if ((await page.locator('[data-workspace-file="notes/workspace-ui.md"]').getAttribute("draggable")) !== "true") {
139
139
  throw new Error("workspace file rows are not draggable");
140
140
  }
141
- await page.locator("#workspace-automap").click();
141
+ const automapButton = page.locator("#workspace-automap");
142
+ await automapButton.scrollIntoViewIfNeeded();
143
+ await automapButton.click();
142
144
  await page.locator('[data-workspace-lane="docs"]').click();
143
145
  await page.waitForSelector('[data-workspace-file="notes/workspace-ui.md"]', { timeout: 10000 });
144
146
  await page.locator('[data-workspace-file="notes/workspace-ui.md"]').click();
@@ -4289,6 +4289,8 @@ export function resetSameTaskExecutionContract(state = {}, revision = 0) {
4289
4289
  startedMutationRevision,
4290
4290
  requiresWorkspaceMutation: currentTurnContract.requiresWorkspaceMutation === true,
4291
4291
  requiresFileMutation: currentTurnContract.requiresFileMutation === true,
4292
+ scopedArtifactDeliverable:
4293
+ currentTurnContract.scopedArtifactDeliverable === true,
4292
4294
  requiresSourceGrounding: Boolean(
4293
4295
  currentTurnContract.requiresSourceGrounding === true ||
4294
4296
  (
@@ -14666,8 +14668,12 @@ export function completionTaskContract(config = {}, state = {}) {
14666
14668
  0
14667
14669
  )
14668
14670
  );
14671
+ const scopedArtifactDeliverable = currentContract
14672
+ ? currentContract.scopedArtifactDeliverable === true
14673
+ : activeExecutionContract.scopedArtifactDeliverable === true;
14669
14674
  const requiresFreshMutation = Boolean(
14670
- currentContract?.requiresFileMutation || activeExecutionContract.requiresFileMutation
14675
+ (currentContract?.requiresFileMutation || activeExecutionContract.requiresFileMutation) &&
14676
+ !scopedArtifactDeliverable
14671
14677
  );
14672
14678
  const minimumMutationRevision = requiresFreshMutation
14673
14679
  ? startedMutationRevision + 1
@@ -14720,6 +14726,7 @@ export function completionTaskContract(config = {}, state = {}) {
14720
14726
  requiresFileMutation: authoritativeReadOnlyContinuation
14721
14727
  ? false
14722
14728
  : Boolean(contract.requiresFileMutation || currentContract?.requiresFileMutation),
14729
+ scopedArtifactDeliverable,
14723
14730
  requiresSourceGrounding: authoritativeReadOnlyContinuation
14724
14731
  ? false
14725
14732
  : Boolean(contract.requiresSourceGrounding || currentContract?.requiresSourceGrounding),
@@ -1316,6 +1316,20 @@ function goalRequestsFileMutation(goal = "", taskProfile = "") {
1316
1316
  );
1317
1317
  }
1318
1318
 
1319
+ function goalRequestsScopedArtifactDeliverable(goal = "") {
1320
+ const text = normalizedText(stripCompletedWorkNarration(stripForbiddenLanguage(goal)));
1321
+ const deliverable =
1322
+ /\b(?:build|compile|create|draft|export|generate|make|prepare|produce|render|save|write)\b[^.\n;]{0,180}\b(?:artifact|brief|cad|diagram|document|figure|image|markdown|memo|model|note|paper|pcb|pdf|presentation|prompt|report|research note|slide deck|slides?|spreadsheet|story|summary|transcript|video)\b/.test(text) ||
1323
+ /\b(?:artifact|brief|cad|diagram|document|figure|image|markdown|memo|model|note|paper|pcb|pdf|presentation|prompt|report|research note|slide deck|slides?|spreadsheet|story|summary|transcript|video)\b[^.\n;]{0,120}\b(?:build|compile|create|draft|export|generate|make|prepare|produce|render|save|write)\b/.test(text) ||
1324
+ /(?:创建|生成|保存|编写|撰写|制作|导出|准备)[^。;\n]{0,100}(?:报告|笔记|摘要|文档|论文|图表|图片|模型|演示文稿|幻灯片|表格|故事|提示词|转录|视频)/.test(text);
1325
+ if (!deliverable) return false;
1326
+ const projectSourceMutation =
1327
+ /\b(?:change|debug|edit|fix|implement|improve|modify|patch|refactor|repair|replace|rewrite|update)\b[^.\n;]{0,140}\b(?:app|application|code|codebase|implementation|library|package|repo|repository|runtime|source|src\/)\b/.test(text) ||
1328
+ /\b(?:app|application|code|codebase|implementation|library|package|repo|repository|runtime|source|src\/)\b[^.\n;]{0,140}\b(?:change|debug|edit|fix|implement|improve|modify|patch|refactor|repair|replace|rewrite|update)\b/.test(text) ||
1329
+ /(?:修改|修复|实现|改进|重构|调试|替换|更新)[^。;\n]{0,100}(?:代码|代码库|实现|运行时|应用|仓库|源码)/.test(text);
1330
+ return !projectSourceMutation;
1331
+ }
1332
+
1319
1333
  function goalRequestsTestExecution(goal = "") {
1320
1334
  const text = normalizedText(stripCompletedWorkNarration(stripForbiddenLanguage(goal)));
1321
1335
  return (
@@ -2029,6 +2043,9 @@ export function deriveScsTaskContract({ goal = "", taskProfile = "", acceptanceC
2029
2043
  positiveEvidenceGoal,
2030
2044
  taskProfile
2031
2045
  );
2046
+ const scopedArtifactDeliverable = Boolean(
2047
+ artifactRoot && goalRequestsScopedArtifactDeliverable(evidenceGoal)
2048
+ );
2032
2049
  return {
2033
2050
  version: 1,
2034
2051
  outcome: compact(evidenceGoal || "Complete the requested task.", 500),
@@ -2038,6 +2055,7 @@ export function deriveScsTaskContract({ goal = "", taskProfile = "", acceptanceC
2038
2055
  forbiddenActions: inferForbiddenActions(evidenceGoal),
2039
2056
  exactOutputPaths,
2040
2057
  requiredArtifactKinds,
2058
+ scopedArtifactDeliverable,
2041
2059
  excludedOutputPaths,
2042
2060
  artifactRoot,
2043
2061
  exactInputPaths,