@lazyingart/agintiflow 0.20.178 → 0.20.181
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/autonomous-artifact-pipelines.md +4 -1
- package/docs/self-healing-pipelines.md +3 -1
- package/package.json +3 -2
- package/references/aginti-generalization-audit-2026-05-20.md +66 -0
- package/references/codex-session-cross-references.md +9 -9
- package/scripts/smoke-coding-tools.js +1 -1
- package/scripts/smoke-dynamic-step-budget.js +28 -4
- package/scripts/smoke-model-roles.js +82 -4
- package/scripts/smoke-permission-modes.js +5 -0
- package/scripts/smoke-skills.js +1 -1
- package/scripts/smoke-tmux-tools.js +8 -0
- package/skills/autonomous-artifact-pipeline/SKILL.md +4 -2
- package/skills/bilingual-interlinear-book/SKILL.md +40 -24
- package/skills/self-healing-pipeline/SKILL.md +16 -1
- package/skills/structured-json/SKILL.md +2 -0
- package/src/agent-runner.js +1 -1
- package/src/behavior-contract.js +1 -0
- package/src/command-policy.js +1 -0
- package/src/engineering-guidance.js +2 -2
- package/src/model-client.js +4 -4
- package/src/scs-controller.js +158 -21
- package/src/scs-evidence.js +126 -16
- package/src/task-profiles.js +2 -2
- package/src/tmux-tools.js +1 -1
- package/src/workspace-tools.js +9 -0
|
@@ -11,6 +11,7 @@ Each pipeline should create these project-local files or equivalents:
|
|
|
11
11
|
- Task manifest: stable chunk IDs, source locations, dependencies, prompt/schema version, and output paths.
|
|
12
12
|
- Schema and validator: the exact artifact shape plus semantic checks that define a promotable output.
|
|
13
13
|
- Runners: writer, reviewer, repairer, monitor, merge, compile/export, and status commands.
|
|
14
|
+
- Freshness markers: run IDs, heartbeats, log/status timestamps, and tmux markers that separate a current run from old scrollback.
|
|
14
15
|
- Completion report: counts, first missing ID, failed/quarantined items, latest previews, final artifact paths, and resume commands.
|
|
15
16
|
|
|
16
17
|
The target repository owns its schemas, prompts, chunk policy, and rendering code. AgInTiFlow owns the behavior: inspect, create missing scripts, run observable sessions, preserve valid work, validate, repair, compile, and report evidence.
|
|
@@ -27,10 +28,12 @@ The repairer runs independently of the writer. It can wake from status files, ha
|
|
|
27
28
|
|
|
28
29
|
The monitor is gentle. It waits through healthy progress and provider limits, restarts only on hard evidence of stall or crash, and records each decision.
|
|
29
30
|
|
|
31
|
+
When the monitor restarts a tmux worker, it should require a fresh run marker or updated heartbeat before judging the new run. Capturing a pane immediately after restart can include old failures; those lines are history unless they occur after the current marker or current log timestamp.
|
|
32
|
+
|
|
30
33
|
## Concurrency
|
|
31
34
|
|
|
32
35
|
Parallelism is optional. When used, each worker needs deterministic shard ownership, separate logs, atomic writes, and no direct compile responsibility. Merge, promotion, compilation, publishing, and commits should be serialized unless the project already has a safe coordinator.
|
|
33
36
|
|
|
34
37
|
## Completion
|
|
35
38
|
|
|
36
|
-
A run is complete only when the final artifact was built from the current manifest and the status report shows full coverage or intentional quarantine. A successful tmux pane, a page count, or a single preview file is not enough.
|
|
39
|
+
A run is complete only when the final artifact was built from the current manifest and the status report shows full coverage or intentional quarantine. A successful tmux pane, stale scrollback, a page count, or a single preview file is not enough.
|
|
@@ -14,10 +14,12 @@ Concurrency is a tool, not a product stance. AgInTiFlow should choose sequential
|
|
|
14
14
|
|
|
15
15
|
Review and repair are separate from writing. A reviewer should detect missing source units, repeated filler, malformed structured data, source drift, and known quality failures, then produce candidate repairs or failed-only requests. A repairer should be able to run independently of the writer, wake from status files, run bounded passes, and exit without blocking healthy progress.
|
|
16
16
|
|
|
17
|
+
Tmux evidence must be fresh. Tmux panes preserve old scrollback, so after a restart the agent should emit a unique run marker into the pane and durable log/status file, then verify output after that marker. If no marker exists, it must compare log mtimes, process PID/elapsed time, and status timestamps before claiming the current run is healthy. Old failures in scrollback are useful history, not proof that the restarted worker is still failing.
|
|
18
|
+
|
|
17
19
|
## Boundaries
|
|
18
20
|
|
|
19
21
|
AgInTiFlow should not embed project-specific schemas in its core. A book writer, data pipeline, or build system owns its own validators and artifact layout. AgInTiFlow provides the reusable behavior: diagnose, preserve valid work, patch the local workflow, verify, build checkpoint artifacts, restart only affected sessions, and report exact resume commands.
|
|
20
22
|
|
|
21
23
|
## Verification
|
|
22
24
|
|
|
23
|
-
After a repair, the agent should run syntax checks for changed scripts, perform a dry-run or bounded batch when safe, inspect counters
|
|
25
|
+
After a repair, the agent should run syntax checks for changed scripts, perform a dry-run or bounded batch when safe, inspect counters, first-missing IDs, fresh run markers, and timestamps, and keep unrelated tmux sessions running. If the same symptom repeats, the agent should improve the project workflow or a reusable AgInTiFlow skill instead of repeatedly sending manual nudges.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lazyingart/agintiflow",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.181",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AgInTiFlow is a project-aware agent workspace for hybrid wet-dry R&D, hardware-aware intelligence, software automation, and industrial workflows.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"scripts": {
|
|
92
92
|
"start": "node run.js",
|
|
93
93
|
"web": "node web.js",
|
|
94
|
-
"check": "node --check run.js && node --check web.js && node --check bin/aginti-cli.js && node --check src/*.js && node --check src/mcp/*.js && node --check public/app.js && node --check scripts/seed-supervised-homework.js && node --check scripts/smoke-mcp.js && node --check scripts/smoke-web-ui.js && node --check scripts/fixtures/mcp-stdio-smoke-server.mjs",
|
|
94
|
+
"check": "node --check run.js && node --check web.js && node --check bin/aginti-cli.js && node --check src/*.js && node --check src/mcp/*.js && node --check public/app.js && node --check scripts/seed-supervised-homework.js && node --check scripts/smoke-mcp.js && node --check scripts/smoke-web-ui.js && node --check scripts/smoke-scs-evidence-visibility.js && node --check scripts/fixtures/mcp-stdio-smoke-server.mjs",
|
|
95
95
|
"setup:toolchain-docker": "scripts/setup-agent-toolchain-docker.sh",
|
|
96
96
|
"smoke:coding-tools": "node scripts/smoke-coding-tools.js",
|
|
97
97
|
"smoke:dynamic-step-budget": "node scripts/smoke-dynamic-step-budget.js",
|
|
@@ -102,6 +102,7 @@
|
|
|
102
102
|
"smoke:cli-chat": "node scripts/smoke-cli-chat.js",
|
|
103
103
|
"smoke:docker-command": "node scripts/smoke-docker-command.js",
|
|
104
104
|
"smoke:skills": "node scripts/smoke-skills.js",
|
|
105
|
+
"smoke:scs-evidence": "node scripts/smoke-scs-evidence-visibility.js",
|
|
105
106
|
"smoke:skillmesh": "node scripts/smoke-skillmesh.js",
|
|
106
107
|
"smoke:toolchain-docker": "node scripts/smoke-toolchain-docker.js",
|
|
107
108
|
"smoke:inbox": "node scripts/smoke-inbox.js",
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# AgInTiFlow Generalization Audit
|
|
2
|
+
|
|
3
|
+
Date: 2026-05-20
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
This audit checks whether the core AgInTiFlow runtime learned a general problem-solving capability, or whether it accidentally hard-coded a project-specific browser workflow.
|
|
8
|
+
|
|
9
|
+
Reviewed areas:
|
|
10
|
+
|
|
11
|
+
- SCS controller and evidence gates
|
|
12
|
+
- Engineering guidance and dynamic step budget
|
|
13
|
+
- Built-in skills and project-local skill loading
|
|
14
|
+
- Smoke tests that protect browser workflows, upload contracts, and SCS validation
|
|
15
|
+
|
|
16
|
+
## Findings
|
|
17
|
+
|
|
18
|
+
AgInTiFlow core should stay task-independent. It may know that browser work often needs page-state reconciliation, scoped selectors, attachment verification, model/duration verification, submit evidence, and external blocker handling. It should not know a private platform name, a private repository name, a private character set, a fixed prompt, or fixed asset filenames.
|
|
19
|
+
|
|
20
|
+
The useful general capability is:
|
|
21
|
+
|
|
22
|
+
- derive a task contract from the user's request
|
|
23
|
+
- preserve exact input paths and forbidden actions
|
|
24
|
+
- reject plans that invent unrequested uploads or skipped UI actions
|
|
25
|
+
- require concrete browser, visual, filesystem, or command evidence before finish
|
|
26
|
+
- route failed finish claims back to a validator/replan loop
|
|
27
|
+
- load narrow project-local skills from `.aginti/skills/<skill-id>/SKILL.md`
|
|
28
|
+
|
|
29
|
+
## Remediation
|
|
30
|
+
|
|
31
|
+
Project-specific browser/video terms were removed from core heuristics and smoke fixtures. Generic Chinese and English browser workflow terms remain because they apply across websites.
|
|
32
|
+
|
|
33
|
+
Kept in core:
|
|
34
|
+
|
|
35
|
+
- generic browser composer guidance
|
|
36
|
+
- generic upload/asset-library/reference-media verification
|
|
37
|
+
- generic model, mode, duration, and submit-state verification
|
|
38
|
+
- generic external blocker handling such as login, captcha, credits, permission, server error, or user confirmation
|
|
39
|
+
- project-local skill loading and skill-creation workflow
|
|
40
|
+
|
|
41
|
+
Moved out of core:
|
|
42
|
+
|
|
43
|
+
- private platform names
|
|
44
|
+
- private repository names
|
|
45
|
+
- private asset filenames
|
|
46
|
+
- private character names
|
|
47
|
+
- task-specific model branding examples
|
|
48
|
+
|
|
49
|
+
## Design Rule
|
|
50
|
+
|
|
51
|
+
If a future task requires special UI labels, account behavior, reference media, or platform-specific workarounds, create or update a project-local skill. Only promote a rule into AgInTiFlow core when the rule applies to a broad class of tasks such as browser form submission, book generation, LaTeX compilation, translation, testing, or deployment.
|
|
52
|
+
|
|
53
|
+
## Verification
|
|
54
|
+
|
|
55
|
+
Commands run:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm run check
|
|
59
|
+
npm run smoke:model-roles
|
|
60
|
+
node scripts/smoke-skills.js
|
|
61
|
+
node scripts/smoke-dynamic-step-budget.js
|
|
62
|
+
node scripts/smoke-coding-tools.js
|
|
63
|
+
rg -n --hidden --glob '!node_modules/**' --glob '!.git/**' --glob '!dist/**' --glob '!coverage/**' 'xiaoyunque|小云雀|xyq|jianying|LALACHAN|啦啦|拉拉|阿芽|飒飒|Seedance|沉浸式短片|Trio\.png|display\.png|R1\.jpg|patchwork-leather|duanpian' .
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Result: checks passed, and the repository search found no remaining private workflow terms in AgInTiFlow runtime code, tests, or general references after excluding this audit's own search expression.
|
|
@@ -40,30 +40,30 @@ AgInTiFlow relevance:
|
|
|
40
40
|
- AgInTiFlow must not own or silently mutate AAPS-selected project, workflow,
|
|
41
41
|
program, block, or working file.
|
|
42
42
|
|
|
43
|
-
###
|
|
43
|
+
### Browser Automation And AgInTi Supervision Source Session
|
|
44
44
|
|
|
45
45
|
- Session: `019dc795-e538-75b2-8a03-bc103b32985d`
|
|
46
|
-
- Status context shown by Codex:
|
|
47
|
-
- Primary repo involved:
|
|
46
|
+
- Status context shown by Codex: a project-local media/browser workflow repo
|
|
47
|
+
- Primary repo involved: project-local, outside AgInTiFlow core
|
|
48
48
|
- Related AgInTiFlow repo: `/home/lachlan/ProjectsLFS/Agent/AgInTiFlow`
|
|
49
49
|
- Role: failure-source and product-requirement session.
|
|
50
50
|
|
|
51
|
-
This session started from
|
|
52
|
-
|
|
51
|
+
This session started from a project-local browser video workflow and exposed a
|
|
52
|
+
general AgInTiFlow weakness: the executor could claim progress or completion
|
|
53
53
|
without enough evidence that the requested browser state, upload state, selected
|
|
54
54
|
mode, selected model, prompt, reference media, or generated artifact actually
|
|
55
55
|
existed.
|
|
56
56
|
|
|
57
57
|
Important lesson from this session:
|
|
58
58
|
|
|
59
|
-
- Do not hard-code
|
|
59
|
+
- Do not hard-code project-specific browser workflow rules into AgInTiFlow core.
|
|
60
60
|
- Keep domain details in project-local skills such as `.aginti/skills/<id>/SKILL.md`.
|
|
61
61
|
- Improve the core agent harness instead: task contract, monitor, evidence ledger,
|
|
62
62
|
validator gate, replan loop, and real blocker reporting.
|
|
63
63
|
|
|
64
64
|
Project-local skill produced from this direction:
|
|
65
65
|
|
|
66
|
-
-
|
|
66
|
+
- `.aginti/skills/<project-browser-workflow>/SKILL.md` in the task repository
|
|
67
67
|
|
|
68
68
|
### ZhJpBook And AgInTiFlow Implementation Session
|
|
69
69
|
|
|
@@ -76,7 +76,7 @@ Project-local skill produced from this direction:
|
|
|
76
76
|
This session used a long bilingual book pipeline to stress AgInTiFlow's ability
|
|
77
77
|
to run durable, evidence-based work: source conversion, chunking, DeepSeek JSON
|
|
78
78
|
writing, validation, monitoring, PDF compilation, artifact handling, and recovery.
|
|
79
|
-
The same core principle from the
|
|
79
|
+
The same core principle from the browser workflow session was then implemented in
|
|
80
80
|
AgInTiFlow.
|
|
81
81
|
|
|
82
82
|
Relevant AgInTiFlow commits:
|
|
@@ -127,7 +127,7 @@ These sessions should be read together:
|
|
|
127
127
|
- Agent Meta-AAPS supplies the cross-repo bridge: AAPS borrows useful
|
|
128
128
|
AgInTiFlow interaction patterns while keeping AAPS as the state and semantics
|
|
129
129
|
owner.
|
|
130
|
-
-
|
|
130
|
+
- The browser workflow session supplies the concrete failure mode: browser automation and media tasks
|
|
131
131
|
can look successful while the visible external state is wrong or unverified.
|
|
132
132
|
- ZhJpBook supplies the long-running pipeline pressure: the agent must keep
|
|
133
133
|
moving through scripts, monitors, validators, and artifacts without accepting
|
|
@@ -448,7 +448,7 @@ try {
|
|
|
448
448
|
assert(hostLocalhostJsonProbePolicy.allowed, "host localhost JSON probe should not require full-host destructive access");
|
|
449
449
|
assert(hostLocalhostJsonProbePolicy.category === "network-fetch", "host localhost JSON probe should stay classified as network-fetch");
|
|
450
450
|
const absolutePythonHelperPolicy = evaluateCommandPolicy(
|
|
451
|
-
"/home/lachlan/miniconda3/bin/python scripts/
|
|
451
|
+
"/home/lachlan/miniconda3/bin/python scripts/browser_cdp_helper.py list-pages",
|
|
452
452
|
hostWorkspacePolicy
|
|
453
453
|
);
|
|
454
454
|
assert(absolutePythonHelperPolicy.allowed, "host absolute Python helper script should be allowed without full-host destructive access");
|
|
@@ -7,6 +7,7 @@ import { runAgent } from "../src/agent-runner.js";
|
|
|
7
7
|
import { resolveRuntimeConfig } from "../src/config.js";
|
|
8
8
|
import {
|
|
9
9
|
browserSubmitFinishIssue,
|
|
10
|
+
isRecoverableShellToolResult,
|
|
10
11
|
isSuspiciousBroadBrowserToolResult,
|
|
11
12
|
shouldActivateScs,
|
|
12
13
|
shouldReviewToolResult,
|
|
@@ -85,6 +86,29 @@ try {
|
|
|
85
86
|
shouldReviewToolResult(broadBrowserClick, { meta: {} }),
|
|
86
87
|
"SCS should review suspicious broad browser click results"
|
|
87
88
|
);
|
|
89
|
+
const blockedSecretProbe = {
|
|
90
|
+
toolName: "run_command",
|
|
91
|
+
blocked: true,
|
|
92
|
+
args: { command: "env | grep API_KEY" },
|
|
93
|
+
reason: "Command is blocked because it references secrets or credential files.",
|
|
94
|
+
};
|
|
95
|
+
assert(isRecoverableShellToolResult(blockedSecretProbe), "SCS should classify blocked secret probes as recoverable shell results");
|
|
96
|
+
assert(
|
|
97
|
+
!shouldReviewToolResult(blockedSecretProbe, { meta: {} }),
|
|
98
|
+
"SCS should not derail the phase for a safely blocked credential probe"
|
|
99
|
+
);
|
|
100
|
+
const malformedReadOnlyCheck = {
|
|
101
|
+
toolName: "run_command",
|
|
102
|
+
ok: false,
|
|
103
|
+
exitCode: 2,
|
|
104
|
+
args: { command: "for f in *.pdf; do python3 -c 'print(\"oops\")'" },
|
|
105
|
+
stderr: "/bin/bash: -c: line 9: syntax error: unexpected end of file",
|
|
106
|
+
};
|
|
107
|
+
assert(isRecoverableShellToolResult(malformedReadOnlyCheck), "SCS should classify shell quoting mistakes as recoverable");
|
|
108
|
+
assert(
|
|
109
|
+
!shouldReviewToolResult(malformedReadOnlyCheck, { meta: {} }),
|
|
110
|
+
"SCS should let the normal agent loop repair simple shell quoting mistakes"
|
|
111
|
+
);
|
|
88
112
|
assert(
|
|
89
113
|
!isSuspiciousBroadBrowserToolResult({
|
|
90
114
|
toolName: "run_command",
|
|
@@ -96,19 +120,19 @@ try {
|
|
|
96
120
|
);
|
|
97
121
|
assert(
|
|
98
122
|
recommendedMaxStepsForTask({
|
|
99
|
-
goal: "Use Chrome CDP to upload five images, select an asset-library video, choose non-
|
|
123
|
+
goal: "Use Chrome CDP to upload five images, select an asset-library video, choose the requested non-premium model tier, and submit the browser composer.",
|
|
100
124
|
}) >= 48,
|
|
101
125
|
"browser submit workflows need a larger default step budget"
|
|
102
126
|
);
|
|
103
127
|
assert(
|
|
104
128
|
browserSubmitFinishIssue(
|
|
105
|
-
"
|
|
106
|
-
"
|
|
129
|
+
"网页创作器上传五张图,从素材库选择参考视频,然后提交生成",
|
|
130
|
+
"素材库参考视频 未执行;提交 未执行;步骤不足。"
|
|
107
131
|
),
|
|
108
132
|
"SCS finish gate should reject unfinished browser submit reports"
|
|
109
133
|
);
|
|
110
134
|
assert(
|
|
111
|
-
!browserSubmitFinishIssue("
|
|
135
|
+
!browserSubmitFinishIssue("网页创作器提交生成", "停止:积分不足,需要用户处理 credits not enough。"),
|
|
112
136
|
"SCS finish gate should allow real external browser blockers"
|
|
113
137
|
);
|
|
114
138
|
|
|
@@ -11,7 +11,13 @@ import {
|
|
|
11
11
|
} from "../src/model-routing.js";
|
|
12
12
|
import { normalizeTextToolCallResponse, parseTextToolCalls, usesTextToolProtocol } from "../src/model-client.js";
|
|
13
13
|
import { modelRoleChoices, selectorVisibleWindow } from "../src/interactive-cli.js";
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
buildScsEvidencePack,
|
|
16
|
+
buildSupervisorInstruction,
|
|
17
|
+
deterministicPlanActionContradiction,
|
|
18
|
+
reviewScsFinish,
|
|
19
|
+
shouldRequestScsReplan,
|
|
20
|
+
} from "../src/scs-controller.js";
|
|
15
21
|
import { buildScsEvidenceLedger, deriveScsTaskContract, evaluateScsEvidence } from "../src/scs-evidence.js";
|
|
16
22
|
|
|
17
23
|
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
@@ -249,9 +255,28 @@ assert(scsEvidence.includes("evidenceLedger"), "SCS evidence pack should include
|
|
|
249
255
|
assert(scsEvidence.includes("evaluation"), "SCS evidence pack should include deterministic contract evaluation");
|
|
250
256
|
|
|
251
257
|
const uploadContract = deriveScsTaskContract({
|
|
252
|
-
goal:
|
|
258
|
+
goal:
|
|
259
|
+
"Upload five images in the browser composer and verify visible thumbnails: /tmp/reference-a.png /tmp/reference-b.png /tmp/reference-c.png. Do not submit.",
|
|
253
260
|
taskProfile: "website",
|
|
254
261
|
});
|
|
262
|
+
assert(
|
|
263
|
+
uploadContract.exactInputPaths.includes("/tmp/reference-a.png") &&
|
|
264
|
+
uploadContract.exactInputPaths.includes("/tmp/reference-b.png") &&
|
|
265
|
+
uploadContract.exactInputPaths.includes("/tmp/reference-c.png"),
|
|
266
|
+
"SCS contract should preserve exact input/reference paths for browser upload tasks"
|
|
267
|
+
);
|
|
268
|
+
const uploadImagePlanContradiction = deterministicPlanActionContradiction(
|
|
269
|
+
"Find the latest .mp4 in the project, upload the video file, then click submit.",
|
|
270
|
+
uploadContract
|
|
271
|
+
);
|
|
272
|
+
assert(
|
|
273
|
+
/video-file upload/i.test(uploadImagePlanContradiction || ""),
|
|
274
|
+
"SCS deterministic plan gate should reject invented video-file uploads for image-upload tasks"
|
|
275
|
+
);
|
|
276
|
+
assert(
|
|
277
|
+
!deterministicPlanActionContradiction("Upload the five images, verify thumbnails, and do not submit.", uploadContract),
|
|
278
|
+
"SCS deterministic plan gate should allow matching image-upload plans"
|
|
279
|
+
);
|
|
255
280
|
assert(uploadContract.requiresExternalEvidence, "browser upload contract should require external evidence");
|
|
256
281
|
assert(
|
|
257
282
|
uploadContract.requiredEvidence.some((item) => item.category === "browser"),
|
|
@@ -272,7 +297,7 @@ const weakUploadLedger = buildScsEvidenceLedger({
|
|
|
272
297
|
toolName: "run_command",
|
|
273
298
|
ok: true,
|
|
274
299
|
exitCode: 0,
|
|
275
|
-
args: { command: "scripts/cdp-helper set-file-input PAGE_ID
|
|
300
|
+
args: { command: "scripts/cdp-helper set-file-input PAGE_ID reference-a.png reference-b.jpg" },
|
|
276
301
|
stdout: '{"ok":true,"nodeCount":1}',
|
|
277
302
|
}),
|
|
278
303
|
},
|
|
@@ -292,7 +317,7 @@ const strongUploadLedger = buildScsEvidenceLedger({
|
|
|
292
317
|
toolName: "run_command",
|
|
293
318
|
ok: true,
|
|
294
319
|
exitCode: 0,
|
|
295
|
-
args: { command: "scripts/cdp-helper upload-images-verify PAGE_ID
|
|
320
|
+
args: { command: "scripts/cdp-helper upload-images-verify PAGE_ID reference-a.png reference-b.jpg --screenshot outputs/upload.png" },
|
|
296
321
|
stdout: '{"ok":true,"visibleEvidenceCount":5,"screenshot":"outputs/upload.png"}',
|
|
297
322
|
}),
|
|
298
323
|
},
|
|
@@ -365,6 +390,42 @@ const jsonObjectContract = deriveScsTaskContract({
|
|
|
365
390
|
const virtualFileContract = deriveScsTaskContract({
|
|
366
391
|
goal: "Create file: /workspace/virtual-output.txt with virtual Docker path support.",
|
|
367
392
|
});
|
|
393
|
+
const outputListContract = deriveScsTaskContract({
|
|
394
|
+
goal: [
|
|
395
|
+
"Create:",
|
|
396
|
+
"- `work/demo/generate_items.py`",
|
|
397
|
+
"- `work/demo/review_items.py`",
|
|
398
|
+
"",
|
|
399
|
+
"Validate with `work/demo/validate_items.py` before promoting output.",
|
|
400
|
+
"Do not treat `work/demo/existing_validator.py` as an output artifact.",
|
|
401
|
+
"",
|
|
402
|
+
"Output structure:",
|
|
403
|
+
"- `build/demo/primary/color/book.pdf`",
|
|
404
|
+
"- `build/demo/secondary/color/book.pdf`",
|
|
405
|
+
"",
|
|
406
|
+
"Each generated item file goes to:",
|
|
407
|
+
"`data/demo/items/{item_id}.json`",
|
|
408
|
+
].join("\n"),
|
|
409
|
+
taskProfile: "code",
|
|
410
|
+
});
|
|
411
|
+
const manyOutputContract = deriveScsTaskContract({
|
|
412
|
+
goal: [
|
|
413
|
+
"Required outputs:",
|
|
414
|
+
"- `out/a01.json`",
|
|
415
|
+
"- `out/a02.json`",
|
|
416
|
+
"- `out/a03.json`",
|
|
417
|
+
"- `out/a04.json`",
|
|
418
|
+
"- `out/a05.json`",
|
|
419
|
+
"- `out/a06.json`",
|
|
420
|
+
"- `out/a07.json`",
|
|
421
|
+
"- `out/a08.json`",
|
|
422
|
+
"- `out/a09.json`",
|
|
423
|
+
"- `out/a10.json`",
|
|
424
|
+
"- `out/a11.json`",
|
|
425
|
+
"- `out/a12.json`",
|
|
426
|
+
].join("\n"),
|
|
427
|
+
taskProfile: "code",
|
|
428
|
+
});
|
|
368
429
|
const generatedReviewContract = deriveScsTaskContract({
|
|
369
430
|
goal: [
|
|
370
431
|
"Review focus: changed files only",
|
|
@@ -398,6 +459,23 @@ assert(
|
|
|
398
459
|
!virtualFileContract.requiredEvidence.some((item) => item.category === "artifact"),
|
|
399
460
|
"virtual output filename should require file evidence without treating output in the filename as an artifact"
|
|
400
461
|
);
|
|
462
|
+
assert(
|
|
463
|
+
outputListContract.exactOutputPaths.includes("work/demo/generate_items.py") &&
|
|
464
|
+
outputListContract.exactOutputPaths.includes("work/demo/review_items.py") &&
|
|
465
|
+
outputListContract.exactOutputPaths.includes("build/demo/primary/color/book.pdf") &&
|
|
466
|
+
outputListContract.exactOutputPaths.includes("build/demo/secondary/color/book.pdf"),
|
|
467
|
+
"SCS should infer exact outputs from Create/Output structure list sections"
|
|
468
|
+
);
|
|
469
|
+
assert(
|
|
470
|
+
!outputListContract.exactOutputPaths.includes("work/demo/validate_items.py") &&
|
|
471
|
+
!outputListContract.exactOutputPaths.includes("work/demo/existing_validator.py") &&
|
|
472
|
+
!outputListContract.exactOutputPaths.some((item) => item.includes("{item_id}")),
|
|
473
|
+
"SCS should not treat validator/tool paths or templated paths as exact output artifacts"
|
|
474
|
+
);
|
|
475
|
+
assert(
|
|
476
|
+
manyOutputContract.exactOutputPaths.length === 12 && manyOutputContract.exactOutputPaths.includes("out/a12.json"),
|
|
477
|
+
"SCS should preserve more than eight exact output paths for multi-artifact tasks"
|
|
478
|
+
);
|
|
401
479
|
assert(
|
|
402
480
|
generatedReviewContract.requiredEvidence.some((item) => item.category === "command") &&
|
|
403
481
|
!generatedReviewContract.requiredEvidence.some((item) => item.category === "file") &&
|
|
@@ -114,6 +114,11 @@ async function main() {
|
|
|
114
114
|
assert(dangerAbsoluteMkdir.trustedDangerOverride === true, "danger absolute host path should be explicit override");
|
|
115
115
|
const dangerPublish = evaluateCommandPolicy("npm publish", danger);
|
|
116
116
|
assert(dangerPublish.allowed === false, "danger should still block hard publish/token guardrails");
|
|
117
|
+
const workspaceCdSecretProbe = evaluateCommandPolicy(
|
|
118
|
+
`cd ${workspace} && env | grep -i 'deepseek\\\\|API_KEY' | head -5; echo "EXIT:$?"`,
|
|
119
|
+
danger
|
|
120
|
+
);
|
|
121
|
+
assert(workspaceCdSecretProbe.allowed === false, "workspace-root cd must not bypass secret command guardrails");
|
|
117
122
|
const outsidePath = path.join(tempRoot, "outside-danger.txt");
|
|
118
123
|
const dangerOutside = await executeWorkspaceTool("write_file", { path: outsidePath, content: "danger outside ok" }, danger);
|
|
119
124
|
assert(dangerOutside.ok === true, "danger should allow outside workspace file write");
|
package/scripts/smoke-skills.js
CHANGED
|
@@ -66,7 +66,7 @@ assert(
|
|
|
66
66
|
),
|
|
67
67
|
"browser automation prompt did not select browser-automation"
|
|
68
68
|
);
|
|
69
|
-
assert(selectedIds("
|
|
69
|
+
assert(selectedIds("网页表单 上传 五张图 从素材库选择视频 提交").includes("browser-automation"), "Chinese browser prompt did not select browser-automation");
|
|
70
70
|
assert(selectedIds("write a LaTeX paper and compile a PDF").includes("latex-manuscript"), "latex prompt did not select latex-manuscript");
|
|
71
71
|
assert(selectedIds("edit a Microsoft Word docx and preserve the original").includes("word-documents"), "docx prompt did not select word-documents");
|
|
72
72
|
assert(selectedIds("generate a logo image with grsai nanobanana").includes("image-generation"), "image prompt did not select image-generation");
|
|
@@ -83,6 +83,13 @@ try {
|
|
|
83
83
|
const destructive = checkTmuxToolUse("tmux_send_keys", { target: start.target, text: "rm -rf /" }, config);
|
|
84
84
|
assert.equal(destructive.allowed, false, "tmux guardrail did not block destructive text");
|
|
85
85
|
|
|
86
|
+
const workspaceRelativeCleanup = checkToolUse({
|
|
87
|
+
toolName: "tmux_start_session",
|
|
88
|
+
args: { name: `${session}-cleanup`, cwd: ".", command: "rm -f logs/task.status && echo cleaned" },
|
|
89
|
+
config,
|
|
90
|
+
});
|
|
91
|
+
assert.equal(workspaceRelativeCleanup.allowed, true, "Host danger tmux should allow workspace-relative cleanup commands");
|
|
92
|
+
|
|
86
93
|
const outsidePath = path.join(os.tmpdir(), "agintiflow-outside-workspace-canary.txt");
|
|
87
94
|
const workspacePath = path.join(workspace, "inside-workspace.txt");
|
|
88
95
|
const dockerTmuxOutsideStart = checkToolUse({
|
|
@@ -249,6 +256,7 @@ try {
|
|
|
249
256
|
"list-sessions",
|
|
250
257
|
"secret-guardrail",
|
|
251
258
|
"destructive-guardrail",
|
|
259
|
+
"host-danger-workspace-cleanup-allowed",
|
|
252
260
|
"docker-tmux-start-outside-path-guardrail",
|
|
253
261
|
"docker-tmux-send-outside-path-guardrail",
|
|
254
262
|
"docker-tmux-start-project-path-allowed",
|
|
@@ -38,7 +38,8 @@ Before launching long work, create or identify a project-local contract:
|
|
|
38
38
|
3. Task manifest: stable chunk IDs, source location, dependency order, prompt/schema version, and output paths.
|
|
39
39
|
4. Artifact schema: JSON Schema or other validator-owned shape for each generated unit.
|
|
40
40
|
5. Runners: resumable writer, reviewer, repairer, monitor, merge, compile/export, and status commands.
|
|
41
|
-
6.
|
|
41
|
+
6. Freshness evidence: runner IDs, heartbeats, log timestamps, status file mtimes, and tmux markers that separate current output from old scrollback.
|
|
42
|
+
7. Completion evidence: counters, first missing item, failed IDs, current previews, final artifact paths, and resume commands.
|
|
42
43
|
|
|
43
44
|
Project-specific schemas, prompts, layouts, and compilers belong in the target repository. AgInTiFlow provides the orchestration pattern and should generate or patch local scripts when they are missing.
|
|
44
45
|
|
|
@@ -50,6 +51,7 @@ Project-specific schemas, prompts, layouts, and compilers belong in the target r
|
|
|
50
51
|
- Use isolated structured-data calls for repetitive JSON units. Keep prompts focused on the chunk, schema, source references, and validation errors.
|
|
51
52
|
- Add deterministic canonicalizers before model retry when failures are representational, such as punctuation normalization, stable token splitting, missing metadata backfill, schema version migration, or renderer-specific wrapping. Do not spend provider calls on repairs a local script can prove.
|
|
52
53
|
- Run writers in tmux or another observable background process. Each worker must have disjoint claims, atomic output writes, and shard-local logs.
|
|
54
|
+
- When restarting a tmux worker, print a unique run marker and write the same marker to its log or status file. A pane capture that only shows old scrollback is not proof of current progress.
|
|
53
55
|
- Keep review and repair asynchronous but safe. Reviewers may produce candidate fixes while writers continue; only validators or merge scripts promote candidates.
|
|
54
56
|
- Compile or export checkpoint previews after successful merge batches and always at final completion.
|
|
55
57
|
- Commit reusable scripts, manifests, validators, templates, and stable checkpoints when the project expects git tracking.
|
|
@@ -68,4 +70,4 @@ A robust pipeline has an independent repair path that is not blocked by the main
|
|
|
68
70
|
|
|
69
71
|
## Done Criteria
|
|
70
72
|
|
|
71
|
-
Do not call the task complete until the final artifact was built from the current manifest and the status report shows complete or intentionally quarantined coverage. A partial PDF, stale page count, or successful worker log is not enough.
|
|
73
|
+
Do not call the task complete until the final artifact was built from the current manifest and the status report shows complete or intentionally quarantined coverage. A partial PDF, stale page count, old tmux scrollback, or successful worker log is not enough.
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
id: bilingual-interlinear-book
|
|
3
|
-
label:
|
|
4
|
-
description: Build
|
|
3
|
+
label: Multilingual Annotated Book Pipeline
|
|
4
|
+
description: Build paired-language, interlinear, or annotated books from source documents using ingestion, stable task chunks, schema-bound annotations, review loops, and compiled outputs.
|
|
5
5
|
triggers:
|
|
6
6
|
- interlinear
|
|
7
7
|
- bilingual book
|
|
8
|
+
- multilingual book
|
|
8
9
|
- paired language
|
|
10
|
+
- annotated book
|
|
11
|
+
- parallel text
|
|
12
|
+
- ruby
|
|
9
13
|
- furigana
|
|
10
14
|
- pinyin
|
|
11
|
-
- ruby
|
|
12
15
|
- xelatex
|
|
13
16
|
- pocket book
|
|
14
|
-
- grammar roles
|
|
15
17
|
tools:
|
|
16
18
|
- read_file
|
|
17
19
|
- write_file
|
|
@@ -19,35 +21,49 @@ tools:
|
|
|
19
21
|
- tmux_start_session
|
|
20
22
|
- tmux_capture_pane
|
|
21
23
|
---
|
|
22
|
-
#
|
|
24
|
+
# Multilingual Annotated Book Pipeline
|
|
25
|
+
|
|
26
|
+
Use this skill when the user asks AgInTi to create a book-like artifact that combines a main text with translations, glosses, commentary, readings, grammar labels, or other aligned annotations.
|
|
27
|
+
|
|
28
|
+
This is a general workflow skill. It must not hard-code a specific book, language pair, schema, layout, filename, page size, or house style. If the target repository contains a project-local skill under `.aginti/skills/<id>/SKILL.md`, prefer that skill for domain-specific rules.
|
|
23
29
|
|
|
24
|
-
|
|
30
|
+
## Workflow
|
|
25
31
|
|
|
26
|
-
|
|
32
|
+
1. Inspect repository instructions, existing scripts, source folders, build folders, ignored paths, and project-local skills before editing.
|
|
33
|
+
2. Inventory sources and create or update a source manifest with path, hash, declared language, observed language/script, role, extraction method, and caveats. Keep original source media untouched unless the user explicitly asks otherwise.
|
|
34
|
+
3. Convert inputs into durable intermediate text first. Use the source-ingestion workflow for PDF, EPUB, image, scan, archive, JSON/wiki, or mixed input folders.
|
|
35
|
+
4. Audit every reference source before using it as translation evidence. A file name, website title, or declared language is not enough. Sample actual text and classify whether it is real target-language prose, source-language text hosted on a target-language site, machine/OCR noise, commentary, glossary, or metadata. Prompts must state this reliability classification.
|
|
36
|
+
5. Split cleaned text into stable paragraph-, section-, page-, or chapter-scoped tasks with persistent IDs. Record source spans so chunks can be regenerated, reused, reviewed, or mapped after later split changes.
|
|
37
|
+
6. Define the project schema in the target repository. Use the structured JSON workflow for repetitive annotation or alignment output, with focused prompts and provider-native JSON/schema modes when available.
|
|
38
|
+
7. Keep writer, validator, reviewer, repairer, monitor, merge, compile/export, and final-report roles separate. Writers produce candidates; validators promote; reviewers request fixes; monitors observe progress and restart only affected work.
|
|
39
|
+
8. Make all workers resumable. Use shard-local outputs, atomic promotion, status files, logs, retry/backoff for provider limits, and exact resume commands.
|
|
40
|
+
9. Never overwrite a valid reviewed artifact unless the source hash, schema version, prompt version, or validator version proves it is stale. Quarantine invalid outputs instead of deleting useful work.
|
|
41
|
+
10. Compile or export previews periodically and final variants at the end. Variant names and directions belong to the project schema or local skill, not this built-in skill.
|
|
42
|
+
11. Verify final artifacts externally: manifest coverage, valid/reviewed counts, missing/stale/failed items, output paths, metadata, and representative visual checks for PDFs or images.
|
|
27
43
|
|
|
28
|
-
|
|
29
|
-
2. Keep original PDFs/EPUBs in source folders and do not commit large source media unless the repository explicitly tracks them.
|
|
30
|
-
3. Convert source books to durable Markdown first. Treat PDF, EPUB, image, JSON/wiki, and scanned sources as ingestion problems; create a source manifest with hashes, method, role, language, and caveats before generation. Keep raw and cleaned Markdown separate when OCR or EPUB extraction is noisy.
|
|
31
|
-
4. Split cleaned Markdown into stable paragraph- or chapter-scoped chunks with `manifest.json` and `chunks.jsonl`. Use source paragraph IDs that survive reruns. If a paragraph is too large for reliable provider output, split it into ordered subchunks at sentence or clause boundaries while preserving the original source order and recording `split_from_chunk_id`, `split_part`, and `split_part_count`.
|
|
32
|
-
5. When retuning chunk size or repairing split logic, merge any existing `split_from_chunk_id` groups back to the original paragraph text first, then split again. Do not repeatedly split already-split parts, and do not discard valid reviewed chunks unless validation proves they no longer match the manifest.
|
|
33
|
-
6. Write resumable per-chunk JSON artifacts. Never overwrite a valid reviewed chunk unless a validator or prompt version requires regeneration; move stale chunks out of the compile path.
|
|
34
|
-
7. Generate or repair annotations with a provider worker loop, not a monolithic prompt. Each chunk should validate independently before promotion. If JSON is malformed or validation fails, retry the chunk with the exact validator errors before marking it failed. Use the structured JSON workflow for repetitive chunk output.
|
|
35
|
-
8. Keep writer, reviewer, repairer, monitor, merge, and compile roles explicit. Writers produce candidates; validators promote; reviewers check semantic quality and request fixes; repairers handle failed-only or quarantined chunks; monitors observe and resume gently.
|
|
36
|
-
9. Compile preview PDFs periodically and at the end. For paired-language books, compile both directions when renderers exist, plus color and blackwhite variants when color is supported.
|
|
37
|
-
10. Run long jobs in observable tmux sessions with status files, logs, retry/backoff for provider limits, and clear resume commands.
|
|
44
|
+
## Annotation Rules
|
|
38
45
|
|
|
39
|
-
|
|
46
|
+
Keep annotation policies project-defined:
|
|
40
47
|
|
|
41
|
-
|
|
48
|
+
- Token shape, reading placement, grammar tags, and alignment granularity must come from the project schema.
|
|
49
|
+
- For scripts that need per-character readings, validators should enforce that locally instead of relying on a prompt.
|
|
50
|
+
- Placeholder translations, empty commentary, duplicated readings, copied modern paraphrases, or source drift should be detected by validators or reviewers.
|
|
51
|
+
- Translation/reference quality gates must be derived from the project schema, language profile, and source audit. Do not bake one book's vocabulary, source names, or forbidden-token list into this built-in skill or AgInTiFlow core.
|
|
52
|
+
- If a reference is unreliable for the requested target language, do not feed it to the writer as trusted translation. Either omit it, label it clearly as alignment/source-only context, or ask the project to supply a reliable reference.
|
|
53
|
+
- Color, typography, page size, table of contents, cover design, and exact PDF variants belong in project renderers.
|
|
42
54
|
|
|
43
|
-
|
|
55
|
+
## Orchestration Pattern
|
|
44
56
|
|
|
45
|
-
|
|
57
|
+
For long books, the interactive AgInTiFlow session should own the project orchestration:
|
|
46
58
|
|
|
47
|
-
|
|
59
|
+
- write or update the project scripts, schemas, prompts, validators, reviewers, monitors, and compilers
|
|
60
|
+
- start writer/reviewer/monitor tmux sessions itself
|
|
61
|
+
- use non-interactive model/API workers only inside those project scripts
|
|
62
|
+
- observe progress, patch the scripts when logs show repeatable failure, and resume from stable chunk IDs
|
|
63
|
+
- commit meaningful project changes when the repository expects git tracking
|
|
48
64
|
|
|
49
|
-
|
|
65
|
+
The chat agent should not manually become the chunk writer. If supervised by another agent, provide evidence and ask the interactive session to repair the project.
|
|
50
66
|
|
|
51
67
|
## Completion Evidence
|
|
52
68
|
|
|
53
|
-
Report
|
|
69
|
+
Report the current manifest total, valid/promoted count, reviewed count, failed or quarantined count, first missing ID, latest artifact paths, compile/export commands, and the exact command to resume generation. Do not claim completion from a model summary alone; check the files and outputs directly.
|
|
@@ -39,6 +39,8 @@ Use this skill when a project has a durable worker, writer, reviewer, monitor, q
|
|
|
39
39
|
## Repair Pattern
|
|
40
40
|
|
|
41
41
|
- Patch project-owned scripts, prompts, validators, or monitors only after the logs identify a repeatable failure.
|
|
42
|
+
- Patch at the right layer. If a failure is caused by task-specific source semantics, schema, prompt, validator, or output conventions, fix the project script or project-local skill. If it is caused by a reusable pipeline capability gap, improve a built-in skill or task profile. If it is caused by runtime/tool/session/SCS behavior, improve AgInTiFlow core.
|
|
43
|
+
- Avoid hard-coded one-case repairs. Prefer data-driven project configuration, language/source profiles, schema versions, prompt versions, validator versions, and manifest evidence so the same pipeline can be reused and backfixed cleanly.
|
|
42
44
|
- Prefer small resumability upgrades: `--failed-only`, bounded retry passes, stale-claim cleanup, atomic writes, checkpoint status, idempotent compile commands, and clear resume commands.
|
|
43
45
|
- Keep writer/reviewer/monitor responsibilities separate. The writer should produce and validate; the reviewer should repair quality; the monitor should observe, compile, restart, or queue the next bounded run.
|
|
44
46
|
- Make monitors gentle: wait on healthy progress, restart only after explicit stop/stall/error evidence, and write a durable decision log.
|
|
@@ -58,13 +60,26 @@ Parallel and async designs are optional implementation patterns, not a default p
|
|
|
58
60
|
- If a worker stalls on one bad chunk, it should mark the chunk failed and continue its shard. Failed-only repair passes should be bounded and observable.
|
|
59
61
|
- When increasing concurrency, check provider quota/rate-limit behavior. If rate limits appear, reduce worker count or add backoff rather than letting every worker retry aggressively.
|
|
60
62
|
|
|
63
|
+
## Interactive Supervisor Pattern
|
|
64
|
+
|
|
65
|
+
When AgInTiFlow is the project orchestrator, it should run as an interactive tmux session that writes and updates the project runner scripts, then starts separate non-interactive tmux jobs for writers, reviewers, monitors, compilers, and repair passes. The interactive session remains responsible for reading logs, changing project code, restarting affected jobs, and committing progress. Background workers should not edit orchestrator code unless explicitly designed as a companion repairer with clear write scope and logs.
|
|
66
|
+
|
|
67
|
+
## Fresh Tmux Evidence
|
|
68
|
+
|
|
69
|
+
Tmux panes keep old scrollback. After stopping or restarting a worker, do not treat a later pane capture as current evidence unless it includes a fresh run marker, heartbeat, log timestamp, PID, or progress line produced after the restart.
|
|
70
|
+
|
|
71
|
+
- Prefer starting each runner with a unique marker such as `RUN_ID=$(date -u +%Y%m%dT%H%M%SZ)-$$; echo "AGINTI_RUN_START:$RUN_ID"` and write the same marker to the durable log or status file.
|
|
72
|
+
- If safe for the pane, clear the screen/history before a restart, but still rely on the marker or log timestamp as the proof boundary.
|
|
73
|
+
- When a capture contains both old failures and new progress, judge only the lines after the current marker. If no marker exists, inspect the durable log mtime, process PID/elapsed time, and status file before accepting the run as healthy.
|
|
74
|
+
- Do not call a background pipeline repaired or complete immediately after sending a restart command. Capture fresh output after a short wait or verify a status/log update from the restarted process.
|
|
75
|
+
|
|
61
76
|
## Verification And Resume
|
|
62
77
|
|
|
63
78
|
After a repair:
|
|
64
79
|
|
|
65
80
|
1. Run syntax checks for changed scripts.
|
|
66
81
|
2. Run a dry-run or small bounded batch when safe.
|
|
67
|
-
3. Verify status counters, first missing item, failed IDs, and
|
|
82
|
+
3. Verify status counters, first missing item, failed IDs, output timestamps, and fresh run markers after any tmux restart.
|
|
68
83
|
4. Restart only the affected tmux session, not unrelated jobs.
|
|
69
84
|
5. Compile or export a checkpoint artifact when the pipeline has a renderer or build command.
|
|
70
85
|
6. Record the exact resume command, current status, logs inspected, remaining failed items, and any quarantined artifacts.
|
|
@@ -38,10 +38,12 @@ Use this skill when the user needs reliable JSON that follows an explicit schema
|
|
|
38
38
|
- On validation failure, retry with the exact schema errors and only the smallest relevant source text.
|
|
39
39
|
- For batch work, write candidate JSON per chunk first; promote it only after schema and semantic validators pass.
|
|
40
40
|
- Keep schema versions in the artifact metadata so old reviewed outputs can be reused or selectively regenerated when prompts change.
|
|
41
|
+
- Keep prompt versions and validator versions in or near the artifact metadata. When quality rules change, backfix only artifacts made stale by that change instead of restarting the whole corpus.
|
|
41
42
|
- Before retrying the provider, classify whether the failure is semantic or mechanical. Use local canonicalization for deterministic fixes such as token splitting, punctuation restoration from source text, missing default fields, role aliases, or renderer wrappers.
|
|
42
43
|
|
|
43
44
|
## Boundaries
|
|
44
45
|
|
|
45
46
|
- Do not pass shell, browser, file policy, package-install, or agent-planning context into the JSON specialist.
|
|
46
47
|
- Do not make schemas book-, app-, or project-specific inside AgInTiFlow core. Project schemas belong in the target repository.
|
|
48
|
+
- Do not hard-code source-specific semantic rules in this skill. If JSON quality requires language-specific or corpus-specific checks, make them part of the project schema, project validator, or project-local skill and record the version.
|
|
47
49
|
- Do not let parallel JSON workers share one mutable output file. Use shard-local outputs, atomic renames, and a serialized merge/promote step.
|