@lazyingart/agintiflow 0.20.331 → 0.20.336-integration.2

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.
Files changed (139) hide show
  1. package/README.md +2 -0
  2. package/bin/aginti-document-worker-runtime-check.js +12 -0
  3. package/bin/aginti-document-worker.js +10 -0
  4. package/bin/aginti-execution-worker.js +26 -0
  5. package/bin/aginti-integration-analysis-state.js +10 -0
  6. package/bin/aginti-integration-analysis.js +7 -0
  7. package/bin/aginti-public-research.js +1 -0
  8. package/bin/aginti-worker-directory.js +178 -0
  9. package/docs/integration-analysis-state-migration.md +47 -0
  10. package/docs/integration-deep-research.md +9 -0
  11. package/docs/integration-worker-directory.md +99 -0
  12. package/docs/labcanvas-chatops-fallback.md +139 -0
  13. package/docs/supervision-campaign-ledger.md +1851 -0
  14. package/examples/document-worker/README.md +84 -0
  15. package/examples/document-worker/aginti-document-worker.service +67 -0
  16. package/examples/document-worker/document-worker.json +12 -0
  17. package/examples/document-worker/runtime-manifest.json +28 -0
  18. package/package.json +89 -4
  19. package/scripts/fixtures/integration-document-worker-smoke-fixture.js +190 -0
  20. package/scripts/fixtures/loopback-test-port.mjs +16 -0
  21. package/scripts/github-hosted-release-environment.js +22 -0
  22. package/scripts/live-production-planner-smoke.js +70 -0
  23. package/scripts/smoke-canvas-artifacts.js +203 -0
  24. package/scripts/smoke-coding-tools.js +676 -1
  25. package/scripts/smoke-docker-command.js +24 -0
  26. package/scripts/smoke-dynamic-step-budget.js +1032 -27
  27. package/scripts/smoke-execution-runtime-bundle.js +248 -0
  28. package/scripts/smoke-execution-worker-server.js +138 -0
  29. package/scripts/smoke-execution-worker-systemd-boundary.js +545 -0
  30. package/scripts/smoke-execution-worker.js +791 -0
  31. package/scripts/smoke-integration-analysis-api-server.js +1038 -0
  32. package/scripts/smoke-integration-analysis-coordinator.js +1035 -0
  33. package/scripts/smoke-integration-analysis-planner.js +5366 -0
  34. package/scripts/smoke-integration-analysis-session-authority-contract.js +223 -0
  35. package/scripts/smoke-integration-analysis-session-service.js +4628 -0
  36. package/scripts/smoke-integration-analysis-startup-recovery.js +846 -0
  37. package/scripts/smoke-integration-analysis-state-migrator.js +765 -0
  38. package/scripts/smoke-integration-analysis-state-prewrite-gate.js +1170 -0
  39. package/scripts/smoke-integration-api.js +2275 -0
  40. package/scripts/smoke-integration-authorities.js +3338 -0
  41. package/scripts/smoke-integration-document-artifacts.js +431 -0
  42. package/scripts/smoke-integration-document-content.js +244 -0
  43. package/scripts/smoke-integration-document-revision.js +909 -0
  44. package/scripts/smoke-integration-document-session-broker.js +1374 -0
  45. package/scripts/smoke-integration-document-worker-contract.js +197 -0
  46. package/scripts/smoke-integration-document-worker-cross-boundary.js +209 -0
  47. package/scripts/smoke-integration-document-worker-longevity.js +257 -0
  48. package/scripts/smoke-integration-document-worker-real-compile.js +138 -0
  49. package/scripts/smoke-integration-document-worker-server.js +411 -0
  50. package/scripts/smoke-integration-document-worker-service.js +214 -0
  51. package/scripts/smoke-integration-document-worker-store.js +419 -0
  52. package/scripts/smoke-integration-document-worker-systemd-boundary.js +353 -0
  53. package/scripts/smoke-integration-execution-worker-binding-config.js +102 -0
  54. package/scripts/smoke-integration-grounded-search.js +1355 -0
  55. package/scripts/smoke-integration-sandbox-profile.js +982 -0
  56. package/scripts/smoke-integration-worker-directory-cli.js +37 -0
  57. package/scripts/smoke-integration-worker-directory.js +399 -0
  58. package/scripts/smoke-local-failure-recovery.js +28 -0
  59. package/scripts/smoke-math-rendering.js +2 -1
  60. package/scripts/smoke-model-roles.js +46 -0
  61. package/scripts/smoke-public-research-wrapper.js +11 -3
  62. package/scripts/smoke-runtime-compat.js +8 -1
  63. package/scripts/smoke-scs-evidence-visibility.js +65 -0
  64. package/scripts/smoke-session-runtime.js +28 -0
  65. package/scripts/smoke-skills.js +174 -0
  66. package/scripts/smoke-tmux-tools.js +26 -0
  67. package/scripts/smoke-toolchain-docker.js +18 -0
  68. package/scripts/smoke-truthful-completion.js +3547 -117
  69. package/scripts/smoke-web-api.js +11 -2
  70. package/scripts/smoke-web-ui.js +11 -2
  71. package/scripts/smoke-webapp-command.js +67 -25
  72. package/scripts/test-document-worker-fixture.js +426 -0
  73. package/skills/deep-research/SKILL.md +1 -0
  74. package/src/agent-runner.js +3552 -174
  75. package/src/config.js +11 -5
  76. package/src/docker-sandbox.js +51 -9
  77. package/src/execution-runtime-bundle.js +639 -0
  78. package/src/execution-worker-api.js +245 -0
  79. package/src/execution-worker-client.js +1017 -0
  80. package/src/execution-worker-jobs.js +399 -0
  81. package/src/execution-worker-server.js +239 -0
  82. package/src/execution-worker-systemd-boundary.js +654 -0
  83. package/src/execution-worker.js +1453 -0
  84. package/src/guardrails.js +8 -1
  85. package/src/integration-analysis-cli.js +255 -0
  86. package/src/integration-analysis-config.js +614 -0
  87. package/src/integration-analysis-coordinator.js +529 -0
  88. package/src/integration-analysis-planner.js +4647 -0
  89. package/src/integration-analysis-server.js +778 -0
  90. package/src/integration-analysis-session-contract.js +18 -0
  91. package/src/integration-analysis-session-service.js +8269 -0
  92. package/src/integration-analysis-state-migration-cli.js +366 -0
  93. package/src/integration-analysis-state-migrator.js +591 -0
  94. package/src/integration-analysis-state-persistence.js +17 -0
  95. package/src/integration-analysis-vision.js +1086 -0
  96. package/src/integration-api.js +1505 -38
  97. package/src/integration-artifacts.js +235 -7
  98. package/src/integration-auth.js +1 -1
  99. package/src/integration-core-event-projector.js +10 -0
  100. package/src/integration-document-artifacts.js +492 -0
  101. package/src/integration-document-blob-store.js +226 -0
  102. package/src/integration-document-worker-cli.js +186 -0
  103. package/src/integration-document-worker-client.js +1719 -0
  104. package/src/integration-document-worker-config.js +299 -0
  105. package/src/integration-document-worker-contract.js +790 -0
  106. package/src/integration-document-worker-requirements.js +119 -0
  107. package/src/integration-document-worker-runtime.js +199 -0
  108. package/src/integration-document-worker-server.js +565 -0
  109. package/src/integration-document-worker-service.js +448 -0
  110. package/src/integration-document-worker-store.js +1837 -0
  111. package/src/integration-durable-common.js +586 -68
  112. package/src/integration-events.js +12 -2
  113. package/src/integration-execution-worker-binding-config.js +223 -0
  114. package/src/integration-execution-worker-router.js +428 -0
  115. package/src/integration-explicit-python.js +247 -0
  116. package/src/integration-expression-plot.js +361 -0
  117. package/src/integration-file-worker-client.js +725 -0
  118. package/src/integration-file-worker-contract.js +559 -0
  119. package/src/integration-file-worker-store.js +1100 -0
  120. package/src/integration-grounded-search.js +2612 -0
  121. package/src/integration-idempotency-store.js +429 -10
  122. package/src/integration-policy.js +242 -8
  123. package/src/integration-tex-compiler.js +654 -0
  124. package/src/integration-worker-directory.js +1015 -0
  125. package/src/json-extraction.js +66 -0
  126. package/src/model-client.js +293 -2
  127. package/src/perception-tools.js +3 -63
  128. package/src/permission-advice.js +152 -3
  129. package/src/public-research-server.js +1 -1
  130. package/src/response-only-source-quality.js +356 -0
  131. package/src/scs-controller.js +37 -1
  132. package/src/scs-evidence.js +516 -32
  133. package/src/session-runtime.js +8 -0
  134. package/src/skill-library.js +81 -5
  135. package/src/step-budget-controller.js +175 -18
  136. package/src/tmux-tools.js +10 -1
  137. package/src/web-query-privacy.js +44 -0
  138. package/src/web-search.js +11 -0
  139. package/src/workspace-tools.js +92 -1
@@ -740,3 +740,1854 @@ startup/send/mutation shell commands blocked by the existing permission policy.
740
740
  The focused persisted-runtime regression verifies both exact aliases and the
741
741
  negative mutating command case; the tmux guardrail, progressive-tool,
742
742
  provider-handoff, syntax, package-audit, dry-pack, and full npm suites pass.
743
+
744
+ ### Model-safe Docker failure evidence
745
+
746
+ `labcanvas-model-safe-docker-failure-100` was derived from retained production
747
+ session `web-agent-labcanvas-968d0e66-a494-40fd-b2f7-0290c687a4ea`. DeepSeek
748
+ first failed with `402 Insufficient Balance`, then the same session resumed on
749
+ LocalLLM and preserved its goal, plan, artifact paths, and tool evidence. The
750
+ local context guard also behaved correctly: each oversized request was reduced
751
+ from roughly 26K-57K message tokens to 8K-12K before retry. Context compaction
752
+ was therefore not the defect.
753
+
754
+ The actual failure boundary was a sandboxed LaTeX command that exited nonzero
755
+ without writing native stderr. Node's raw child-process exception embedded the
756
+ complete internal `docker run` invocation, mounts, environment setup, and
757
+ wrapped shell in the model-visible `run_command` result. LocalLLM copied that
758
+ runtime implementation detail into its next tool call, where the secret-path
759
+ guard correctly blocked it and stopped the otherwise recoverable document run.
760
+
761
+ AgInTiFlow now normalizes only failed sandbox command exceptions at the Docker
762
+ boundary. The model and public event stream retain the real exit code, command
763
+ stdout, native stderr when present, and a concise fallback when stderr is
764
+ empty; they no longer receive the Docker wrapper. The raw redacted exception
765
+ remains available only in the bounded private sandbox diagnostic ring. This
766
+ keeps audit evidence useful while preventing smaller fallback models from
767
+ replaying container internals as user commands.
768
+
769
+ Deterministic regressions cover empty-stderr and compiler-stderr failures. A
770
+ real toolchain-container check confirms that a failing command reports exit
771
+ code `1` without exposing `docker run`, sandbox environment variables, or
772
+ internal mount paths. Syntax, LocalLLM nested failure recovery, DeepSeek to
773
+ LocalLLM provider handoff, coding tools, Docker command, and Docker toolchain
774
+ checks pass.
775
+
776
+ ### Response-only router JSON is not a forecast
777
+
778
+ `labcanvas-response-router-project-label-101` came from retained production
779
+ session `web-agent-labcanvas-a5159676-c87c-4aad-b1a6-3ef3cd7cf8c1`. The task
780
+ was a response-only LabCanvas route classification for two WeChat article
781
+ cards. DeepSeek failed before inference with `402 Insufficient Balance`, and
782
+ LocalLLM returned a structurally valid routing JSON object. AgInTiFlow then
783
+ rejected it as an unsupported forecast because the source-free claim matcher
784
+ treated the ordinary JSON key-value pair `"project": "labcanvas"` as the verb
785
+ "project" in a prediction. Its bounded repair received another valid project
786
+ label and failed closed, suppressing the worker route entirely.
787
+
788
+ The forecast matcher now excludes the bare ambiguous noun `project` while
789
+ continuing to detect `projects`, `projected`, `projection`, predictions,
790
+ forecasts, expected growth, CAGR, and the existing Chinese and Japanese
791
+ forecast forms. This also prevents ordinary prose such as "the project" from
792
+ being mislabeled without weakening actual projection checks.
793
+
794
+ The matcher regression uses the production-shaped router JSON and a positive
795
+ unsupported forecast sentence. The end-to-end provider-handoff regression
796
+ forces DeepSeek `402`, returns the router JSON from LocalLLM, and verifies that
797
+ the exact JSON finishes unchanged after one fallback request with no
798
+ `response_only.source_free_claim_rejected` event. Truthful-completion,
799
+ provider-handoff, and syntax checks pass.
800
+
801
+ ### Host-owned document compilation remains outside the fallback model
802
+
803
+ `labcanvas-host-document-handoff-102` came from retained production session
804
+ `web-agent-labcanvas-e654a5b9-6486-4718-b8fd-c76f1c05626e`. Its task packet
805
+ required AgInTi to revise a task-local Markdown or TeX source and explicitly
806
+ forbade compiler invocation because the LabCanvas host would compile and
807
+ revalidate the PDF in the same completion cycle. The narrowed evidence scope
808
+ still contained the earlier user-facing PDF request, however, so AgInTi's
809
+ generic completion contract discarded the later host-ownership directive and
810
+ continued to require a PDF from the fallback model.
811
+
812
+ After writing the report source, LocalLLM could not pass the contradictory
813
+ completion gate. It repeatedly sent the same Markdown file to canvas through
814
+ 58 steps instead of returning control to the host compiler. The retained trace
815
+ therefore demonstrated a contract-layer defect rather than missing research,
816
+ context loss, or a need to weaken evidence checks.
817
+
818
+ Host compilation ownership is now derived from the complete runtime contract,
819
+ while factual source and artifact scope remain narrowed to the exact task. An
820
+ unconditional paired contract that prohibits agent-side compilers and assigns
821
+ build/validation to the host removes PDF from the agent-owned deliverables and
822
+ requires one fresh reader-facing Markdown or TeX source instead. Conditional
823
+ fallback wording still leaves ordinary PDF production agent-owned. A declared
824
+ artifact root is now an exclusive evidence boundary, and private routine
825
+ contracts or delivery notes cannot impersonate the reader-facing source.
826
+
827
+ The production-shaped regression proves that the explicit host directive
828
+ survives `AGINTI_EVIDENCE_SCOPE_JSON`, a private routine note is insufficient,
829
+ a real scoped report source satisfies the handoff, and ordinary or conditional
830
+ PDF workflows retain their existing contracts.
831
+
832
+ ### Unchanged canvas artifacts are delivered once per goal revision
833
+
834
+ `labcanvas-canvas-delivery-idempotency-103` follows the same retained LabCanvas
835
+ session, `web-agent-labcanvas-e654a5b9-6486-4718-b8fd-c76f1c05626e`, after the
836
+ host-compilation contract defect had pushed LocalLLM into a weak convergence
837
+ loop. The event ledger contains 52 successful `send_to_canvas` calls and 52
838
+ `canvas.item` events for the exact same task-local `report.md`, with no finish
839
+ event. Cosmetic title changes generated another durable artifact copy and were
840
+ credited as progress, so the ordinary no-progress guard could never converge.
841
+
842
+ Canvas dispatch now keeps a bounded revision-scoped delivery ledger. Its
843
+ identity includes the normalized workspace path, file bytes and SHA-256,
844
+ renderer kind, and selection intent; inline artifacts use their content hash.
845
+ Changing a title or note cannot resend an unchanged artifact. A duplicate
846
+ returns a successful skipped result that points the model toward `finish`, emits
847
+ one diagnostic suppression event, creates no copied artifact, and does not
848
+ advance the stagnation epoch. A changed file remains deliverable because its
849
+ content fingerprint changes, and a later user goal revision gets an independent
850
+ delivery scope.
851
+
852
+ The end-to-end scripted model regression reads and delivers one report, retries
853
+ the same bytes under a different title, receives the completion redirect, then
854
+ observes a host-side file revision and successfully delivers those new bytes.
855
+ It asserts two substantive canvas items, one suppression, two persisted files,
856
+ and no false progress credit for the duplicate.
857
+
858
+ ### Local context recovery retains its successful output lane
859
+
860
+ `labcanvas-local-context-output-adaptation-104` was derived from retained
861
+ production sessions rather than a synthetic large-prompt guess. Session
862
+ `web-agent-labcanvas-e654a5b9-6486-4718-b8fd-c76f1c05626e` recorded 56
863
+ `model.local_context_budget_exceeded` events in 58 steps, while the longer
864
+ `web-agent-labcanvas-3ff222ef-af1c-4301-8799-4c6ca71368d2` history recorded 183
865
+ such events across 291 requests. Each retry could compact successfully, but the
866
+ next turn restored the implicit 8192-token output reserve and rediscovered the
867
+ same envelope limit.
868
+
869
+ AgInTiFlow now records whether `maxOutputTokens` came from an operator or from
870
+ the LocalLLM default. After an implicit-cap context overflow, the successful
871
+ 4096-token retry lane is retained in private session state and reused by later
872
+ agent steps and response-only continuations with the same context window. The
873
+ saved runtime configuration remains unchanged, hosted providers are unaffected,
874
+ and an explicit operator cap remains authoritative.
875
+
876
+ The regressions cover a context overflow followed by a nested timeout and model
877
+ route change, all subsequent full-agent requests, an explicit 8192-token cap,
878
+ and a second response-only continuation whose near-limit history would overflow
879
+ again without the retained lane. The second continuation makes one bounded
880
+ request and the event ledger remains at one context-overflow recovery. The full
881
+ `npm test` gate passes.
882
+
883
+ ### Explicit response-only JSON contracts are checked before completion
884
+
885
+ `labcanvas-response-only-json-contract-105` comes from retained production
886
+ session `web-agent-labcanvas-7159acc2-9bbe-4254-825b-ed6819f8e269`. After a
887
+ DeepSeek `402` handoff, a completion-auditor turn explicitly required an object
888
+ with `covered_item_ids`, `missing`, `legitimate_blocker`, `complexity`, and
889
+ `summary`. LocalLLM instead copied the nested candidate object with `message`,
890
+ `confirmation`, and artifact fields. It was valid nonempty JSON and made no
891
+ unsupported factual claim, so the response-only lane incorrectly recorded a
892
+ successful finish.
893
+
894
+ Response-only execution now derives a shallow contract only when the
895
+ authoritative prompt contains an explicit `Return JSON ...:` instruction
896
+ followed by a valid object example. It requires one parseable JSON object with
897
+ the example's top-level keys and value types. It does not infer schemas from
898
+ ordinary prose, hard-code LabCanvas fields, or inspect arbitrary nested task
899
+ payloads. A mismatch receives one bounded repair instruction naming only the
900
+ expected key types. A second mismatch stops without `session.finished`, so the
901
+ host can retain and retry the task instead of accepting the wrong protocol.
902
+
903
+ The provider-handoff regression reproduces the wrong nested candidate object,
904
+ repairs it to the outer audit contract, and separately proves the fail-closed
905
+ path. Existing plain-text, router, source-free-claim, and context-recovery
906
+ response-only paths remain covered.
907
+
908
+ ### Requested falsifiable predictions remain useful without becoming evidence
909
+
910
+ `labcanvas-source-free-falsifiable-prediction-106` comes from retained
911
+ production session `web-agent-labcanvas-acfafa25-d3c5-4a4e-9e12-1813973211a2`.
912
+ The response-only LabAgent prompt explicitly requested one evidence-aware
913
+ inspiration point, an actionable experiment, and clearly falsifiable 3-, 5-,
914
+ and 10-year predictions. It did not ask the fallback model to claim a source or
915
+ present the predictions as established facts. After the DeepSeek quota
916
+ handoff, however, the source-free claim guard rejected every LocalLLM answer
917
+ that contained a forecast. Bounded repair eventually removed the useful task
918
+ content and returned unrelated generic career advice.
919
+
920
+ When the authoritative request explicitly asks for it, source-free
921
+ response-only execution now distinguishes an assistant's own clearly labeled
922
+ hypothesis or prediction from a forecast attributed to a
923
+ report, paper, study, source, company, or authority. The exception remains
924
+ narrow: a speculation label cannot legalize claimed validation, external
925
+ evidence, citations, publications, benchmarks, or asserted quantitative
926
+ results. The repair prompt explains the same boundary in multilingual terms
927
+ instead of prohibiting all forecasts even when the authoritative task requires
928
+ one. An unsolicited model-added prediction remains rejected.
929
+
930
+ Regressions cover English guidance, Chinese and Japanese falsifiable
931
+ predictions, attributed Chinese forecasts, and a prediction label that attempts
932
+ to conceal unsupported validation and accuracy claims. The production-shaped
933
+ provider handoff forces DeepSeek `402`, accepts the requested LocalLLM
934
+ prediction in one fallback request, emits no source-free rejection, and records
935
+ one terminal finish.
936
+
937
+ ### Internal recovery scaffolding cannot become the task answer
938
+
939
+ `labcanvas-internal-runtime-scaffold-leak-107` comes from retained production
940
+ session `web-agent-labcanvas-b94e75e1-5441-402c-b299-e8b527f386cf`. The task
941
+ was a current LabAgent research briefing with reader-facing artifacts. DeepSeek
942
+ failed before inference with `402 Insufficient Balance`; the LocalLLM request
943
+ then exceeded its context envelope and AgInTi compacted the history from about
944
+ 71,000 to 13,800 message characters. Instead of continuing the briefing, the
945
+ fallback model copied the private recovery packet into its answer: it discussed
946
+ runtime compaction, repeated the AgInTi identity instruction, claimed that the
947
+ original request was truncated, and asserted that acceptance criteria were
948
+ satisfied. Because the task had not yet produced tool evidence, this internal
949
+ narrative was nevertheless accepted as `session.finished`.
950
+
951
+ Completion now checks a candidate against the actual runtime-generated
952
+ compaction or constrained-recovery packets retained in that session. It rejects
953
+ only high-confidence copying: at least two distinctive narrative markers, one
954
+ narrative marker plus a private section heading, or three private headings. A
955
+ normal answer after compaction is unaffected, and an explicit user request to
956
+ explain or audit context-recovery behavior remains allowed. English, Chinese,
957
+ and Japanese marker forms are covered without treating generic words such as
958
+ `runtime`, `context`, or `plan` as failures.
959
+
960
+ The first copied answer is removed from active conversation state and receives
961
+ one goal-revision-scoped repair directing the model back to the real task. A
962
+ second copied answer stops truthfully without a terminal finish, preserving the
963
+ session for another provider. The production-shaped regression forces proactive
964
+ compaction, proves recovery to the exact user-facing answer on the next model
965
+ turn, and separately proves the repeated-leak fail-closed path. Truthful
966
+ completion, context-budget recovery, provider handoff, syntax checks, and the
967
+ full test gate pass.
968
+
969
+ ### Unsupported blocker narratives cannot close completed-looking runs
970
+
971
+ `labcanvas-unsupported-blocker-completion-108` comes from retained production
972
+ session `web-agent-labcanvas-57d7e9c5-8f7c-475b-acbd-b8cf70427d80`. The exact
973
+ LabCanvas repair request named its authoritative task artifact directory and
974
+ required a material source revision, rebuilt and inspected replacement PDF,
975
+ and concise result. After DeepSeek failed before inference with `402
976
+ Insufficient Balance`, LocalLLM listed the exact directory and read its routine
977
+ contract. It then claimed that no source file or revision instruction had been
978
+ provided and asked the user to provide them. No permission, dependency,
979
+ authentication, quota, or tool blocker existed, but the completion gate
980
+ accepted that invented limitation as `session.finished` once unrelated runtime
981
+ evidence made the underlying evidence assessment look complete.
982
+
983
+ Completion now classifies blocker language before the ordinary success return.
984
+ A candidate that says the task cannot proceed is accepted only when the current
985
+ evidence ledger contains a matching real blocker and project, source, and
986
+ artifact quality gates permit that blocker to close the run. Otherwise it
987
+ enters the existing bounded evidence-repair path with an explicit unsupported-
988
+ blocker reason. The model gets one progress-sensitive chance to use the enabled
989
+ tools or return the actual verified result; a repeated unsupported blocker
990
+ stops without a false terminal finish.
991
+
992
+ The end-to-end regression first satisfies a shell execution contract, then
993
+ proposes an unrelated missing-file blocker, verifies that the blocker is
994
+ rejected, and accepts the repaired evidence-grounded answer exactly once. The
995
+ existing positive control still accepts a genuinely evidenced missing command.
996
+ Syntax checks, truthful-completion tests, provider handoff, and the full package
997
+ gate pass.
998
+
999
+ ### Revision and rebuild wording requires fresh artifact evidence
1000
+
1001
+ `labcanvas-scoped-artifact-revision-verbs-109` comes from retained production
1002
+ session `web-agent-labcanvas-84d3ca00-7abe-4f4b-8b9e-51a7bf79122f`. Its exact
1003
+ repair contract required AgInTi to materially revise a source inside the named
1004
+ task directory, rebuild and inspect a replacement PDF, and return the verified
1005
+ new PDF instead of the unchanged artifact. After the hosted provider failed
1006
+ before inference, LocalLLM listed the directory, read the existing Markdown,
1007
+ evidence manifest, and routine contract, then sent the pre-existing Markdown
1008
+ and PDF to canvas. It performed no file mutation, rebuild, or replacement
1009
+ inspection, but the run finished because the mutation classifier did not treat
1010
+ `revise` or `rebuild` as workspace mutation verbs.
1011
+
1012
+ The generic mutation contract now recognizes `revise`, `rebuild`, and
1013
+ `regenerate`, including their Chinese equivalents, anywhere the existing
1014
+ mutation classifier already accepts repair, rewrite, and update language. This
1015
+ does not infer a file mutation from artifact delivery alone: a file, source,
1016
+ document, path, workspace, or explicit filename signal is still required by
1017
+ the existing second-stage classifier. Message-only corrections and read-only
1018
+ reviews therefore keep their prior behavior.
1019
+
1020
+ The production-shaped regression uses the exact retained wording and artifact
1021
+ scope. It proves that the request is a scoped artifact operation, requires a
1022
+ fresh file mutation after the request boundary, and still requires a PDF. The
1023
+ same retained production goal now derives file plus artifact evidence instead
1024
+ of artifact delivery alone, so unchanged prior files cannot satisfy it.
1025
+ Scoped-artifact, progressive-tool, syntax, and full package tests pass.
1026
+
1027
+ ### Project nouns do not trigger source-free forecast repair
1028
+
1029
+ `labcanvas-project-noun-forecast-false-positive-110` comes from retained
1030
+ production session `web-agent-labcanvas-acfafa25-d3c5-4a4e-9e12-1813973211a2`.
1031
+ The authoritative scheduled-inspiration request required one concise message
1032
+ aligned to the exact group's organoid and interdisciplinary research interests.
1033
+ After DeepSeek failed before inference with `402 Insufficient Balance`, the
1034
+ LocalLLM returned the harmless invitation `Share your latest project ideas`.
1035
+ The source-free claim guard interpreted the noun `project` as the verb
1036
+ `project`, rejected it as an unsupported forecast, and requested a correction.
1037
+ That unnecessary repair lost the subject: the replacement became generic
1038
+ career advice and exposed the unrelated internal schedule id `memo_daily`.
1039
+
1040
+ Forecast detection no longer treats bare `project` as a prediction. It still
1041
+ detects the unambiguous forms `projected` and `projection`, and detects
1042
+ `projects` when a report, study, source, model, forecast, analysis, or analyst
1043
+ is its subject. The change is confined to source-free response validation; it
1044
+ does not weaken publication, validation, citation, year, benchmark, metric, or
1045
+ multilingual forecast checks.
1046
+
1047
+ The regression uses the exact retained invitation and proves it passes without
1048
+ a repair. A negative control proves that `The market analysis projects that
1049
+ demand will grow next year` remains rejected. Truthful-completion and syntax
1050
+ checks pass before the full package gate.
1051
+
1052
+ ### Response-only repairs preserve the output contract
1053
+
1054
+ `labcanvas-response-only-repair-contract-111` is derived from retained
1055
+ production session `web-agent-labcanvas-21296064-9835-461b-8179-5c8cf5f367a2`.
1056
+ The authoritative WeCom router request required a strict multi-field JSON
1057
+ object. A source-free factual answer triggered the evidence repair path, whose
1058
+ replacement returned only `response` and internal routing narration. The JSON
1059
+ contract validator was added after that production event, but a validation-
1060
+ order gap remained: it checked the first answer before source-free repair and
1061
+ did not check the replacement afterward. A schema-valid first answer could
1062
+ therefore still finish with a schema-invalid correction.
1063
+
1064
+ The source-free repair instruction now repeats the exact required top-level key
1065
+ types when an explicit JSON contract exists. Its replacement passes the same
1066
+ contract validator before the repair is accepted or `session.finished` is
1067
+ recorded. A replacement that drops keys stops through the existing output-
1068
+ contract failure path; it does not get an additional model turn. This keeps the
1069
+ repair bounded while preventing one validator from undoing another validator's
1070
+ guarantee.
1071
+
1072
+ The provider-handoff regression forces DeepSeek quota failure, supplies an
1073
+ initial schema-valid but unsupported factual claim, and then exercises both
1074
+ LocalLLM outcomes. Dropping `files` and `confirmation` fails closed with no
1075
+ terminal finish; preserving all three fields completes once. Provider handoff,
1076
+ source-free evidence, JSON repair, and syntax checks pass before the full
1077
+ package gate.
1078
+
1079
+ ### Negated cleanup policy does not become deletion authorization
1080
+
1081
+ `labcanvas-prebuild-cleanup-auto-recovery-112` comes from retained production
1082
+ session `web-agent-labcanvas-c8410880-dc6a-420d-9270-9712f158d3ea`. The exact
1083
+ document-revision packet explicitly said never to bundle `rm`, delete, clean,
1084
+ reset, or scratch cleanup into a build. After making substantive report
1085
+ progress, the fallback model nevertheless attempted to remove the prior PDF
1086
+ and TeX sidecars before rebuilding. The destructive guard correctly blocked
1087
+ the command, but the permission adviser interpreted the words `delete` and
1088
+ `clean` in that negative safety rule as user authorization. It therefore
1089
+ paused the entire task for destructive approval instead of leaving the files
1090
+ in place and continuing safely.
1091
+
1092
+ Deletion-intent parsing now removes bounded policy clauses such as `never
1093
+ bundle ... delete ... into a build command` before looking for affirmative
1094
+ deletion requests. The shell command remains blocked. When no independent
1095
+ deletion request exists, the existing non-destructive recovery tells the model
1096
+ to retain all files and continue the substantive work without approval. A
1097
+ separate affirmative request such as `Delete the obsolete PDF` still requires
1098
+ the normal destructive permission path.
1099
+
1100
+ The production-shaped regression uses the retained absolute report paths and
1101
+ the same negated cleanup sentence. It proves the blocked cleanup no longer
1102
+ pauses, while an explicit deletion sentence in the same goal is not erased.
1103
+ Coding-tool and syntax checks pass before the full package gate.
1104
+
1105
+ ### Runtime echoes cannot authorize generic artifact names
1106
+
1107
+ `labcanvas-generic-artifact-echo-bypass-113` is also derived from retained
1108
+ production session `web-agent-labcanvas-23dfa04f-cef4-4d48-a99e-b152eacf4a99`.
1109
+ The document task asked for a recognizable reader-facing report. A first write
1110
+ to generic `report.tex` was correctly blocked with a descriptive-name repair.
1111
+ After local-context compaction, the synthetic runtime message repeated the
1112
+ blocked path. The filename guard searched recent messages whose transport role
1113
+ was `user`, mistook that runtime echo for a human filename request, and allowed
1114
+ the same `report.tex` write on the next turn.
1115
+
1116
+ Generic-filename authorization now comes only from the active goal contract
1117
+ and configured goal. Synthetic compaction, loop-guard, permission, and tool
1118
+ feedback can still guide the model but cannot silently broaden the user's
1119
+ artifact naming contract. Exact filenames in the current request remain
1120
+ allowed, as do paths declared by the task contract and edits to an existing
1121
+ file.
1122
+
1123
+ The regression supplies a production-shaped synthetic `role=user` recovery
1124
+ message containing `output/task/report.tex` and proves the new file remains
1125
+ blocked. Its positive control puts the same exact path in the active request
1126
+ and proves it is accepted. Coding-tool and syntax checks pass before the full
1127
+ package gate.
1128
+
1129
+ ### Explicit JSON schema headings are completion contracts
1130
+
1131
+ `labcanvas-explicit-json-schema-contract-114` comes from retained production
1132
+ session `web-agent-labcanvas-f61239a5-db5e-42ff-94e2-1f4a1d5a4b2c`. Its route
1133
+ request said `Return only JSON`, declared the allowed `route_kind` values, and
1134
+ then supplied a thirteen-field object under `JSON schema:`. One fallback turn
1135
+ returned an unrelated object with `classification`, `request_type`, `context`,
1136
+ `status`, and `required_action`; a later turn returned only `route_kind`. Both
1137
+ were valid JSON, so the runtime recorded each as finished even though neither
1138
+ matched the explicit response envelope.
1139
+
1140
+ Response-only contract discovery now recognizes explicit `JSON schema`,
1141
+ `JSON shape`, and `JSON format` headings, including `required` and `expected`
1142
+ variants, in addition to the existing inline `Return JSON:` form. It derives
1143
+ only the declared top-level keys and value types, then uses the existing single
1144
+ bounded repair and fail-closed path. This remains domain-independent and does
1145
+ not infer a schema from incidental JSON examples elsewhere in the prompt.
1146
+
1147
+ The production-shaped regression forces DeepSeek quota failure, returns a
1148
+ one-key route object from the LocalLLM double, and proves that it cannot finish
1149
+ until the missing schema fields are repaired. The focused provider-handoff
1150
+ test, syntax checks, and full package suite pass without real LocalLLM
1151
+ inference or changes to LabCanvas routing.
1152
+
1153
+ ### Explicit JSON enums are completion contracts
1154
+
1155
+ `labcanvas-response-json-enum-contract-115` continues from retained production
1156
+ session `web-agent-labcanvas-f61239a5-db5e-42ff-94e2-1f4a1d5a4b2c`. The route
1157
+ request declared an exact `Allowed route_kind values:` list, but one fallback
1158
+ turn returned `video_generation_and_download`, a plausible invented label that
1159
+ does not exist in the host contract. A full-shaped response with that value
1160
+ could satisfy the key and type checks while still selecting an unsupported
1161
+ route.
1162
+
1163
+ Response-only contract discovery now retains string enums declared either as
1164
+ an explicit `Allowed <field> values:` bullet list or as a pipe-delimited value
1165
+ in the authoritative JSON schema sample. Completion validation reports fields
1166
+ whose values fall outside those caller-declared enums, includes the allowed
1167
+ values in the bounded repair instruction, and fails closed if the one repair
1168
+ still violates the contract. It does not infer allowed values from prose or
1169
+ apply domain-specific route names.
1170
+
1171
+ The production-shaped regression forces DeepSeek quota failure, returns all
1172
+ thirteen required fields with only `route_kind` invalid, and proves that one
1173
+ LocalLLM repair restores a declared value before the runtime records a finish.
1174
+ The focused provider-handoff test, syntax checks, and full package suite pass
1175
+ without real LocalLLM inference or any LabCanvas policy change.
1176
+
1177
+ ### Candidate forecast mentions are not forecast claims
1178
+
1179
+ `labcanvas-auditor-forecast-mention-116` comes from retained production
1180
+ session `web-agent-labcanvas-7159acc2-9bbe-4254-825b-ed6819f8e269`. A completion
1181
+ auditor wrote that the candidate covered a `可证伪预测` but omitted a requested
1182
+ PDF and related analysis. The source-free claim guard treated that
1183
+ metalinguistic mention as the auditor making an unsupported forecast, forced a
1184
+ second model turn, and risked replacing a useful missing-work diagnosis with a
1185
+ less accurate answer.
1186
+
1187
+ The source-free claim classifier now distinguishes a candidate-content summary
1188
+ that merely says a prediction, forecast, projection, hypothesis, or speculation
1189
+ is present from a summary that repeats an actual future outcome. The narrow
1190
+ exception covers explicit candidate/result/response language in English,
1191
+ Chinese, and Japanese only when forecast is the sole detected claim category
1192
+ and no year, future marker, projected outcome, or quantitative forecast appears.
1193
+ Publication, validation, metric, evidence, and attributed-forecast checks are
1194
+ unchanged.
1195
+
1196
+ The regression uses the exact retained Chinese wording plus English and
1197
+ Japanese controls. A candidate-summary sentence that asserts 20% growth next
1198
+ year remains rejected. Truthful-completion, provider-handoff, syntax, and the
1199
+ full package suite pass without real LocalLLM inference.
1200
+
1201
+ ### Successful equivalent web searches are single-use evidence
1202
+
1203
+ `labcanvas-successful-web-search-idempotency-117` comes from retained
1204
+ production session `web-agent-labcanvas-3ff222ef-af1c-4301-8799-4c6ca71368d2`.
1205
+ During one medical-research task, two generic discovery queries each completed
1206
+ successfully 48 times and one exact paper-title query completed successfully 45
1207
+ times. The static-discovery guard normalized equivalent search arguments but
1208
+ deliberately allowed two successful calls before blocking, while context
1209
+ recovery in the older runtime repeatedly reopened that allowance.
1210
+
1211
+ Equivalent successful `web_search` calls are now reusable after the first call
1212
+ in an unchanged task state, matching the existing exact-file-read boundary.
1213
+ Provider, result-count, whitespace, and capitalization changes do not bypass
1214
+ the guard because they do not change the information need. A materially
1215
+ refined query remains available, and successful task mutations still advance
1216
+ the stagnation epoch through the existing progress machinery.
1217
+
1218
+ The focused regression proves that the second semantically identical query is
1219
+ blocked while a query with an added primary-source constraint remains allowed.
1220
+ The dynamic-step smoke, syntax checks, and full package suite pass without live
1221
+ web requests, real LocalLLM inference, or any LabCanvas runtime-policy change.
1222
+
1223
+ ### Reopening one unchanged browser URL is not progress
1224
+
1225
+ `labcanvas-browser-open-idempotency-118` continues from retained production
1226
+ session `web-agent-labcanvas-3ff222ef-af1c-4301-8799-4c6ca71368d2`. The same
1227
+ AACR page was successfully opened six times. Unlike `web_search` and
1228
+ `read_web_page`, `open_url` was not static discovery, so every navigation was
1229
+ credited as progress and reset convergence despite producing no file, artifact,
1230
+ or new browser interaction.
1231
+
1232
+ `open_url` is now static discovery with a canonical URL signature. Fragments do
1233
+ not create distinct identities, and a second successful equivalent open in an
1234
+ unchanged task phase is blocked. A real non-static browser action still resets
1235
+ the discovery phase through the existing progress machinery, so a later
1236
+ intentional revisit after interacting with the page remains available.
1237
+
1238
+ The focused regression covers static classification, canonical fragment
1239
+ normalization, duplicate blocking, and no-progress accounting. Dynamic-step,
1240
+ syntax, and full package tests pass without opening a live browser or changing
1241
+ host transport behavior.
1242
+
1243
+ ### Directory depth is part of discovery identity
1244
+
1245
+ `labcanvas-directory-depth-refinement-119` also uses retained production
1246
+ session `web-agent-labcanvas-3ff222ef-af1c-4301-8799-4c6ca71368d2`. The agent
1247
+ listed the same artifact directory at both depth 2 and depth 3 while recovering
1248
+ a document task. The convergence signature used only the directory path, so a
1249
+ later, materially deeper inspection could be blocked as though it repeated the
1250
+ same successful listing.
1251
+
1252
+ `list_files` signatures now include the normalized effective depth (1–8,
1253
+ default 4). A simple read-only `ls` remains equivalent to a depth-1 structured
1254
+ listing of the same canonical directory. Exact repeated listings retain their
1255
+ existing bounded retry behavior, while an explicitly deeper scope remains
1256
+ available when it can reveal evidence omitted by the earlier listing.
1257
+
1258
+ The focused regression proves cross-tool depth-1 equivalence, exact-listing
1259
+ convergence, and a depth-2 to depth-3 refinement. It does not change filesystem
1260
+ permissions, traversal limits, host transport, or LabCanvas runtime policy.
1261
+
1262
+ ### Route assignments are not external forecasts
1263
+
1264
+ `labcanvas-operational-route-forecast-120` comes from retained production
1265
+ session `web-agent-labcanvas-0aa6abef-47a0-4f2a-b07e-ae36281ecd6f`. After a
1266
+ DeepSeek `402`, LocalLLM returned a structurally correct `publish_video` route
1267
+ for the user's explicit request. The source-free claim guard interpreted the
1268
+ route explanation as a forecast, rejected it twice, and replaced it with an
1269
+ irrelevant no-evidence blocker.
1270
+
1271
+ The forecast classifier now separates bounded task-assignment language from
1272
+ claims about external future outcomes. Wording such as a user requesting work
1273
+ and a worker being expected to use an established routine is operational intent,
1274
+ not a market or scientific prediction. Dates, future periods, quantitative
1275
+ growth, demand, revenue, accuracy, and similar outcome claims remain guarded.
1276
+
1277
+ Focused evaluator checks cover the production-shaped publish route and an
1278
+ unsupported 20% next-year demand forecast. The provider-handoff regression
1279
+ forces DeepSeek quota failure and proves the valid LocalLLM route finishes on
1280
+ its first response without weakening explicit JSON schema checks or changing
1281
+ LabCanvas routing policy.
1282
+
1283
+ ### Exact page reads converge without blocking focused rereads
1284
+
1285
+ `labcanvas-web-page-read-idempotency-121` comes from retained production
1286
+ session `web-agent-labcanvas-6a712fc4-a1a4-4128-801d-46771cb3c50a`. One exact
1287
+ web page extraction completed successfully 11 times, another completed six
1288
+ times, and a query-ranked extraction of that second page completed three times.
1289
+ The older convergence identity used only the URL and allowed two successful
1290
+ calls, so it could neither stop the first duplicate nor distinguish a genuinely
1291
+ different question about the same source.
1292
+
1293
+ `read_web_page` discovery identity now combines the canonical URL, normalized
1294
+ passage query, and bounded content/passage scope bands. A second equivalent
1295
+ successful extraction is blocked immediately. A materially different research
1296
+ question or a larger content band remains available, while cosmetic whitespace,
1297
+ fragment, and small numeric changes do not reopen the call.
1298
+
1299
+ The focused regression covers equivalent extraction normalization, exact-repeat
1300
+ blocking, a different question, and a deeper read. This changes no web provider,
1301
+ network permission, LabCanvas route, or hosted/local model priority.
1302
+
1303
+ ### Image perception reuses one complete visual reading
1304
+
1305
+ `labcanvas-image-perception-idempotency-122` comes from retained production
1306
+ session `web-agent-labcanvas-fab99af8-5b13-489b-ae4e-68f4c15cd8d7`. The agent
1307
+ successfully read one 167031-byte WeCom image three times. Its first typed result
1308
+ already contained the headline, account, visible text, and scene description;
1309
+ the next two calls rephrased the OCR request and produced redundant perception
1310
+ artifacts several minutes apart.
1311
+
1312
+ Image discovery identity now uses the canonical ordered image sources and the
1313
+ requested detail level. Prompt wording, provider labels, model names, and
1314
+ reasoning settings cannot create an unbounded series for an unchanged visual
1315
+ source. One targeted follow-up remains available; a third equivalent-source
1316
+ read is blocked. A higher-detail pass, a different image or image set, and a new
1317
+ task-state epoch remain available.
1318
+
1319
+ The focused regression covers path aliases, prompt/provider variation, the
1320
+ two-pass cap, and a higher-detail positive control. It does not select or change
1321
+ any perception provider and performs no live vision inference.
1322
+
1323
+ ### Structured workspace discovery converges after one complete result
1324
+
1325
+ `labcanvas-structured-workspace-idempotency-123` uses retained production
1326
+ sessions `web-agent-labcanvas-ad4601f6-840b-46c8-b4a1-018491a847bb` and
1327
+ `web-agent-labcanvas-6a712fc4-a1a4-4128-801d-46771cb3c50a`. Exact successful
1328
+ `search_files` calls were repeated up to five times, while one rich root
1329
+ `inspect_project` result was repeated after it had already returned the complete
1330
+ manifest and source-directory inventory.
1331
+
1332
+ Exact structured file searches, project inspections, directory listings, and
1333
+ equivalent plain `ls` calls now share one-use semantic discovery identities in
1334
+ unchanged task state. Case-insensitive search identity ignores letter case.
1335
+ Project inspection identity preserves material `maxDepth` and `includeFiles`
1336
+ scope, and directory identity continues to preserve depth, so a refined search,
1337
+ deeper listing, or richer inspection remains available. Successful mutation or
1338
+ other concrete progress still starts a fresh discovery phase.
1339
+
1340
+ The focused regression covers exact workspace-search reuse, refined-search and
1341
+ richer-inspection positive controls, listing depth, and cross-tool `list_files`
1342
+ to `ls` equivalence. This changes no workspace permissions, tool availability,
1343
+ provider selection, or LabCanvas runtime policy.
1344
+
1345
+ ### Shell discovery requires non-mutation proof
1346
+
1347
+ `labcanvas-shell-discovery-mutation-boundary-124` follows the retained
1348
+ environment-probe loop in production session
1349
+ `web-agent-labcanvas-d2b99a34-8fa9-4157-ade9-a2a00c74940b`. That trace exposed
1350
+ a disagreement between shell command policy and dynamic-step accounting: the
1351
+ discovery classifier used only the first command word, so every command that
1352
+ started with `find`, `cat`, `jq`, `rg`, or another reader looked static even
1353
+ when it deleted files, ran a mutating `-exec`, or redirected output into the
1354
+ workspace. Such a successful mutation could fail to advance the stagnation
1355
+ epoch and could be rejected later by a misleading read-only convergence guard.
1356
+
1357
+ Shell calls now count as static discovery only when their shape is
1358
+ discovery-like and command policy independently proves that they cannot mutate
1359
+ the project. The existing `semanticMayMutateProject=false` escape remains
1360
+ available for conservative broad-pipeline classifications such as
1361
+ `find ... | xargs ls`. Verified leading workspace `cd` wrappers remain
1362
+ transparent. Destructive `find` actions and output redirections remain outside
1363
+ static accounting, while observed mutation and substantive-test progress keep
1364
+ their existing semantics.
1365
+
1366
+ The focused regression covers the retained read-only environment probe,
1367
+ leading-workspace wrappers, `find -delete`, mutating `find -exec`, reader output
1368
+ redirection, and a stale convergence-history negative control. Dynamic-step
1369
+ and syntax checks pass without executing a destructive command, starting a
1370
+ model, or changing LabCanvas routing.
1371
+
1372
+ ### Equivalent document builds share failure state
1373
+
1374
+ `labcanvas-document-compile-alias-convergence-125` follows retained production
1375
+ session `web-agent-labcanvas-d568a2bd-e9d4-48c9-a30e-0e7c830efcd5`. After one
1376
+ real LaTeX source repair, the session exhausted 84 steps while revisiting the
1377
+ same failing `latexmk` build through both an absolute source path and a `cd`
1378
+ plus relative source path. Exact-string guards bounded each spelling
1379
+ separately, but changing the shell spelling incorrectly created another retry
1380
+ budget. A byte-identical later overwrite no longer advances current runtime
1381
+ state, so this path alias remained the live bypass.
1382
+
1383
+ Simple LaTeX compiler invocations now use a semantic failed-command identity:
1384
+ compiler, ordered flags, and the resolved `.tex` source. The absolute-path and
1385
+ working-directory forms of the same build therefore share bounded failure
1386
+ history. Different compilers, flags, source documents, and post-mutation epochs
1387
+ remain independent, preserving legitimate diagnosis and repair.
1388
+
1389
+ The focused regression reproduces the retained path aliases, proves that a
1390
+ third equivalent failure is blocked, and keeps `xelatex`, another source, and a
1391
+ fresh source-edit epoch available. It does not execute LaTeX or change any
1392
+ LabCanvas host policy.
1393
+
1394
+ ### Private context titles never become public web queries
1395
+
1396
+ `labcanvas-web-query-private-context-boundary-126` comes from retained
1397
+ production session `web-agent-labcanvas-795aaa67-fdc2-427c-afd4-9bce957ae32c`.
1398
+ A source-recovery manifest incorrectly described a same-chat history artifact
1399
+ as an article and supplied an exact-title reconstruction query. DeepSeek then
1400
+ sent `Chat History for sunnyyty的聊天记录` to public search providers. The
1401
+ query returned irrelevant generic chat pages, exposed a private transcript
1402
+ label outside the task boundary, and consumed a research step before the model
1403
+ recognized that the real task was an unrelated daily research briefing.
1404
+
1405
+ Public web search now rejects secret-bearing queries and title-shaped private
1406
+ chat, conversation, message, or session-history scaffolds before a custom
1407
+ provider callback or network fetch can run. The same classifier is applied at
1408
+ the agent tool guard and inside direct `searchWeb` calls, so `web_research` and
1409
+ `deep_research` cannot bypass it. The failure tells the agent to search for the
1410
+ underlying public topic without copying names or transcript labels.
1411
+
1412
+ The focused regression uses the exact retained mixed-language query plus
1413
+ English, Chinese, and Japanese variants and proves zero provider dispatch. It
1414
+ also keeps ordinary public queries about safely exporting chat history,
1415
+ conversation-history research, and organoid microfluidics available. This
1416
+ changes no provider choice, network allowlist, LabCanvas policy, schedule, or
1417
+ transport.
1418
+
1419
+ ### LaTeX compilers reject non-TeX document sources before execution
1420
+
1421
+ `labcanvas-document-source-compiler-boundary-127` comes from retained
1422
+ production session
1423
+ `web-agent-labcanvas-aef0f454-06ca-45ed-93ca-21c786de1020`. The task asked for
1424
+ a Markdown report revision and explicitly assigned unavailable Unicode-PDF
1425
+ compilation to the host. After correctly editing the report, the fallback model
1426
+ ran `pdflatex report.md`, searched for a converter, attempted package-manager
1427
+ and Node.js installation routes, and finally requested elevation. The first
1428
+ command was semantically invalid: a LaTeX engine accepts a `.tex` source, not a
1429
+ Markdown, text, HTML, office-document, or PDF input.
1430
+
1431
+ AgInTiFlow now rejects that source/compiler mismatch before launching the
1432
+ process and stops the remaining tool calls in the same assistant batch. The
1433
+ diagnostic directs the model to create or use the complete task-scoped `.tex`
1434
+ source, use an already available declared converter, or return editable source
1435
+ to a host-owned compilation stage. This prevents one invalid premise from
1436
+ cascading into converter installation or permission requests while retaining
1437
+ normal recovery after the model sees the result.
1438
+
1439
+ The focused regression covers the retained `pdflatex report.md` command,
1440
+ XeLaTeX, LuaLaTeX, `latexmk`, shell wrappers, and incompatible Markdown, text,
1441
+ PDF, HTML, and office-document inputs. Positive controls preserve valid `.tex`
1442
+ compilation, option values that happen to carry file extensions, explicit
1443
+ Pandoc conversion, and project build scripts. No compiler is launched, no
1444
+ package is installed, and no LabCanvas provider, schedule, transport, or
1445
+ runtime policy is changed.
1446
+
1447
+ ### Numeric chat identifiers are not truncated into years or forecasts
1448
+
1449
+ `labcanvas-bare-number-claim-boundary-128` comes from retained production
1450
+ sessions `web-agent-labcanvas-d99fc736-db3a-4310-bbe5-c939a779ffca` and
1451
+ `web-agent-labcanvas-a2400822-729d-400b-8a70-2842e3dcefe8`. A user sent the
1452
+ bare message `199793`. Both the route turn and the fast-chat turn produced
1453
+ reasonable clarification responses, but response-only evidence validation
1454
+ rejected them twice and returned an internal evidence failure to the host.
1455
+
1456
+ The root cause was lexical, not provider quality. The Chinese forecast matcher
1457
+ read the last character of `收到` as the temporal preposition `到`, then treated
1458
+ the first four digits of the six-digit value as year `1997`. Related year
1459
+ patterns also lacked numeric boundaries. The source-free claim guard now
1460
+ requires complete four-digit year tokens and an actual Chinese year/deadline
1461
+ suffix after `到`. It also recognizes narrowly framed metalinguistic
1462
+ clarifications about an ambiguous input while continuing to reject external
1463
+ publication, validation, market, and forecast assertions embedded in them.
1464
+
1465
+ The focused regression preserves the exact retained Chinese clarification, a
1466
+ production-shaped route JSON response, and ordinary numeric acknowledgements.
1467
+ Negative controls still reject an ambiguous-message sentence that asserts a
1468
+ 2025 publication and validation, plus an attributed 2030 product forecast.
1469
+ This changes no response schema, model route, LabCanvas prompt, transport, or
1470
+ schedule.
1471
+
1472
+ ### Degenerate transcripts cannot become invented speech summaries
1473
+
1474
+ `labcanvas-bounded-transcript-quality-129` comes from retained production
1475
+ session `web-agent-labcanvas-5fbe19a4-7707-4649-8b50-1e2698ce7141`. The host
1476
+ provided one exact Shipinhao packet for a 47-second video and explicitly asked
1477
+ for a summary of the actual speech. Its transcript consisted almost entirely
1478
+ of repeated `母带`, `混音`, and related production-credit words. The fallback
1479
+ model nevertheless expanded title and hashtag metadata into a fluent account
1480
+ of the video's speech and visuals, and response-only completion accepted it.
1481
+
1482
+ AgInTiFlow now evaluates transcript usability only for structured bounded
1483
+ packets that explicitly request a speech summary. Empty, implausibly sparse,
1484
+ or strongly repetitive transcripts require a reader-facing limitation. The
1485
+ single repair turn prohibits converting title, description, author, or hashtag
1486
+ metadata into speech and restates the caller's JSON key/type contract. If the
1487
+ backend repeats the invention, the runtime returns a schema-compatible
1488
+ limitation and leaves the session stopped rather than recording a successful
1489
+ finish.
1490
+
1491
+ The production-shaped regression covers the exact repetitive transcript, a
1492
+ successful bounded repair, repeated-failure fail-closed behavior, and JSON
1493
+ contract preservation. Positive controls retain an ordinary information-rich
1494
+ transcript and a metadata-only identification request. Media resolution,
1495
+ download, ASR, attachment delivery, provider priority, LabCanvas queues,
1496
+ transport, and schedules remain unchanged.
1497
+
1498
+ ### Fail-closed response-only turns retain the caller envelope
1499
+
1500
+ `labcanvas-response-only-fail-closed-envelope-130` follows retained production
1501
+ session `web-agent-labcanvas-0aa6abef-47a0-4f2a-b07e-ae36281ecd6f`. Its
1502
+ response-only route request declared a strict multi-field JSON schema. The
1503
+ source-free guard correctly stopped a repeated unsupported claim, but returned
1504
+ plain diagnostic prose. That truthful stop was no longer parseable by the
1505
+ caller's declared protocol and could become a dropped or misrouted host task.
1506
+
1507
+ Every response-only fail-closed path now serializes its limitation through the
1508
+ explicit contract. Required keys and value types remain present, declared
1509
+ string enums receive a valid safe value, and diagnostic prose is placed only in
1510
+ a non-enum string field, preferring `message`, `summary`, or `reason`. The same
1511
+ rule covers a repeated malformed JSON answer and a repeated unsupported factual
1512
+ claim. The session still stops, emits its existing private failure event, and
1513
+ never records `session.finished`.
1514
+
1515
+ Production-shaped regressions cover a chat response envelope, the retained
1516
+ router-style enum envelope, and a completion-auditor schema. They force the
1517
+ DeepSeek pre-inference quota handoff through deterministic LocalLLM responses;
1518
+ no live model inference, LabCanvas policy change, queue action, schedule, or
1519
+ transport operation is involved.
1520
+
1521
+ ### Secret-bearing derived content recovers by redaction
1522
+
1523
+ `labcanvas-secret-write-redaction-recovery-131` follows retained production
1524
+ session `web-agent-labcanvas-0ba776d1-2592-45a1-a2f3-e842c092be20`. A
1525
+ Shipinhao source packet contained private signed media fields. While preparing
1526
+ a derived reader-facing note, the fallback model copied a token-like value into
1527
+ an `apply_patch` replacement. The workspace secret guard correctly denied the
1528
+ write, but generic permission advice paused the task and suggested a stronger
1529
+ Docker run. No permission level can make persisting that value safe, so the
1530
+ source-understanding task stopped for an irrelevant user decision.
1531
+
1532
+ Workspace-content secret blocks now advertise one bounded automatic recovery:
1533
+ omit the private URL or replace the sensitive value with `[REDACTED]`, preserve
1534
+ the useful non-sensitive content and requested artifact path, and retry once.
1535
+ The denied write still does not mutate the workspace. The current assistant
1536
+ tool batch is still short-circuited, so later calls cannot act on the invalid
1537
+ content before the model sees the correction. Protected paths,
1538
+ outside-workspace writes, destructive actions, and genuine permission changes
1539
+ retain their existing pause behavior.
1540
+
1541
+ The end-to-end regression first proves the old `permission_required` stop,
1542
+ then proves that a redacted retry creates the exact derived artifact and can
1543
+ finish without exposing the secret. Direct workspace-tool coverage separately
1544
+ proves that the original secret-like write remains blocked. No live model,
1545
+ private media URL, LabCanvas runtime change, queue action, schedule, or
1546
+ transport operation is involved.
1547
+
1548
+ ### Local file URLs recover through workspace-native tools
1549
+
1550
+ `labcanvas-file-url-preview-recovery-132` follows retained production session
1551
+ `web-agent-labcanvas-8239a475-f456-4451-8c31-36428d15803e`. The fallback had
1552
+ already found a task-scoped PDF, but passed its `file://` URL to `open_url`.
1553
+ The browser guard correctly accepts only remote HTTP(S) URLs; generic
1554
+ permission advice nevertheless paused the task and suggested stronger runtime
1555
+ flags. No permission change was needed because the file was already inside the
1556
+ authorized workspace.
1557
+
1558
+ Unsupported browser schemes now carry a distinct recovery category. A local
1559
+ file URL remains blocked before browser navigation, while the next model turn
1560
+ is directed to `open_workspace_file`, `preview_workspace`, or `read_file` using
1561
+ the workspace-relative path. Unsupported non-file schemes are never executed
1562
+ or rewritten; the model may use an exact authorized HTTP(S) source from the
1563
+ current request or report the source limitation honestly.
1564
+
1565
+ The end-to-end regression reproduces the old one-turn permission pause, then
1566
+ proves one workspace-native read and a verified finish. Direct guard coverage
1567
+ also proves that `file://` did not become remotely navigable. Outside-workspace,
1568
+ protected-path, domain-allowlist, and genuine permission boundaries remain
1569
+ unchanged. No live model, browser navigation, LabCanvas runtime mutation,
1570
+ queue action, schedule, or transport operation is involved.
1571
+
1572
+ ### Response-only completion cannot replay host control or prior bot output
1573
+
1574
+ `labcanvas-response-only-context-echo-133` follows retained production session
1575
+ `web-agent-labcanvas-dc5db4bc-5d33-427b-aafb-042e44ef9595`. Its response-only
1576
+ fallback returned the host's evidence-scope object as the finished answer. A
1577
+ second retained trace showed the same failure class after context compaction:
1578
+ the fallback copied a prior bot-authored chat response instead of responding
1579
+ to a different current inbound message. Both outputs could satisfy ordinary
1580
+ plain-text or JSON-shape checks while saying nothing new.
1581
+
1582
+ AgInTiFlow now compares response-only candidates with the exact host control
1583
+ object and attributed `is_self: true` messages in the bounded same-chat
1584
+ context. An exact substantive replay receives one current-turn repair that
1585
+ retains the caller's JSON contract. Explicit verbatim-repeat requests remain
1586
+ valid, while merely quoting an earlier response does not authorize copying it
1587
+ back.
1588
+
1589
+ The regression also forces an unsupported source-free factual answer to be
1590
+ repaired into a stale prior message. A final cross-validator check stops that
1591
+ turn with a schema-compatible limitation and no `session.finished` event. The
1592
+ test uses deterministic provider responses only; no live DeepSeek or LocalLLM
1593
+ inference, LabCanvas host change, queue action, schedule, or transport
1594
+ operation is involved.
1595
+
1596
+ ### Research mutations require their declared evidence manifest
1597
+
1598
+ `labcanvas-research-manifest-grounding-134` follows retained production session
1599
+ `web-agent-labcanvas-d4fc28d0-2a19-488e-8610-5e34eb5172ab`. A report-repair task
1600
+ declared one task-local research evidence manifest as authoritative. The fallback
1601
+ read only the TeX report, introduced a new citation identifier that was absent
1602
+ from the manifest, and described the result as evidence-verified without ever
1603
+ reading the manifest.
1604
+
1605
+ Reader-facing research source mutations now stop before dispatch when the current
1606
+ task explicitly binds them to an evidence, source, citation, or reference
1607
+ manifest that has not been read completely. A bare manifest filename is resolved
1608
+ under the declared artifact root. After the manifest is read, newly introduced
1609
+ LaTeX citation keys, source IDs, DOI values, arXiv identifiers, and URLs must be
1610
+ present in that manifest. Editing the manifest itself remains possible, and
1611
+ ordinary document work without an explicit authoritative-manifest contract is
1612
+ unchanged.
1613
+
1614
+ The production-shaped regression proves the exact unread-manifest block, permits
1615
+ a supported source identifier after a complete read, rejects an unsupported
1616
+ identifier, and preserves both non-contract document edits and direct manifest
1617
+ maintenance. The earlier unrelated-anchor contamination in document validation
1618
+ was already fixed by `84f488f`; this scenario adds only the missing evidence-use
1619
+ boundary. No live DeepSeek or LocalLLM inference, LabCanvas host change, queue
1620
+ action, schedule, or transport operation is involved.
1621
+
1622
+ ### Host-owned document compilation is a dispatch boundary
1623
+
1624
+ `labcanvas-host-compiler-dispatch-135` follows retained production session
1625
+ `web-agent-labcanvas-874e9cf8-2ae9-4238-8289-bc2797dd008a`. Its report-repair
1626
+ contract prohibited agent-side document compilation and assigned the derived
1627
+ PDF build and inspection to the LabCanvas host. The fallback nevertheless ran
1628
+ the same `latexmk` build twice. AgInTiFlow already used host ownership to shape
1629
+ its prompt and completion evidence, but did not enforce it before shell dispatch.
1630
+
1631
+ The shared host-compilation recognizer now covers the retained natural wording
1632
+ that asks the agent to let the host compiler build the PDF, including a preceding
1633
+ compound prohibition such as "do not install or invoke." When that explicit
1634
+ ownership contract is current, direct or bounded shell-wrapped LaTeX, Tectonic,
1635
+ Pandoc, Typst, and Make compiler invocations are blocked before execution. The
1636
+ model receives one automatic source-only recovery instruction and the rest of
1637
+ the same assistant tool batch cannot act on the invalid stage transition.
1638
+
1639
+ The regression uses the retained command shape and covers environment prefixes,
1640
+ shell wrappers, and alternate document compilers. Read-only tool discovery,
1641
+ source validators, ordinary agent-owned compilation, and conditional host
1642
+ fallback remain available. No compiler command, live model, LabCanvas runtime
1643
+ mutation, queue action, schedule, or transport operation is involved.
1644
+
1645
+ ### Text workspace tools cannot fabricate opaque binary artifacts
1646
+
1647
+ `labcanvas-text-binary-artifact-boundary-136` follows retained production
1648
+ session `web-agent-labcanvas-bc69ea98-1fbd-4289-9609-e01b8b5a04a5`. While
1649
+ recovering a scheduled research report, the fallback passed 1,019 bytes of
1650
+ ordinary UTF-8 Chinese text to `write_file` under a `.pdf` filename. The text
1651
+ tool reported success even though the result was not a PDF, allowing a
1652
+ mislabelled artifact to enter later completion and delivery work.
1653
+
1654
+ Workspace text tools now reject writes and patches to opaque binary formats
1655
+ before mutation. The automatic recovery tells the model to create or repair the
1656
+ canonical text-native source and use the established compiler, converter,
1657
+ renderer, generator, or host-owned build stage. It explicitly rejects base64
1658
+ workarounds and extension renaming. The boundary covers PDF and Office
1659
+ documents, raster images, audio/video, archives, executable objects, databases,
1660
+ fonts, and packaged 3D containers. Text-native Markdown, TeX, SVG, STEP, STL,
1661
+ OBJ, JSON, code, and configuration remain writable.
1662
+
1663
+ The direct regression proves that `.pdf`, `.docx`, `.png`, `.mp4`, and `.3mf`
1664
+ targets are blocked without creating files, that an `apply_patch` PDF add is
1665
+ also blocked, and that representative text-native source formats still work.
1666
+ No compiler, live model, LabCanvas runtime mutation, queue action, schedule, or
1667
+ transport operation is involved.
1668
+
1669
+ ### Source-free inspiration cannot invent named evidence
1670
+
1671
+ `labcanvas-source-free-inspiration-grounding-137` follows retained production
1672
+ session `web-agent-labcanvas-98f06435-ce9d-4300-b2b2-e8c4399d46bc`. A scheduled
1673
+ inspiration turn had no fresh evidence manifest or scoped tool evidence, yet
1674
+ the fallback attributed claims to a magazine and a named journal, described
1675
+ results as already validated, and recommended a purported open-source research
1676
+ toolkit. The answer mixed those assertions with a requested high-risk
1677
+ prediction, which made the unsupported grounding look plausible.
1678
+
1679
+ Source-free research and inspiration responses now distinguish two independent
1680
+ things: the assistant may still propose its own clearly labeled, falsifiable
1681
+ hypothesis or experiment, but a named publication, quoted source, or claimed
1682
+ named research resource requires current scoped evidence. Sentence analysis
1683
+ also keeps common `e.g.` and `i.e.` abbreviations intact so an attribution and
1684
+ its evidence claim cannot be separated by punctuation tokenization.
1685
+
1686
+ The production-shaped regression covers the retained English and Chinese
1687
+ claims, equivalent claims with the year removed, a named-tool assertion, a
1688
+ source-free hypothesis positive control, and the same answer with a current
1689
+ evidence ledger. End-to-end cases prove that one correction preserves the
1690
+ caller's five-field JSON envelope and that a second unsupported answer fails
1691
+ closed without `session.finished`. No live model, LocalLLM inference, LabCanvas
1692
+ runtime change, queue action, schedule, or transport operation is involved.
1693
+
1694
+ ### Response-only answers cannot collapse into host acknowledgements
1695
+
1696
+ `labcanvas-response-only-host-acknowledgement-138` follows retained production
1697
+ session `web-agent-labcanvas-21296064-9835-461b-8179-5c8cf5f367a2`. Two
1698
+ schema-valid response-only turns said that a WeCom message had been routed into
1699
+ the LabCanvas runtime and that the requested response format was followed. The
1700
+ host had already performed those operations; the fallback therefore answered
1701
+ its transport wrapper instead of the human message.
1702
+
1703
+ Response-only completion now treats unsolicited routing, forwarding, runtime,
1704
+ and output-contract acknowledgements as private host-control leakage. The
1705
+ check reads the authoritative request from the evidence-scope envelope, so a
1706
+ real user question about routing or backend status remains answerable. One
1707
+ bounded repair asks for the task-facing answer without changing the caller's
1708
+ JSON keys or types. A second acknowledgement fails closed with a schema-valid
1709
+ `handled:false` result and no `session.finished` event.
1710
+
1711
+ The production-shaped regression uses the exact retained English and Chinese
1712
+ outputs. It covers direct detection, an explicit routing-status positive
1713
+ control, a normal human-answer positive control, successful repair, repeated
1714
+ failure, event counts, and JSON-envelope preservation. No live model,
1715
+ LocalLLM inference, LabCanvas runtime change, queue action, schedule, or
1716
+ transport operation is involved.
1717
+
1718
+ ### Blanket-perfect audits receive one skeptical confirmation
1719
+
1720
+ `labcanvas-response-only-perfect-audit-139` follows retained production session
1721
+ `web-agent-labcanvas-497d42ba-3d06-4b6a-8a64-e67726a949a9`. DeepSeek first
1722
+ stopped with an insufficient-balance response. The LocalLLM fallback then
1723
+ accepted a roughly 15,000-character trilingual tutorial with all 11 dimensions
1724
+ scored `5/5` and no issues, despite visible malformed Japanese and an incorrect
1725
+ reading. The complete candidate remained in the active request, so this was an
1726
+ audit-quality failure rather than context loss.
1727
+
1728
+ Response-only completion now asks for exactly one independent skeptical check
1729
+ when an explicit scored audit is accepted, has at least four numeric dimensions,
1730
+ assigns every dimension the request's explicit maximum, and reports no issues or
1731
+ revisions. The check must compare the actual candidate with all material
1732
+ requirements, preserve the caller's JSON contract, and may confirm a genuinely
1733
+ perfect result. Rejected audits, qualified scores, ordinary answers, and reviews
1734
+ without an explicit score range do not receive an extra model turn.
1735
+
1736
+ The production-shaped regression includes the retained malformed Japanese span,
1737
+ proves a corrected rejection after confirmation, proves a clean candidate can
1738
+ remain perfect after exactly two calls, and proves an initially rejected audit
1739
+ uses one call. It also covers direct non-audit and non-perfect controls, event
1740
+ counts, JSON-envelope preservation, and successful completion boundaries. No
1741
+ live DeepSeek or LocalLLM inference, LabCanvas runtime change, queue action,
1742
+ schedule, or transport operation is involved.
1743
+
1744
+ ### Human-facing replies cannot expose private packet identifiers
1745
+
1746
+ `labcanvas-response-only-private-packet-hygiene-140` follows retained production
1747
+ session `web-agent-labcanvas-acfafa25-d3c5-4a4e-9e12-1813973211a2`. A scheduled
1748
+ inspiration reply told group members to reflect on achievements like the
1749
+ `memo_daily` task and put another orchestration phrase in `confirmation`. That
1750
+ identifier came from a private preflight schedule snapshot, not the human-facing
1751
+ request, and should never have appeared in chat.
1752
+
1753
+ Response-only scaffold validation now derives machine-style identifiers from
1754
+ the exact task packet and checks only outward text fields such as `message`,
1755
+ `response`, `chat_reply`, `ack`, and `confirmation`. An identifier is rejected
1756
+ only when it occurs in the private packet and is absent from `current_request`
1757
+ and every explicit request item. The implementation does not contain scheduler
1758
+ names, inspect attachment paths, or reject arbitrary underscore text. A human
1759
+ who explicitly asks about the named internal task can still receive an answer.
1760
+
1761
+ The production-shaped regression proves the original leak failed before the
1762
+ fix, then covers direct detection, explicit-request and unrelated-text controls,
1763
+ one successful schema-preserving repair, and repeated-leak fail-closed behavior
1764
+ without `session.finished`. No live model, LocalLLM inference, LabCanvas runtime
1765
+ change, queue action, schedule, or transport operation is involved.
1766
+
1767
+ ### Schema-valid empty envelopes cannot finish a task
1768
+
1769
+ `labcanvas-response-only-empty-envelope-141` follows retained production session
1770
+ `web-agent-labcanvas-7159acc2-9bbe-4254-825b-ed6819f8e269`. After DeepSeek
1771
+ reported insufficient balance and the LocalLLM request was compacted to fit its
1772
+ context window, the fallback returned a valid chat JSON envelope whose message,
1773
+ confirmation, files, publish state, and generated-content arrays were all empty.
1774
+ AgInTiFlow accepted the field types and emitted `session.finished`, silently
1775
+ clearing a scheduled inspiration task without a reply.
1776
+
1777
+ Host task envelopes now require a meaningful outward payload after structural
1778
+ JSON validation. A nonempty human message, task-scoped attachment, continuation
1779
+ question, knowledge item, upstream feedback item, publish state, or generated
1780
+ content satisfies the boundary. The check applies only when an exact host task
1781
+ packet and a human-facing response field are present; router and audit schemas
1782
+ remain unchanged. An explicit human instruction to leave the message or reply
1783
+ empty is also preserved.
1784
+
1785
+ The production-shaped regression first proves the one-call silent finish on the
1786
+ pre-fix runtime. It then covers direct positive controls, one successful bounded
1787
+ repair, exact JSON-envelope preservation, repeated-empty fail-closed behavior,
1788
+ and absence of `session.finished` after failure. No live model, LocalLLM
1789
+ inference, LabCanvas runtime change, queue action, schedule, or transport
1790
+ operation is involved.
1791
+
1792
+ ### Later repairs cannot reintroduce an empty envelope
1793
+
1794
+ `labcanvas-response-only-post-repair-empty-envelope-142` closes a validator-order
1795
+ gap exposed while reviewing the retained empty-envelope path. A nonempty answer
1796
+ with unsupported named evidence correctly entered source-free repair. Its
1797
+ replacement preserved the JSON schema but emptied every outward field; because
1798
+ the initial payload check had already passed, the replacement could still reach
1799
+ `session.finished`.
1800
+
1801
+ Response-only completion now repeats the semantic outward-payload check at the
1802
+ final acceptance boundary, after every bounded evidence, transcript, context,
1803
+ and scaffold repair. A later repair that erases the answer fails closed using
1804
+ the caller's exact JSON envelope. The runtime does not spend a third model call
1805
+ after a weak backend already failed the requested correction.
1806
+
1807
+ The production-shaped regression proves the before-fix successful finish,
1808
+ retains the source-free rejection event, confirms exactly two model calls,
1809
+ checks the schema-valid stopped result, and proves there is no
1810
+ `session.finished` event. No live model, LocalLLM inference, LabCanvas runtime
1811
+ change, queue action, schedule, or transport operation is involved.
1812
+
1813
+ ### Later repairs cannot reintroduce host control language
1814
+
1815
+ `labcanvas-response-only-post-repair-scaffold-143` extends the final-boundary
1816
+ audit beyond empty payloads. A response with unsupported publication numbers
1817
+ correctly entered source-free repair, but its replacement merely acknowledged
1818
+ that a WeCom message had been routed into LabCanvas and that the output format
1819
+ was followed. The early scaffold check had already passed, so this host-facing
1820
+ implementation detail was previously accepted as a successful human reply.
1821
+
1822
+ Response-only completion now repeats the existing internal-scaffold detector at
1823
+ the final acceptance boundary. If any later evidence or transcript repair
1824
+ introduces host routing acknowledgements, private packet identifiers, recovery
1825
+ instructions, or output-contract narration, the turn stops using the caller's
1826
+ exact JSON envelope. This final check records the defect but does not spend a
1827
+ third model call after the bounded repair budget is exhausted.
1828
+
1829
+ The production-shaped regression proves the vulnerable pre-fix finish and the
1830
+ fixed two-call fail-closed result, including one source-free rejection, one
1831
+ scaffold rejection, no extra scaffold-repair request, schema preservation, and
1832
+ no `session.finished` event. No live model, LocalLLM inference, LabCanvas
1833
+ runtime change, queue action, schedule, or transport operation is involved.
1834
+
1835
+ ### Later repairs cannot invent speech from an unusable transcript
1836
+
1837
+ `labcanvas-response-only-post-repair-transcript-144` continues the bounded
1838
+ Shipinhao transcript audit. The first answer truthfully said that a strongly
1839
+ repetitive transcript could not support a speech summary, but also added an
1840
+ unsupported journal validation claim. Source-free repair removed that claim
1841
+ and replaced the entire answer with a fluent invented account of the video's
1842
+ speech. Because transcript quality had already been checked, the fabricated
1843
+ summary previously reached `session.finished`.
1844
+
1845
+ Response-only completion now repeats bounded-transcript quality validation at
1846
+ the final acceptance boundary. If a later repair drops the required limitation
1847
+ or infers speech from title metadata, the runtime returns the established
1848
+ truthful limitation in the caller's exact JSON envelope. It does not request a
1849
+ third model turn.
1850
+
1851
+ The regression proves the before-fix successful finish and the fixed two-call
1852
+ stop, including the source-free rejection, transcript-quality fail-closed
1853
+ event, parseable limitation message, and absence of `session.finished`. No live
1854
+ model, LocalLLM inference, LabCanvas runtime change, queue action, schedule, or
1855
+ transport operation is involved.
1856
+
1857
+ ### Later repairs cannot bypass skeptical audit confirmation
1858
+
1859
+ `labcanvas-response-only-post-repair-perfect-audit-145` closes the remaining
1860
+ semantic validator-order gap. A qualified audit containing an unsupported
1861
+ journal validation claim correctly entered source-free repair. Its replacement
1862
+ then marked every dimension perfect, accepted the malformed multilingual
1863
+ tutorial, and reported no issue. Because the perfect-audit gate had already
1864
+ seen the earlier rejected review, the unverified replacement previously
1865
+ finished after two calls.
1866
+
1867
+ Perfect-audit confirmation is now a bounded reusable stage that records the
1868
+ exact reviewed result. If a later repair creates a different blanket-perfect
1869
+ audit, AgInTiFlow performs one late skeptical confirmation. The resulting audit
1870
+ then passes through the final output, grounding, payload, current-turn,
1871
+ scaffold, and transcript invariants before completion. A late confirmation
1872
+ cannot silently reintroduce unsupported external claims.
1873
+
1874
+ The production-shaped regression proves the pre-fix two-call acceptance and a
1875
+ fixed three-call path whose independent review finds the malformed Japanese,
1876
+ returns `accepted=false`, preserves the caller schema, and finishes normally.
1877
+ Existing initially perfect, already rejected, qualified, and non-audit controls
1878
+ remain unchanged. No live model, LocalLLM inference, LabCanvas runtime change,
1879
+ queue action, schedule, or transport operation is involved.
1880
+
1881
+ ### Bare artifact outputs resolve inside one authoritative task root
1882
+
1883
+ `labcanvas-scoped-artifact-bare-write-146` follows retained WeCom worker session
1884
+ `web-agent-labcanvas-12fc2f0e-6c81-489c-9d0c-8bde674eeeed`. After DeepSeek
1885
+ balance exhaustion, the LocalLLM correctly attempted to create a task-local
1886
+ report source but supplied only a meaningful basename. AgInTiFlow resolved it
1887
+ at the AgenticApp repository root, then rejected its own resolution as outside
1888
+ the host-declared artifact directory and paused for permission. Stronger host
1889
+ permission could not resolve this path-semantics mismatch.
1890
+
1891
+ Workspace writes now interpret a bare basename relative to the artifact root
1892
+ only when the host marks the run as a scoped artifact task, declares exactly
1893
+ one matching artifact root, and enables write access. The returned tool path is
1894
+ the real workspace-relative rooted path. Absolute paths, parent traversal,
1895
+ directory-bearing relative paths, multiple scopes, reads, and ordinary
1896
+ write-scoped work retain the existing containment behavior.
1897
+
1898
+ The production-shaped executor regression proves the pre-fix block, successful
1899
+ write and exact bytes under the authoritative root after the fix, and negative
1900
+ controls for both non-bare relocation and ordinary outside-root writes. Report
1901
+ source grounding remains independently enforced by the authoritative-manifest
1902
+ boundary from scenario 134. No live model, LocalLLM inference, LabCanvas runtime
1903
+ change, queue action, schedule, or transport operation is involved.
1904
+
1905
+ `labcanvas-scoped-artifact-manifest-composition-147` additionally locks the two
1906
+ boundaries together. A model-supplied bare report basename is still inspected as
1907
+ a reader-facing research mutation before workspace execution, so an unread
1908
+ exact-task evidence manifest blocks the write even though the executor would
1909
+ later anchor that basename inside the one authoritative artifact root. Filename
1910
+ recovery therefore cannot turn unsupported report prose into a successful
1911
+ mutation.
1912
+
1913
+ ### Named research claims remain traceable after manifest read
1914
+
1915
+ `labcanvas-research-attribution-traceability-148` closes a source-integrity gap
1916
+ after the authoritative manifest has been read. The existing mutation boundary
1917
+ rejected invented citation keys, DOI values, URLs, arXiv IDs, and evidence IDs,
1918
+ but returned early when polished prose omitted an identifier entirely. A weak
1919
+ backend could therefore write a sentence such as `Chen et al. (2026) proved
1920
+ ...` without connecting that attribution to any manifest source.
1921
+
1922
+ Reader-facing research mutations now reuse the same multilingual external-claim
1923
+ assessment used by response-only grounding. An attributed evidence claim must
1924
+ contain at least one identifier supported by the task-authoritative manifest.
1925
+ The check is claim-level and applies only under an explicit current research
1926
+ evidence contract after the manifest has been completely read. Ordinary
1927
+ synthesis, clearly labeled assistant-owned hypotheses, manifest edits, stale
1928
+ contracts, and named claims with supported identifiers retain their previous
1929
+ behavior.
1930
+
1931
+ The production-shaped regression first proves the pre-fix acceptance. It then
1932
+ rejects uncited named-study claims in English, Chinese, and Japanese, accepts a
1933
+ supported `S1` citation, and preserves ordinary synthesis and a falsifiable
1934
+ working hypothesis. No live provider, LocalLLM inference, LabCanvas runtime
1935
+ change, queue action, schedule, transport operation, or external side effect is
1936
+ involved.
1937
+
1938
+ ### Shell commands cannot bypass research source review
1939
+
1940
+ `labcanvas-research-shell-mutation-boundary-149` follows retained session
1941
+ `web-agent-labcanvas-bc69ea98-1fbd-4289-9609-e01b8b5a04a5`. Its fallback model
1942
+ used `sed -i` to change a task-local TeX report while an authoritative evidence
1943
+ manifest contract was active. That particular edit targeted typography, but
1944
+ `run_command` bypassed both the mandatory manifest read and the claim-level
1945
+ identifier review applied to structured workspace mutations.
1946
+
1947
+ The manifest boundary now recognizes direct shell content mutations to
1948
+ reader-facing research sources. Before the manifest is read, they receive the
1949
+ same unread-manifest recovery. Afterward, in-place `sed` or `perl`, output
1950
+ redirection, `tee`, direct file replacement, and explicit language-runtime file
1951
+ writes are redirected to `apply_patch` or `write_file`, where the proposed text
1952
+ can be reviewed before mutation. Read-only inspection, validators, compiler
1953
+ invocations, non-reader build logs, stale contracts, and explicit edits to the
1954
+ manifest itself retain their previous behavior.
1955
+
1956
+ The production-shaped regression proves the pre-fix shell bypass and covers a
1957
+ nested shell wrapper, Python `Path.write_text`, structured-edit recovery, and
1958
+ the non-mutation controls. The detector is deliberately not a ban on shell use:
1959
+ it isolates direct reader-source editing while leaving validation and build
1960
+ commands available. No live provider, LocalLLM inference, LabCanvas runtime
1961
+ change, queue action, schedule, transport operation, or external side effect is
1962
+ involved.
1963
+
1964
+ ### Truthful response stops remain human-facing
1965
+
1966
+ `labcanvas-response-only-natural-source-free-stop-150` follows retained
1967
+ sessions `web-agent-labcanvas-a2400822-729d-400b-8a70-2842e3dcefe8` and
1968
+ `web-agent-labcanvas-d99fc736-db3a-4310-bbe5-c939a779ffca`. Their underlying
1969
+ numeric-classification false positive is already fixed by the earlier numeric
1970
+ boundary, but the traces exposed a separate fallback defect: a genuine
1971
+ twice-rejected source-free claim would still return AgInTi evidence-manifest,
1972
+ tool-scope, and resume instructions as the outward chat answer.
1973
+
1974
+ The fail-closed result now states only the truthful user-facing limitation in
1975
+ English, Chinese, or Japanese. It retains a requested `CHAT:` protocol and is
1976
+ still embedded into the caller's exact strict JSON contract when one exists.
1977
+ The private repair prompt also tells a weaker provider not to expose runtime
1978
+ mechanics. Claim detection, the single bounded repair, paused-session state,
1979
+ and the absence of `session.finished` after repeated unsupported claims are
1980
+ unchanged.
1981
+
1982
+ The deterministic provider-handoff regression forces repeated unsupported
1983
+ publication, year, validation, benchmark, and forecast claims. It checks all
1984
+ three language forms, the chat protocol, the full router schema, and absence of
1985
+ private runtime vocabulary while retaining the existing negative evidence
1986
+ controls. No live provider or LocalLLM inference, LabCanvas runtime change,
1987
+ queue action, schedule, transport operation, or external side effect is
1988
+ involved.
1989
+
1990
+ ### JSON contract stops keep diagnostics private
1991
+
1992
+ `labcanvas-response-only-natural-contract-stop-151` extends the same outward
1993
+ response hygiene to strict JSON failures. Existing contract enforcement kept
1994
+ the caller's keys and stopped the session after a second malformed response,
1995
+ but inserted `response-only model`, `output contract`, and missing-key details
1996
+ into a reader-facing string field. That preserved machine parsing while still
1997
+ leaking operator diagnostics into chat or a completion audit.
1998
+
1999
+ The schema-compatible fallback now contains a short, localized statement that
2000
+ a reliable answer in the required format was not produced. Missing keys, type
2001
+ mismatches, enum mismatches, step, provider, and model remain available in the
2002
+ private `response_only.output_contract_failed_closed` event. The caller's exact
2003
+ key order and types, paused state, bounded single repair, and absence of a
2004
+ successful terminal event remain unchanged.
2005
+
2006
+ The deterministic regression covers the retained completion-audit shape and a
2007
+ Chinese chat envelope. It proves exact schema preservation, natural outward
2008
+ text, private diagnostic retention, and zero `session.finished` events after
2009
+ failure. No live provider or LocalLLM inference, LabCanvas runtime change,
2010
+ queue action, schedule, transport operation, or external side effect is
2011
+ involved.
2012
+
2013
+ ### Empty response stops are human-facing
2014
+
2015
+ `labcanvas-response-only-natural-empty-stop-152` covers the adjacent case in
2016
+ which a response-only backend returns the exact JSON shape but leaves every
2017
+ reader-facing field empty twice. The bounded repair and fail-closed stop were
2018
+ already correct, but the synthesized chat field exposed the model, retry,
2019
+ session, provider, and resume mechanism.
2020
+
2021
+ The outward fallback is now a short localized statement that a reliable reply
2022
+ was not produced. Empty-payload classification, response keys, provider/model
2023
+ state, and stop reason remain in private state and events. The deterministic
2024
+ English and Chinese regressions preserve the exact caller schema, one repair,
2025
+ paused state, and absence of `session.finished`. No live provider or LocalLLM
2026
+ inference, LabCanvas runtime change, queue action, schedule, transport
2027
+ operation, or external side effect is involved.
2028
+
2029
+ ### Unusable-answer stops share one natural boundary
2030
+
2031
+ `labcanvas-natural-unusable-response-stops-153` closes the remaining copies of
2032
+ the same outward diagnostic leak. A weak backend that repeated private runtime
2033
+ scaffolding or returned a blank answer twice stopped safely, but the final chat
2034
+ text instructed the human to resume a saved session with another provider.
2035
+
2036
+ One localized helper now serves ordinary empty responses, response-only empty
2037
+ envelopes, and repeated internal-scaffold failures. Their distinct private
2038
+ events, stop reasons, schema fallbacks, and recoverable paused states are
2039
+ unchanged. Deterministic controls cover ordinary and response-only paths plus
2040
+ English, Chinese, and Japanese output; all require bounded repair and forbid a
2041
+ successful terminal event. No live provider or LocalLLM inference, LabCanvas
2042
+ runtime change, queue action, schedule, transport operation, or external side
2043
+ effect is involved.
2044
+
2045
+ ### Scoped tasks cannot borrow sibling artifacts
2046
+
2047
+ `labcanvas-cross-task-artifact-isolation-154` follows retained LabCanvas
2048
+ session `web-agent-labcanvas-064f6714-4b85-463c-af5b-43663f4da56d`. The task
2049
+ declared one authoritative artifact root, but the fallback discovered a sibling
2050
+ task directory, read and validated its report, then finished with that sibling
2051
+ PDF. The file existed and was valid, so ordinary artifact evidence checks could
2052
+ not distinguish it from the current task's result.
2053
+
2054
+ Scoped artifact tasks now derive the containing task namespace from their exact
2055
+ `artifact_root`. Reads, directory probes, shell commands, and completion text
2056
+ may use the current root recursively, but an undeclared sibling root is blocked
2057
+ before inspection or rejected before completion. One bounded repair directs the
2058
+ agent back to the current root. Explicit exact inputs, exact outputs, and
2059
+ declared source roots remain available, so legitimate source reuse is not
2060
+ mistaken for cross-task leakage.
2061
+
2062
+ The regression also exposed that structured contract paths were previously
2063
+ passed through a prose compactor that inserted `... [truncated]` after 120
2064
+ characters. Exact inputs, outputs, exclusions, and source roots now retain their
2065
+ full bounded value up to 1,024 characters. Production-length LabCanvas paths
2066
+ therefore remain usable by the isolation allowlist.
2067
+
2068
+ Deterministic coverage proves rejection and repair of a sibling completion,
2069
+ blocks sibling `read_file` and `run_command` access, permits the current task
2070
+ through both paths, and permits an explicitly declared long sibling source
2071
+ root. No live provider or LocalLLM inference, LabCanvas runtime change, queue
2072
+ action, schedule, transport operation, or external side effect is involved.
2073
+
2074
+ ### Tool-capable tasks preserve strict JSON envelopes
2075
+
2076
+ `labcanvas-tool-capable-json-contract-155` follows retained LabCanvas session
2077
+ `web-agent-labcanvas-97e7f45f-b6ef-4fef-aeb2-c21c43e29b41`. The task used
2078
+ normal file and shell tools to verify a repaired PDF, but its host contract also
2079
+ required one strict JSON object. AgInTi accepted a polished prose `finish`
2080
+ result instead. The work itself was valid, but the caller could not consume the
2081
+ answer and started successor sessions against the same task.
2082
+
2083
+ Explicit JSON contracts are now enforced at the shared completion boundary,
2084
+ not only in the response-only fast path. Both assistant-content and `finish`
2085
+ tool completions receive one bounded schema-preserving repair. A repeated
2086
+ violation pauses without a successful terminal event and returns a parseable
2087
+ fallback object with the requested top-level keys and value types, allowing the
2088
+ host to record the limitation without retrying malformed output indefinitely.
2089
+
2090
+ The deterministic regression proves the retained plain-prose failure before
2091
+ the fix, successful repair through both completion modes, exact required-key
2092
+ and value-type preservation, bounded retry count, and schema-valid fail-closed
2093
+ behavior. No live provider or LocalLLM inference, LabCanvas runtime change,
2094
+ queue action, schedule, transport operation, or external side effect is
2095
+ involved.
2096
+
2097
+ ### Shell authorization is not mutation evidence
2098
+
2099
+ `labcanvas-observed-shell-noop-mutation-156` follows retained LabCanvas session
2100
+ `web-agent-labcanvas-8d2d6b21-e027-4028-950d-1e090e185083`. A successful shell
2101
+ loop only checked installed document tools and extracted PDF text, but its
2102
+ conservative `writesWorkspace: true` policy advanced the project mutation
2103
+ revision. Similar read-only inspections raised the revision repeatedly even
2104
+ though the trace contained only one actual file patch. This could make a
2105
+ rejected artifact repair appear to have received the required fresh source
2106
+ correction.
2107
+
2108
+ The command executor now records when non-Git before/after worktree observation
2109
+ completed. When that evidence is available, the completion recorder advances
2110
+ the revision only for observed changed worktree paths or verified changed exact
2111
+ outputs. Conservative command classification still controls authorization and
2112
+ sandbox selection. Legacy retained results without the observation marker keep
2113
+ their previous conservative replay behavior, and Git workflows retain their
2114
+ special handling because a clean-to-clean commit or pull can change repository
2115
+ history or content without leaving a dirty worktree.
2116
+
2117
+ The production-shaped regression proves that a successful broadly classified
2118
+ inspection with empty observed path sets preserves revision 5, while existing
2119
+ shell-edit, generated-output, failed-command, Git, no-op workspace-write, and
2120
+ verification cases remain covered. The focused mutation suite, all 207 syntax
2121
+ checks, and the complete deterministic `npm test` gate pass. No live provider
2122
+ or LocalLLM inference, LabCanvas runtime change, queue action, schedule,
2123
+ transport operation, or external side effect is involved.
2124
+
2125
+ ### Focused repair packets preserve exact artifact contracts
2126
+
2127
+ `labcanvas-focused-repair-packet-contract-157` continues retained LabCanvas
2128
+ session `web-agent-labcanvas-8d2d6b21-e027-4028-950d-1e090e185083`. Its active
2129
+ scope correctly requested a material PDF repair, while the appended exact task
2130
+ packet named the two rejected PDFs, the missing reader-facing requirement, and
2131
+ the concrete quality defect. Scope narrowing kept only the short request, so
2132
+ SCS saw no exact output path and could accept a nearby or unchanged artifact.
2133
+
2134
+ AgInTi now parses a recognized focused `labcanvas-agent-task-vN` packet through
2135
+ the shared balanced JSON extractor. It projects only bounded repair fields into
2136
+ the internal hard contract: rejected output paths below the active artifact
2137
+ root, remaining artifact requirements, and quality issue identifiers. Packet
2138
+ IDs, retained chat history, route state, scheduler state, and sibling artifact
2139
+ paths are not projected. Packet and retry roots must agree with the active
2140
+ scope; otherwise the projection fails closed.
2141
+
2142
+ The production-shaped regression proves exact-path and quality-defect retention
2143
+ both directly and after the long completion context is compacted. It also
2144
+ injects a sibling PDF and private packet identifier and proves neither enters
2145
+ the output contract or outward outcome. The shared JSON parser keeps its
2146
+ existing perception and response-envelope behavior under focused checks. No
2147
+ live provider or LocalLLM inference, LabCanvas runtime change, queue action,
2148
+ schedule, transport operation, or external side effect is involved.
2149
+
2150
+ ### Host-owned compilation cannot hide behind compiler aliases
2151
+
2152
+ `labcanvas-host-compiler-alias-boundary-158` follows retained LabCanvas session
2153
+ `web-agent-labcanvas-756f4598-34c1-4139-bb48-94673a0fac76`. Its contract
2154
+ assigned Unicode PDF compilation and inspection to the trusted host stage, but
2155
+ the fallback tried to recover an unavailable `xelatex` binary through
2156
+ `xetex -fmt=xelatex`. That compile was bundled after a scratch-directory
2157
+ deletion, so generic shell policy stopped the task for destructive approval
2158
+ before the host-ownership contract could redirect it.
2159
+
2160
+ Host-owned document compilation is now recognized before ordinary shell
2161
+ permission classification, and direct `xetex` invocation is covered alongside
2162
+ the existing LaTeX engines and build wrappers. The complete command remains
2163
+ unexecuted and receives the existing bounded instruction to finish the editable
2164
+ source for the host stage. Agent-owned document builds still use their normal
2165
+ policy, and destructive commands without an exclusive host-compile contract
2166
+ still require approval.
2167
+
2168
+ The production-shaped regression includes the retained scratch reset and
2169
+ `xetex -fmt=xelatex` alias, plus direct, environment-prefixed, shell-wrapped,
2170
+ ordinary agent-owned, conditional-host-fallback, and non-compiling source-check
2171
+ controls. No live provider or LocalLLM inference, LabCanvas runtime change,
2172
+ queue action, schedule, transport operation, or external side effect is
2173
+ involved.
2174
+
2175
+ ### Optional archival cannot stall the active task
2176
+
2177
+ `labcanvas-unrequested-artifact-archive-recovery-159` follows the retained
2178
+ blocked event in LabCanvas session
2179
+ `web-agent-labcanvas-c19ceaee-0b19-4ef3-96f9-43e25ab3dff1`. After substantive
2180
+ report work, the fallback bundled validation with moving three prior PDFs into
2181
+ `_superseded_drafts/`. The active task did not request archival, but unrelated
2182
+ history inside the full host packet could be mistaken for current mutation
2183
+ intent, so the whole task paused for destructive approval.
2184
+
2185
+ Permission intent now uses the authoritative task-scoped request when an
2186
+ `AGINTI_EVIDENCE_SCOPE_JSON` envelope is present. A move is optional
2187
+ housekeeping only when every source is an explicit workspace-relative file and
2188
+ the destination is a clearly archival workspace-relative directory. The move
2189
+ remains blocked and no file is relocated; AgInTi continues with the substantive
2190
+ checks. Globs, outside paths, ordinary renames, arbitrary destinations, and
2191
+ explicit current archive requests remain under normal mutation policy.
2192
+
2193
+ The regression proves the exact retained command changes from a permission
2194
+ pause to bounded recovery, stale archive instructions cannot override the
2195
+ active task, and an active archive request cannot be erased by stale no-move
2196
+ memory. No live provider or LocalLLM inference, LabCanvas runtime change, queue
2197
+ action, schedule, transport operation, or external side effect is involved.
2198
+
2199
+ ### Generic replacement wording does not load a video workflow
2200
+
2201
+ `labcanvas-focused-replacement-skill-routing-160` follows a retained LabCanvas
2202
+ PDF repair whose exact scoped request was correctly isolated from same-chat
2203
+ history. Skill scoring still selected `video-face-image-replacement` because
2204
+ the ordinary document phrase "replacement PDF" matched one component of that
2205
+ multi-part skill ID. This spent a local-model skill slot and prompt budget on
2206
+ an unrelated media workflow.
2207
+
2208
+ `replacement` is now ignored as a standalone skill-ID routing token. Specific
2209
+ video-face trigger phrases still select the workflow, while a focused PDF
2210
+ replacement keeps document skills and omits video guidance. The change affects
2211
+ only skill discovery; task memory, evidence contracts, tool availability, and
2212
+ LabCanvas policy remain unchanged.
2213
+
2214
+ ### Response-only chat does not load an external-media workflow
2215
+
2216
+ `labcanvas-response-only-external-skill-routing-161` follows retained
2217
+ response-only LabCanvas sessions that selected `doubao-external-audio-video`.
2218
+ The current-task scoping itself was correct, but its generic phrase "without
2219
+ external execution" matched the single `external` token in that skill ID.
2220
+
2221
+ `external` is now ignored as a standalone skill-ID routing token. An ordinary
2222
+ response-only chat turn no longer spends local context on Doubao guidance, and
2223
+ an explicit Doubao external-audio video request still selects the workflow via
2224
+ its specific trigger. No response contract, execution policy, memory, provider,
2225
+ or host integration behavior changes.
2226
+
2227
+ ### Generic research stays focused while explicit subdomains still route
2228
+
2229
+ `labcanvas-research-skill-routing-162` follows retained LabCanvas session
2230
+ `web-agent-labcanvas-064f6714-4b85-463c-af5b-43663f4da56d`. A normal daily
2231
+ biomedical-research request loaded market-report, grant-writing, and literature-
2232
+ lookup skills because the generic `research` component of each external skill ID
2233
+ was sufficient evidence. Conversely, natural singular wording such as "NIH
2234
+ grant proposal" did not match plural metadata and omitted the relevant grant
2235
+ skill.
2236
+
2237
+ Generic `research` and `report` components no longer route compound skill IDs.
2238
+ The built-in deep-research skill explicitly owns plain research requests, and
2239
+ conservative English singular/plural matching lets domain-bearing words such as
2240
+ `grant`/`grants`, `proposal`/`proposals`, and `report`/`reports` match without
2241
+ stemming unrelated text. Deterministic controls preserve explicit market
2242
+ research, grant, and literature lookup routes while excluding unrelated
2243
+ research/report skills. No live provider or LocalLLM inference, LabCanvas
2244
+ runtime change, queue action, schedule, transport operation, or external side
2245
+ effect is involved.
2246
+
2247
+ ### Machine repair identifiers do not route domain skills
2248
+
2249
+ `labcanvas-machine-repair-code-skill-routing-163` follows retained LabCanvas
2250
+ PDF-repair session `web-agent-labcanvas-23dfa04f-cef4-4d48-a99e-b152eacf4a99`.
2251
+ The active request included quality identifiers such as
2252
+ `missing_source_level_methods_results_limits` and
2253
+ `missing_actionable_experiments_or_decisions`. Skill routing split those opaque
2254
+ host-contract values into English words and loaded analytical-method validation,
2255
+ clinical decision support, and transcript/video splitting, consuming bounded
2256
+ skill slots during an ordinary report repair.
2257
+
2258
+ Pre-routing normalization now removes multi-part snake-case identifiers before
2259
+ semantic scoring. Natural prose, file extensions, one-underscore names, and
2260
+ explicit hyphenated skill IDs remain available. The production-shaped regression
2261
+ keeps PDF, source-ingestion, and LaTeX guidance while excluding the three false
2262
+ domains; separate natural-language controls still select each excluded skill
2263
+ when it is genuinely requested. No live provider or LocalLLM inference,
2264
+ LabCanvas runtime change, queue action, schedule, transport operation, or
2265
+ external side effect is involved.
2266
+
2267
+ ### Response-only host nouns do not activate domain workflows
2268
+
2269
+ `labcanvas-response-only-host-noun-skill-routing-164` follows retained
2270
+ LabCanvas response-only session
2271
+ `web-agent-labcanvas-dc5db4bc-5d33-427b-aafb-042e44ef9595`. The exact scoped
2272
+ instruction said that the LabCanvas host owned persistence, compilation,
2273
+ validation, and delivery, but the generic words `LabCanvas` and `validation`
2274
+ activated WeChat chatops and analytical-method-validation skills in a turn that
2275
+ explicitly prohibited external action.
2276
+
2277
+ Those platform/control nouns are now ignored as standalone compound skill-ID
2278
+ evidence. Explicit natural requests for WeChat chatops and analytical-method
2279
+ validation still select the correct skills through stronger domain terms and
2280
+ specific triggers. The change affects only skill discovery; response schemas,
2281
+ task context, tool policy, and host ownership remain unchanged. No live provider
2282
+ or LocalLLM inference, LabCanvas runtime change, queue action, schedule,
2283
+ transport operation, or external side effect is involved.
2284
+
2285
+ ### Generic follow-up prose does not satisfy unrelated skill descriptions
2286
+
2287
+ `labcanvas-generic-followup-description-routing-165` follows retained
2288
+ LabCanvas session `web-agent-labcanvas-4bbdae1d-4870-4392-8073-3bccc981a4f3`.
2289
+ Its focused request asked for a complete natural replacement covering the exact
2290
+ current requirements, but ordinary words such as `current`, `requests`, and
2291
+ `explicitly` jointly satisfied the protocols.io description threshold. The
2292
+ fallback consequently spent a bounded skill slot on an unrelated protocol
2293
+ integration during response repair.
2294
+
2295
+ Description stop words now apply through the same conservative singular/plural
2296
+ forms used for positive matching, so `request` also suppresses generic
2297
+ `requests`. Generic control terms such as `current` and `explicitly` no longer
2298
+ act as domain evidence, and `integration` alone cannot route every integration
2299
+ skill by ID. The exact retained follow-up now selects no unrelated skill, while
2300
+ an explicit protocolsio integration request selects only protocols.io rather
2301
+ than sibling Benchling, DNAnexus, LabArchives, or LatchBio integrations. No live
2302
+ provider or LocalLLM inference, LabCanvas runtime change, queue action, schedule,
2303
+ transport operation, or external side effect is involved.
2304
+
2305
+ ### Dotted service names remain distinct from filenames
2306
+
2307
+ `labcanvas-dotted-service-skill-routing-166` covers a natural request to read
2308
+ and export an exact `protocols.io` protocol. Existing path-noise normalization
2309
+ treated the service name as an `.io` filename, so neither ordinary prose nor an
2310
+ official protocols.io URL selected its integration skill. The synthetic
2311
+ undotted spelling `protocolsio` worked, but users should not need to know an
2312
+ internal skill ID.
2313
+
2314
+ Skill routing now derives dotted identities from a skill's own ID, label,
2315
+ description, and triggers. A matching bare domain, subdomain, or HTTP(S) URL
2316
+ adds strong identity evidence only when the compact dotted name occurs in that
2317
+ skill's declared identity. File paths and extension-bearing lookalikes such as
2318
+ `docs/protocols.io.md`, `/tmp/protocols.io`, and `protocols.io.txt` remain under
2319
+ file normalization and do not activate the integration. This is metadata-driven
2320
+ rather than a protocols.io exception and does not weaken path-noise isolation.
2321
+ No live provider or LocalLLM inference, LabCanvas runtime change, queue action,
2322
+ schedule, transport operation, or external side effect is involved.
2323
+
2324
+ ### Completion-audit requirements are diagnostics, not external claims
2325
+
2326
+ `labcanvas-completion-audit-requirement-source-free-167` follows retained
2327
+ LabCanvas session `web-agent-labcanvas-7159acc2-9bbe-4254-825b-ed6819f8e269`.
2328
+ The completion auditor correctly returned the missing requirement
2329
+ `Per reprocess instruction, put the validated PDF itself in candidate_result.`
2330
+ The generic source-free claim validator then read the diagnostic phrase
2331
+ `validated PDF` as an assertion of external validation and rejected the audit,
2332
+ spending an unnecessary model turn before the retained run was interrupted.
2333
+
2334
+ For an explicit completion-audit role with the declared audit schema, source-
2335
+ free claim scanning now uses a temporary copy with only
2336
+ `missing[].requirement` removed. The actual audit result is unchanged. The
2337
+ auditor's `summary`, ordinary response-only output, and every other evidence
2338
+ validator remain covered; regressions prove both negative controls and exact
2339
+ one-call completion for the retained requirement. No live provider or LocalLLM
2340
+ inference, LabCanvas runtime change, queue action, schedule, transport
2341
+ operation, or external side effect is involved.
2342
+
2343
+ ### Completion-audit IDs stay bound to the exact task packet
2344
+
2345
+ `labcanvas-completion-audit-item-identity-168` continues the retained LabCanvas
2346
+ session `web-agent-labcanvas-7159acc2-9bbe-4254-825b-ed6819f8e269`. Its fallback
2347
+ copied example IDs `source:123` and `interruption:456` from the output schema
2348
+ instead of classifying the actual packet items, yet the structurally valid JSON
2349
+ could reach terminal success. That could mark the wrong chat message covered
2350
+ while silently omitting a consecutive or interrupted request.
2351
+
2352
+ Explicit completion-audit turns now derive their allowed IDs from the final
2353
+ task packet and require every request item to appear exactly once across
2354
+ `covered_item_ids` and `missing[].item_id`. Unknown, omitted, duplicated,
2355
+ overlapping, and malformed references receive one bounded repair with the exact
2356
+ allowed IDs. If repair still fails, the run stops without `session.finished`
2357
+ and returns a schema-valid audit that conservatively marks every actual item
2358
+ missing. The retained phantom-ID case, valid result, overlap, repeated failure,
2359
+ and an unrelated strict JSON envelope are covered. No live provider or LocalLLM
2360
+ inference, LabCanvas runtime change, queue action, schedule, transport
2361
+ operation, or external side effect is involved.
2362
+
2363
+ ### Completion-audit missing entries preserve their nested contract
2364
+
2365
+ `labcanvas-completion-audit-missing-entry-shape-169` extends the same retained
2366
+ completion-audit boundary. After exact item identity was enforced, an audit
2367
+ could still classify the right task ID as missing while omitting its actionable
2368
+ `requirement` and returning a `kind` outside the declared
2369
+ `reply|artifact|action` choices. The top-level JSON remained structurally valid,
2370
+ so downstream repair could receive an unusable or misrouted instruction.
2371
+
2372
+ The explicit completion-audit contract now derives each `missing[]` entry's
2373
+ required keys, types, and pipe-delimited enums from the caller's own example.
2374
+ Missing fields, wrong types, empty requirements, non-object entries, and enum
2375
+ violations join the existing item-identity diagnostics and receive the same one
2376
+ bounded repair. This remains scoped to an explicit `completion_audit` role with
2377
+ a recognized task packet; unrelated strict JSON envelopes retain their prior
2378
+ behavior. The before-fix case completed in one call, while the repaired case and
2379
+ provider-handoff compatibility control now pass. No live provider or LocalLLM
2380
+ inference, LabCanvas runtime change, queue action, schedule, transport
2381
+ operation, or external side effect is involved.
2382
+
2383
+ ### Explicitly closed JSON envelopes reject undeclared fields
2384
+
2385
+ `labcanvas-strict-json-unexpected-fields-170` extends the retained response-only
2386
+ host-envelope cases. AgInTi already required every declared top-level key, type,
2387
+ and enum, but it accepted additional fields. A fallback could therefore return
2388
+ the correct host payload plus undeclared provider, trace, status, or runtime
2389
+ metadata and still finish, despite an explicit `strict`, `exactly`, `only`, or
2390
+ `no prose` contract.
2391
+
2392
+ Contract discovery now records whether the exact schema marker closes the
2393
+ top-level shape. Explicit strict/exact/only/no-prose markers and JSON
2394
+ schema/shape/format headings reject undeclared fields, report their names, and
2395
+ use the existing one bounded repair and schema-valid fail-closed path. A plain
2396
+ `Return JSON:` example remains extensible and can carry useful optional fields.
2397
+ Regressions cover both tool-capable completion and DeepSeek-to-LocalLLM
2398
+ response-only handoff, plus the open-shape compatibility control. No live
2399
+ provider or LocalLLM inference, LabCanvas runtime change, queue action,
2400
+ schedule, transport operation, or external side effect is involved.
2401
+
2402
+ ### Completion audits cannot invent legitimate blockers
2403
+
2404
+ `labcanvas-completion-audit-false-blocker-171` comes from retained production
2405
+ session `web-agent-labcanvas-7159acc2-9bbe-4254-825b-ed6819f8e269`. One audit
2406
+ correctly identified that the candidate had produced no reply or artifact, but
2407
+ also returned `legitimate_blocker=true` with an empty `covered_item_ids` array.
2408
+ The candidate had not described a login, approval, dependency, safety, or other
2409
+ blocker. Exact item-identity validation therefore passed a contradictory audit
2410
+ that could turn ordinary missing work into a terminal excuse.
2411
+
2412
+ Completion-audit contract discovery now records whether the exact packet's
2413
+ `candidate_result` actually contains a blocker explanation. A true
2414
+ `legitimate_blocker` is valid only when that candidate evidence exists and the
2415
+ audit places at least one exact task item in `covered_item_ids`, as required by
2416
+ the host contract. Unsupported blocker flags receive the existing single
2417
+ bounded schema repair; repeated invalid output still fails closed with all
2418
+ actual item IDs marked missing and `legitimate_blocker=false`.
2419
+
2420
+ The regression preserves normal missing-work audits, accepts genuine English,
2421
+ Chinese, and Japanese authentication blockers while rejecting their explicit
2422
+ no-blocker forms, and covers the DeepSeek-to-LocalLLM response-only handoff. It
2423
+ performs no live provider inference, LabCanvas runtime change, queue action,
2424
+ schedule operation, transport operation, or external side effect.
2425
+
2426
+ ### Empty candidates cannot cover requested work
2427
+
2428
+ `labcanvas-completion-audit-empty-candidate-coverage-172` was found by pairing
2429
+ every retained completion-audit prompt with its exact task packet and terminal
2430
+ result. Seven audits put one or more exact request IDs in `covered_item_ids`
2431
+ while the explicit `candidate_result` contained no message, file, publication
2432
+ state, generated content, or other meaningful value. Their own summaries said
2433
+ the reply, PDF, or video delivery was missing, but the contradictory structured
2434
+ classification could prevent that work from being reprocessed.
2435
+
2436
+ When an explicit completion-audit packet includes `candidate_result`, contract
2437
+ validation now records whether it has any meaningful output. A genuinely empty
2438
+ candidate cannot cover an item. It receives one bounded repair, and repeated
2439
+ invalid coverage stops conservatively with the actual item marked missing.
2440
+ This rule does not infer emptiness when an older generic packet omits
2441
+ `candidate_result`, and it permits an empty candidate when the exact human
2442
+ request explicitly asks for no reply or a blank response.
2443
+
2444
+ Regressions cover the retained contradiction, bounded repair, repeated-invalid
2445
+ fail-closed behavior, explicit-silence compatibility, omitted-candidate
2446
+ compatibility, and DeepSeek-to-LocalLLM response-only handoff. No live provider
2447
+ or LocalLLM inference, LabCanvas runtime change, queue action, schedule,
2448
+ transport operation, or external side effect is involved.
2449
+
2450
+ ### Local-server smoke tests preserve foreign listeners
2451
+
2452
+ `webapp-command-occupied-port-isolation-173` came from the full package gate,
2453
+ not a synthetic model response. The slash-command smoke selected a random port
2454
+ already occupied on the shared workstation. AgInTiFlow correctly started its
2455
+ webapp on the next compatible port, but the smoke waited only for the original
2456
+ URL and timed out. Its cleanup then used `lsof` against the requested port,
2457
+ which could terminate the unrelated listener while leaving the actual fallback
2458
+ webapp behind.
2459
+
2460
+ The smoke now reserves an occupied kernel-assigned port deliberately, accepts
2461
+ the verified fallback URL printed by the CLI, and checks that the foreign
2462
+ listener survives. Cleanup extracts only URLs observed during that test and
2463
+ calls the normal ownership-aware webapp stop API with the exact temporary
2464
+ runtime directory and home. It no longer kills arbitrary listeners by port.
2465
+ Repeated focused runs also prove that no test-owned fallback process remains.
2466
+ The full gate then exposed the same fixed-range random-port assumption in the
2467
+ standalone public-research smoke. All affected Studio fixtures now ask the
2468
+ kernel for an ephemeral loopback port and consume the child process's announced
2469
+ URL, so a release-to-bind race still follows the product's normal fallback.
2470
+ The standalone public-research CLI accepts port `0` and reports the actual
2471
+ kernel-assigned URL, eliminating that race without probing or killing any
2472
+ foreign listener.
2473
+
2474
+ ### Ambiguous-input clarification is not a forecast
2475
+
2476
+ `labcanvas-ambiguous-input-negated-forecast-174` correlates three retained
2477
+ response-only failures for the bare message `199793`. The router correctly
2478
+ selected natural clarification, but explanations such as “not enough context
2479
+ to predict intent” or “no forecast is requested” contained forecast vocabulary.
2480
+ The evidence guard treated that metalinguistic wording as an external future
2481
+ claim, retried it, then stopped the otherwise valid route.
2482
+
2483
+ The source-free validator now recognizes bounded English, Chinese, and Japanese
2484
+ ambiguous-input explanations and explicit forecast negation. This exception is
2485
+ semantic rather than route-specific: the same sentence must name an ambiguous
2486
+ input or actually negate forecasting, and it stops applying when any residual
2487
+ text asserts a future outcome. Genuine claims such as “the market analysis
2488
+ predicts demand will grow next year” remain fail-closed. A deterministic
2489
+ DeepSeek-to-LocalLLM handoff regression proves the production-shaped route
2490
+ finishes in the first fallback turn without requiring evidence or changing the
2491
+ caller envelope.
2492
+
2493
+ ### Progress acknowledgements cannot close substantive tasks
2494
+
2495
+ `labcanvas-completion-audit-status-only-coverage-175` comes from retained
2496
+ production session `web-agent-labcanvas-7159acc2-9bbe-4254-825b-ed6819f8e269`.
2497
+ A completion candidate said that it would send the finished portion now and
2498
+ supplement the uncovered messages later. The message was nonempty, so the
2499
+ existing empty-candidate safeguard could not prevent an audit from placing the
2500
+ substantive research item in `covered_item_ids`. This is the failure mode behind
2501
+ apparently responsive chat that never delivers the promised answer or artifact.
2502
+
2503
+ Completion-audit contract discovery now distinguishes a human-facing result
2504
+ from a receipt, progress report, queue notice, generic completion assertion, or
2505
+ promise of later delivery. A status-only candidate cannot cover a substantive
2506
+ task item. It gets the existing one bounded repair; repeated invalid coverage
2507
+ fails closed with every exact packet item retained as missing. The test surface
2508
+ uses semantic English, Chinese, and Japanese forms rather than a LabCanvas
2509
+ route or transport special case.
2510
+
2511
+ The compatibility boundary is explicit. A short social turn, a request that
2512
+ asks only for acknowledgement, and a pure status question may be answered with
2513
+ status text. A concrete answer following an acknowledgement, a real attachment,
2514
+ a confirmation question, generated content, publication state, or a genuine
2515
+ blocker remains substantive. Deterministic regressions cover bounded repair,
2516
+ repeated-invalid fail-closed behavior, negated acknowledgement wording, and
2517
+ DeepSeek-to-LocalLLM handoff. No live provider or LocalLLM inference, LabCanvas
2518
+ runtime change, queue action, schedule, transport operation, or external side
2519
+ effect is involved.
2520
+
2521
+ ### Text answers cannot stand in for requested artifacts
2522
+
2523
+ `labcanvas-completion-audit-artifact-coverage-176` extends the retained
2524
+ completion-audit family behind repeated LabCanvas reports that an answer
2525
+ arrived but its requested PDF did not. The auditor could place an exact item in
2526
+ `covered_item_ids` when `candidate_result` contained a useful answer but an
2527
+ empty `files` list. Empty- and status-only-candidate checks did not apply
2528
+ because the answer itself was substantive.
2529
+
2530
+ Completion-audit contract discovery now derives explicit material artifact
2531
+ requirements from each exact request item and compares them with structured
2532
+ candidate evidence. Files, attachments, artifacts, deliverables, matching
2533
+ extensions and MIME types, and host-owned generated PDF content count; a prose
2534
+ claim that a file was sent does not. The check covers common document, image,
2535
+ video, audio, archive, and CAD formats in English, Chinese, and Japanese.
2536
+
2537
+ The intent boundary distinguishes outputs from inputs: reading a PDF,
2538
+ analyzing an attached video, or sending a summary of a video does not require
2539
+ the source media to be returned. Negated artifact requests remain text-only.
2540
+ One invalid audit receives the existing bounded repair. Repeated invalid
2541
+ coverage fails closed with the original exact request retained as a missing
2542
+ artifact item. Deterministic tests cover direct execution and
2543
+ DeepSeek-to-LocalLLM handoff without live inference, LabCanvas changes, queue
2544
+ actions, schedules, transports, or external side effects.
2545
+
2546
+ ### Completion audits enforce negative artifact contracts
2547
+
2548
+ `labcanvas-completion-audit-forbidden-artifact-177` comes from retained
2549
+ production session `web-agent-labcanvas-f8f84223-7216-4bcf-abe6-999d4fb074ff`.
2550
+ Its exact inspiration request required one natural chat message and explicitly
2551
+ said to create no files or attachments. The candidate nevertheless placed
2552
+ `worker_result.json` in the structured outbound file list. The model called it
2553
+ an internal transport envelope and treated the request as covered, contradicting
2554
+ the packet rule that `candidate_result.files` is the outbound attachment list.
2555
+
2556
+ Completion-audit contract discovery now derives negative artifact constraints
2557
+ from each exact request item. Structured files and generated document, image,
2558
+ video, or audio content cannot satisfy a covered message-only item when that
2559
+ item forbids them. Format-specific exclusions remain narrow: a PDF-only request
2560
+ may reject an extra Markdown source without rejecting the PDF. A separate exact
2561
+ item that positively requests an artifact wins only for that independent
2562
+ requirement, preserving consecutive-message composition instead of applying a
2563
+ global no-file switch.
2564
+
2565
+ The retained shape previously completed in one call. Deterministic regressions
2566
+ now cover English, Chinese, and Japanese wording, generated document content,
2567
+ specific-format exclusions, mixed request packets, one bounded repair,
2568
+ schema-compatible failure, and DeepSeek-to-LocalLLM handoff. No live provider
2569
+ or LocalLLM inference, LabCanvas change, queue action, schedule, transport, or
2570
+ external side effect is involved.
2571
+
2572
+ ### Unverified inspirations may contain proposed experiment parameters
2573
+
2574
+ `labcanvas-source-free-inspiration-experiment-178` follows retained production
2575
+ session `web-agent-labcanvas-acfafa25-d3c5-4a4e-9e12-1813973211a2`. A scheduled
2576
+ inspiration explicitly returned `一个未经本机验证的灵感假设`, a falsifiable biological
2577
+ idea, counterexample, and proposed `0/2/4`-hour experiment. The source-free
2578
+ guard rejected it twice: it did not recognize that natural Chinese hypothesis
2579
+ framing, then classified numeric protocol settings and the instruction to
2580
+ validate paired data as completed benchmark and external-evidence claims.
2581
+
2582
+ The source-free classifier now recognizes this assistant-owned unverified
2583
+ hypothesis form even when it appears inside a structured response. It also
2584
+ distinguishes proposed experiment parameters and next-step validation from
2585
+ claims about already observed results. The exception does not cover completed
2586
+ validation or benchmark language, attributed sources, named journals, or named
2587
+ external tools; those still require fresh scoped evidence.
2588
+
2589
+ The exact retained goal and candidate now pass directly. Deterministic tests
2590
+ cover the structured Chinese response, numeric group/duration parameters,
2591
+ completed-result and named-tool negatives, and DeepSeek-to-LocalLLM handoff.
2592
+ No live provider or LocalLLM inference, LabCanvas change, queue action,
2593
+ schedule, transport, or external side effect is involved.