agent-scenario-loop 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -43,6 +43,12 @@ Install or use the package, then scaffold a first scenario inside an app:
43
43
  asl-init --out . --scenario first-journey
44
44
  ```
45
45
 
46
+ Add the optional repository-scoped agent skill when you want Codex to load ASL operating guidance from the consuming app:
47
+
48
+ ```bash
49
+ asl-init --out . --scenario first-journey --with-agent-skill
50
+ ```
51
+
46
52
  Wire the generated app helper, emit truth events around one real journey, merge the generated `asl:*` scripts intentionally, then validate the project:
47
53
 
48
54
  ```bash
@@ -10,6 +10,12 @@ type DemoLoopResult = {
10
10
  outputDir: string;
11
11
  preflightDir: string;
12
12
  };
13
+ /**
14
+ * Resolves files shipped with the installed package.
15
+ *
16
+ * @returns {string}
17
+ */
18
+ declare function resolvePackageRoot(): string;
13
19
  /**
14
20
  * Prints CLI usage.
15
21
  *
@@ -41,5 +47,5 @@ declare function runDemoLoop({ outputDir }?: {
41
47
  * @returns {Promise<void>}
42
48
  */
43
49
  declare function main(): Promise<void>;
44
- export { main, parseArgs, runDemoLoop, usage, };
50
+ export { main, parseArgs, runDemoLoop, resolvePackageRoot, usage, };
45
51
  export type { CliArgs, DemoLoopResult, };
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.main = main;
5
5
  exports.parseArgs = parseArgs;
6
6
  exports.runDemoLoop = runDemoLoop;
7
+ exports.resolvePackageRoot = resolvePackageRoot;
7
8
  exports.usage = usage;
8
9
  const path = require('node:path');
9
10
  const { buildAgentSummaryMarkdown } = require('../core/agent-summary');
@@ -15,6 +16,14 @@ const { buildPlanArtifacts } = require('./check-plan');
15
16
  const { hasHelpFlag, writeUsage } = require('./cli');
16
17
  const { compareLatestTrustedRun } = require('./compare-latest');
17
18
  const { runProfileIos } = require('./profile-ios');
19
+ /**
20
+ * Resolves files shipped with the installed package.
21
+ *
22
+ * @returns {string}
23
+ */
24
+ function resolvePackageRoot() {
25
+ return path.resolve(__dirname, '..', '..');
26
+ }
18
27
  /**
19
28
  * Prints CLI usage.
20
29
  *
@@ -60,16 +69,16 @@ function parseArgs(argv) {
60
69
  * @returns {Promise<DemoLoopResult>}
61
70
  */
62
71
  async function runDemoLoop({ outputDir = path.resolve('artifacts/demo-loop') } = {}) {
63
- const root = process.cwd();
72
+ const packageRoot = resolvePackageRoot();
64
73
  const resolvedOutputDir = path.resolve(outputDir);
65
74
  const preflightDir = path.join(resolvedOutputDir, 'preflight', 'app-startup');
66
75
  const profileRoot = path.join(resolvedOutputDir, 'profile-runs');
67
- const configPath = path.join(root, 'core/config-template.json');
68
- const profileScenarioPath = path.join(root, 'examples/scenarios/ios/app-startup.json');
69
- const mobileScenarioPath = path.join(root, 'examples/scenarios/mobile/app-startup.json');
70
- const runnerPath = path.join(root, 'examples/runners/xcodebuildmcp-ios.json');
71
- const baselineLogPath = path.join(root, 'examples/event-logs/app-startup-baseline.log');
72
- const currentLogPath = path.join(root, 'examples/event-logs/app-startup-current.log');
76
+ const configPath = path.join(packageRoot, 'core/config-template.json');
77
+ const profileScenarioPath = path.join(packageRoot, 'examples/scenarios/ios/app-startup.json');
78
+ const mobileScenarioPath = path.join(packageRoot, 'examples/scenarios/mobile/app-startup.json');
79
+ const runnerPath = path.join(packageRoot, 'examples/runners/xcodebuildmcp-ios.json');
80
+ const baselineLogPath = path.join(packageRoot, 'examples/event-logs/app-startup-baseline.log');
81
+ const currentLogPath = path.join(packageRoot, 'examples/event-logs/app-startup-current.log');
73
82
  const preflight = await buildPlanArtifacts({
74
83
  scenarioPath: mobileScenarioPath,
75
84
  runnerPath,
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  type CliArgs = {
3
3
  'dry-run'?: string | boolean;
4
+ 'with-agent-skill'?: string | boolean;
4
5
  force?: string | boolean;
5
6
  out?: string | boolean;
6
7
  scenario?: string | boolean;
@@ -18,6 +19,7 @@ type InitProjectOptions = {
18
19
  outDir?: string;
19
20
  packageRoot?: string;
20
21
  scenarioId?: string;
22
+ withAgentSkill?: boolean;
21
23
  };
22
24
  type InitProjectResult = {
23
25
  created: string[];
@@ -59,10 +61,11 @@ declare function normalizeScenarioId(value: string | undefined): string;
59
61
  * @param {{packageRoot: string, scenarioId: string, targetDir: string}} options
60
62
  * @returns {ScaffoldFile[]}
61
63
  */
62
- declare function buildScaffoldFiles({ packageRoot, scenarioId, targetDir, }: {
64
+ declare function buildScaffoldFiles({ packageRoot, scenarioId, targetDir, withAgentSkill, }: {
63
65
  packageRoot: string;
64
66
  scenarioId: string;
65
67
  targetDir: string;
68
+ withAgentSkill?: boolean;
66
69
  }): ScaffoldFile[];
67
70
  /**
68
71
  * Scaffolds Agent Scenario Loop starter files into a consuming app directory.
@@ -14,6 +14,9 @@ const fsp = require('node:fs/promises');
14
14
  const path = require('node:path');
15
15
  const { hasHelpFlag, writeUsage } = require('./cli');
16
16
  const TEMPLATE_FILES = {
17
+ agentSkillAdoptionChecklist: path.join('skills', 'agent-scenario-loop', 'references', 'adoption-checklist.md'),
18
+ agentSkillArtifactInterpretation: path.join('skills', 'agent-scenario-loop', 'references', 'artifact-interpretation.md'),
19
+ agentSkillReadme: path.join('skills', 'agent-scenario-loop', 'SKILL.md'),
17
20
  config: 'project.config.json',
18
21
  evidenceProvider: 'evidence-provider.json',
19
22
  gitignoreSnippet: 'gitignore-snippet',
@@ -32,7 +35,7 @@ const TEMPLATE_FILES = {
32
35
  */
33
36
  function usage(output = process.stderr) {
34
37
  writeUsage([
35
- 'Usage: asl-init [--out <dir>] [--scenario <id>] [--force] [--dry-run]',
38
+ 'Usage: asl-init [--out <dir>] [--scenario <id>] [--with-agent-skill] [--force] [--dry-run]',
36
39
  '',
37
40
  'Copies public Agent Scenario Loop templates into a consuming app layout.',
38
41
  'Refuses to overwrite existing files unless --force is provided.',
@@ -103,9 +106,9 @@ function normalizeScenarioId(value) {
103
106
  * @param {{packageRoot: string, scenarioId: string, targetDir: string}} options
104
107
  * @returns {ScaffoldFile[]}
105
108
  */
106
- function buildScaffoldFiles({ packageRoot, scenarioId, targetDir, }) {
109
+ function buildScaffoldFiles({ packageRoot, scenarioId, targetDir, withAgentSkill = false, }) {
107
110
  const templatesRoot = path.join(packageRoot, 'templates');
108
- return [
111
+ const files = [
109
112
  {
110
113
  source: path.join(templatesRoot, TEMPLATE_FILES.config),
111
114
  destination: path.join(targetDir, 'asl.config.json'),
@@ -153,6 +156,19 @@ function buildScaffoldFiles({ packageRoot, scenarioId, targetDir, }) {
153
156
  destination: path.join(targetDir, 'src', 'devtools', 'profile-session.ts'),
154
157
  },
155
158
  ];
159
+ if (withAgentSkill) {
160
+ files.push({
161
+ source: path.join(templatesRoot, TEMPLATE_FILES.agentSkillReadme),
162
+ destination: path.join(targetDir, '.agents', 'skills', 'agent-scenario-loop', 'SKILL.md'),
163
+ }, {
164
+ source: path.join(templatesRoot, TEMPLATE_FILES.agentSkillArtifactInterpretation),
165
+ destination: path.join(targetDir, '.agents', 'skills', 'agent-scenario-loop', 'references', 'artifact-interpretation.md'),
166
+ }, {
167
+ source: path.join(templatesRoot, TEMPLATE_FILES.agentSkillAdoptionChecklist),
168
+ destination: path.join(targetDir, '.agents', 'skills', 'agent-scenario-loop', 'references', 'adoption-checklist.md'),
169
+ });
170
+ }
171
+ return files;
156
172
  }
157
173
  /**
158
174
  * Copies one scaffold template unless it already exists and overwrite is disabled.
@@ -194,7 +210,12 @@ async function initProject(options = {}) {
194
210
  const packageRoot = options.packageRoot ?? defaultPackageRoot();
195
211
  const targetDir = path.resolve(options.outDir ?? process.cwd());
196
212
  const scenarioId = normalizeScenarioId(options.scenarioId);
197
- const files = buildScaffoldFiles({ packageRoot, scenarioId, targetDir });
213
+ const files = buildScaffoldFiles({
214
+ packageRoot,
215
+ scenarioId,
216
+ targetDir,
217
+ withAgentSkill: Boolean(options.withAgentSkill),
218
+ });
198
219
  const created = [];
199
220
  const skipped = [];
200
221
  for (const file of files) {
@@ -252,6 +273,7 @@ async function main() {
252
273
  force: isEnabled(args.force),
253
274
  ...(typeof args.out === 'string' ? { outDir: args.out } : {}),
254
275
  ...(typeof args.scenario === 'string' ? { scenarioId: args.scenario } : {}),
276
+ withAgentSkill: isEnabled(args['with-agent-skill']),
255
277
  });
256
278
  process.stdout.write(`${formatResult(result)}\n`);
257
279
  }
package/docs/api.md CHANGED
@@ -74,7 +74,7 @@ The package intentionally ships schemas and examples:
74
74
  - `agent-scenario-loop/examples/*`
75
75
  - `agent-scenario-loop/templates/*`
76
76
 
77
- These are public fixtures and contract references. Templates are safe starting points to copy into a consuming app and adapt.
77
+ These are public fixtures and contract references. Templates are safe starting points to copy into a consuming app and adapt. The optional `templates/skills/agent-scenario-loop/` folder teaches Codex when and how to operate ASL from a repository-scoped skill without making the skill part of ASL runtime truth.
78
78
 
79
79
  For concrete runner and evidence-provider integration steps, see [Adapter Onboarding](adapters.md).
80
80
 
package/docs/authoring.md CHANGED
@@ -51,6 +51,8 @@ You can also copy these files manually and rename them as needed:
51
51
  | `templates/scripts/asl-capture-profiler-provider.mjs` | Runnable starter provider command for deterministic profiler, memory, and network evidence |
52
52
  | `templates/integration-readme.md` | Consumer-app wiring guide generated into `asl/README.md` |
53
53
  | `templates/package-scripts.json` | Package-script snippets generated into `asl/package-scripts.json`; project validation also checks that required scripts exist in app `package.json` and direct installed-bin scripts have not drifted |
54
+ | `templates/skills/agent-scenario-loop/SKILL.md` | Optional repository-scoped Codex skill generated into `.agents/skills/agent-scenario-loop/SKILL.md` by `asl-init --with-agent-skill` |
55
+ | `templates/skills/agent-scenario-loop/references/*.md` | Optional skill references for artifact interpretation and adoption checks |
54
56
 
55
57
  The JSON templates are schema-checked, and every shipped template is checked by package smoke. They intentionally use neutral placeholder names.
56
58
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-scenario-loop",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "description": "Scenario orchestration and evidence collection for agent-driven software development. Bring your own runner. Keep your scenarios. Keep your evidence.",
6
6
  "license": "MIT",
@@ -55,95 +55,141 @@
55
55
  "exports": {
56
56
  ".": {
57
57
  "types": "./dist/index.d.ts",
58
- "require": "./dist/index.js"
58
+ "import": "./dist/index.js",
59
+ "require": "./dist/index.js",
60
+ "default": "./dist/index.js"
59
61
  },
60
62
  "./runner/android-adb": {
61
63
  "types": "./dist/runner/android-adb.d.ts",
62
- "require": "./dist/runner/android-adb.js"
64
+ "import": "./dist/runner/android-adb.js",
65
+ "require": "./dist/runner/android-adb.js",
66
+ "default": "./dist/runner/android-adb.js"
63
67
  },
64
68
  "./runner/android-adb-driver": {
65
69
  "types": "./dist/runner/android-adb-driver.d.ts",
66
- "require": "./dist/runner/android-adb-driver.js"
70
+ "import": "./dist/runner/android-adb-driver.js",
71
+ "require": "./dist/runner/android-adb-driver.js",
72
+ "default": "./dist/runner/android-adb-driver.js"
67
73
  },
68
74
  "./runner/agent-device-driver": {
69
75
  "types": "./dist/runner/agent-device-driver.d.ts",
70
- "require": "./dist/runner/agent-device-driver.js"
76
+ "import": "./dist/runner/agent-device-driver.js",
77
+ "require": "./dist/runner/agent-device-driver.js",
78
+ "default": "./dist/runner/agent-device-driver.js"
71
79
  },
72
80
  "./runner/argent-driver": {
73
81
  "types": "./dist/runner/argent-driver.d.ts",
74
- "require": "./dist/runner/argent-driver.js"
82
+ "import": "./dist/runner/argent-driver.js",
83
+ "require": "./dist/runner/argent-driver.js",
84
+ "default": "./dist/runner/argent-driver.js"
75
85
  },
76
86
  "./runner/agent-device": {
77
87
  "types": "./dist/runner/agent-device.d.ts",
78
- "require": "./dist/runner/agent-device.js"
88
+ "import": "./dist/runner/agent-device.js",
89
+ "require": "./dist/runner/agent-device.js",
90
+ "default": "./dist/runner/agent-device.js"
79
91
  },
80
92
  "./runner/argent": {
81
93
  "types": "./dist/runner/argent.d.ts",
82
- "require": "./dist/runner/argent.js"
94
+ "import": "./dist/runner/argent.js",
95
+ "require": "./dist/runner/argent.js",
96
+ "default": "./dist/runner/argent.js"
83
97
  },
84
98
  "./runner/check-plan": {
85
99
  "types": "./dist/runner/check-plan.d.ts",
86
- "require": "./dist/runner/check-plan.js"
100
+ "import": "./dist/runner/check-plan.js",
101
+ "require": "./dist/runner/check-plan.js",
102
+ "default": "./dist/runner/check-plan.js"
87
103
  },
88
104
  "./runner/compare": {
89
105
  "types": "./dist/runner/compare.d.ts",
90
- "require": "./dist/runner/compare.js"
106
+ "import": "./dist/runner/compare.js",
107
+ "require": "./dist/runner/compare.js",
108
+ "default": "./dist/runner/compare.js"
91
109
  },
92
110
  "./runner/compare-latest": {
93
111
  "types": "./dist/runner/compare-latest.d.ts",
94
- "require": "./dist/runner/compare-latest.js"
112
+ "import": "./dist/runner/compare-latest.js",
113
+ "require": "./dist/runner/compare-latest.js",
114
+ "default": "./dist/runner/compare-latest.js"
95
115
  },
96
116
  "./runner/demo-loop": {
97
117
  "types": "./dist/runner/demo-loop.d.ts",
98
- "require": "./dist/runner/demo-loop.js"
118
+ "import": "./dist/runner/demo-loop.js",
119
+ "require": "./dist/runner/demo-loop.js",
120
+ "default": "./dist/runner/demo-loop.js"
99
121
  },
100
122
  "./runner/example-android-live": {
101
123
  "types": "./dist/runner/example-android-live.d.ts",
102
- "require": "./dist/runner/example-android-live.js"
124
+ "import": "./dist/runner/example-android-live.js",
125
+ "require": "./dist/runner/example-android-live.js",
126
+ "default": "./dist/runner/example-android-live.js"
103
127
  },
104
128
  "./runner/example-ios-live": {
105
129
  "types": "./dist/runner/example-ios-live.d.ts",
106
- "require": "./dist/runner/example-ios-live.js"
130
+ "import": "./dist/runner/example-ios-live.js",
131
+ "require": "./dist/runner/example-ios-live.js",
132
+ "default": "./dist/runner/example-ios-live.js"
107
133
  },
108
134
  "./runner/host-doctor": {
109
135
  "types": "./dist/runner/host-doctor.d.ts",
110
- "require": "./dist/runner/host-doctor.js"
136
+ "import": "./dist/runner/host-doctor.js",
137
+ "require": "./dist/runner/host-doctor.js",
138
+ "default": "./dist/runner/host-doctor.js"
111
139
  },
112
140
  "./runner/init-project": {
113
141
  "types": "./dist/runner/init-project.d.ts",
114
- "require": "./dist/runner/init-project.js"
142
+ "import": "./dist/runner/init-project.js",
143
+ "require": "./dist/runner/init-project.js",
144
+ "default": "./dist/runner/init-project.js"
115
145
  },
116
146
  "./runner/ios-simctl": {
117
147
  "types": "./dist/runner/ios-simctl.d.ts",
118
- "require": "./dist/runner/ios-simctl.js"
148
+ "import": "./dist/runner/ios-simctl.js",
149
+ "require": "./dist/runner/ios-simctl.js",
150
+ "default": "./dist/runner/ios-simctl.js"
119
151
  },
120
152
  "./runner/ios-simctl-driver": {
121
153
  "types": "./dist/runner/ios-simctl-driver.d.ts",
122
- "require": "./dist/runner/ios-simctl-driver.js"
154
+ "import": "./dist/runner/ios-simctl-driver.js",
155
+ "require": "./dist/runner/ios-simctl-driver.js",
156
+ "default": "./dist/runner/ios-simctl-driver.js"
123
157
  },
124
158
  "./runner/live-android": {
125
159
  "types": "./dist/runner/live-android.d.ts",
126
- "require": "./dist/runner/live-android.js"
160
+ "import": "./dist/runner/live-android.js",
161
+ "require": "./dist/runner/live-android.js",
162
+ "default": "./dist/runner/live-android.js"
127
163
  },
128
164
  "./runner/live-ios": {
129
165
  "types": "./dist/runner/live-ios.d.ts",
130
- "require": "./dist/runner/live-ios.js"
166
+ "import": "./dist/runner/live-ios.js",
167
+ "require": "./dist/runner/live-ios.js",
168
+ "default": "./dist/runner/live-ios.js"
131
169
  },
132
170
  "./runner/live-proof": {
133
171
  "types": "./dist/runner/live-proof.d.ts",
134
- "require": "./dist/runner/live-proof.js"
172
+ "import": "./dist/runner/live-proof.js",
173
+ "require": "./dist/runner/live-proof.js",
174
+ "default": "./dist/runner/live-proof.js"
135
175
  },
136
176
  "./runner/profile-ios": {
137
177
  "types": "./dist/runner/profile-ios.d.ts",
138
- "require": "./dist/runner/profile-ios.js"
178
+ "import": "./dist/runner/profile-ios.js",
179
+ "require": "./dist/runner/profile-ios.js",
180
+ "default": "./dist/runner/profile-ios.js"
139
181
  },
140
182
  "./runner/profile-android": {
141
183
  "types": "./dist/runner/profile-android.d.ts",
142
- "require": "./dist/runner/profile-android.js"
184
+ "import": "./dist/runner/profile-android.js",
185
+ "require": "./dist/runner/profile-android.js",
186
+ "default": "./dist/runner/profile-android.js"
143
187
  },
144
188
  "./runner/validate-project": {
145
189
  "types": "./dist/runner/validate-project.d.ts",
146
- "require": "./dist/runner/validate-project.js"
190
+ "import": "./dist/runner/validate-project.js",
191
+ "require": "./dist/runner/validate-project.js",
192
+ "default": "./dist/runner/validate-project.js"
147
193
  },
148
194
  "./schemas/*": "./schemas/*",
149
195
  "./examples/*": "./examples/*",
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: agent-scenario-loop
3
+ description: Use Agent Scenario Loop when implementing, debugging, optimizing, or validating mobile app behavior through durable scenarios, Android or iOS live proofs, evidence artifacts, health checks, budgets, or before-and-after comparisons. Do not use for ordinary unit-test-only changes or work unrelated to observable app behavior.
4
+ ---
5
+
6
+ # Agent Scenario Loop
7
+
8
+ Use ASL to establish trustworthy evidence about changes to this mobile app.
9
+
10
+ ## Discover The Project Contract
11
+
12
+ 1. Inspect `package.json` for installed ASL commands and project-owned `asl:*` scripts.
13
+ 2. Locate `asl.config.json` or the configured alternative.
14
+ 3. Inspect scenario manifests and runner manifests.
15
+ 4. Identify the scenario representing the app behavior affected by the task.
16
+ 5. Reuse an existing scenario when it expresses the intended behavior.
17
+
18
+ Do not copy runner infrastructure into the application.
19
+
20
+ ## Validate Before Execution
21
+
22
+ Run the project validation command configured by the repository. Then validate the selected scenario and execution plan.
23
+
24
+ Stop before live execution when required capabilities are unavailable. Report the missing capability, selected platform, runner, and the command needed to reproduce the failure.
25
+
26
+ ## Select The Proof Lane
27
+
28
+ Use fixture proof when validating:
29
+
30
+ - package installation;
31
+ - scenario parsing;
32
+ - artifact contracts;
33
+ - comparison behavior;
34
+ - agent summaries.
35
+
36
+ Use Android or iOS live proof when making claims about actual app behavior. Use both platforms when the task or release gate requires cross-platform evidence.
37
+
38
+ ## Interpret Results
39
+
40
+ Read evidence in this order:
41
+
42
+ 1. `health.json`
43
+ 2. `verdict.json`
44
+ 3. `comparison.json`, when present
45
+ 4. `agent-summary.md`
46
+ 5. supporting raw evidence and captures when diagnosis is needed
47
+
48
+ If health is not passed:
49
+
50
+ - do not trust dependent timing or budget conclusions;
51
+ - classify the failure as execution, environment, instrumentation, lifecycle, or evidence capture;
52
+ - fix or report the evidence problem before claiming a product regression.
53
+
54
+ If health passed but verdict failed:
55
+
56
+ - treat the run as trustworthy evidence of product failure;
57
+ - diagnose the failed budget, event, milestone, or expectation.
58
+
59
+ Only interpret a comparison when ASL considers the baseline compatible.
60
+
61
+ ## Non-Negotiable Rules
62
+
63
+ - Run planner validation before expensive device work.
64
+ - Prefer an existing durable scenario over inventing an ad hoc script.
65
+ - Never infer product improvement from unhealthy or partial evidence.
66
+ - Treat passed health plus failed verdict as trustworthy evidence of failure.
67
+ - Do not silently retry and discard failed attempts.
68
+ - Do not change budgets or scenarios merely to turn a failure green.
69
+ - Keep selectors, app identifiers, authentication assumptions, routes, and truth events inside the consuming app.
70
+ - Preserve the artifact directory and cite exact artifact paths in the final report.
71
+ - Use fixture proof for package and contract validation; use live proof for product claims.
72
+ - Avoid adding new runners when an existing capability already satisfies the plan.
73
+
74
+ ## Report
75
+
76
+ Include:
77
+
78
+ - scenario ID;
79
+ - platform;
80
+ - run ID;
81
+ - health status;
82
+ - product verdict;
83
+ - comparison status;
84
+ - failed evidence dependencies;
85
+ - relevant artifact paths;
86
+ - recommended next action.
87
+
88
+ Do not summarize a run as simply "passed" or "failed" when health and verdict differ.
89
+
90
+ ## References
91
+
92
+ - `references/artifact-interpretation.md`
93
+ - `references/adoption-checklist.md`
@@ -0,0 +1,17 @@
1
+ # Adoption Checklist
2
+
3
+ Use this checklist when bringing ASL into a consuming app or validating an existing adoption.
4
+
5
+ 1. Confirm `agent-scenario-loop` is installed from the registry, not a local tarball or link.
6
+ 2. Inspect `package.json` for project-owned `asl:*` scripts.
7
+ 3. Locate `asl.config.json` and verify app identifiers, artifact roots, and supported drivers are project-owned.
8
+ 4. Inspect scenario manifests under the configured scenario root.
9
+ 5. Inspect runner and evidence-provider manifests.
10
+ 6. Run the project validation script.
11
+ 7. Run the selected scenario's plan check before live device work.
12
+ 8. Use fixture/profile proof for package, parsing, and artifact-contract validation.
13
+ 9. Use Android or iOS live proof for product behavior claims.
14
+ 10. Use both platforms when a release or task requires cross-platform evidence.
15
+ 11. Preserve generated artifacts; do not delete failed attempts to make a later run look cleaner.
16
+ 12. Cite `health.json`, `verdict.json`, `comparison.json` when present, and `agent-summary.md` in the final report.
17
+ 13. Keep selectors, app identifiers, credentials, routes, and truth events in the consuming app, not ASL core.
@@ -0,0 +1,26 @@
1
+ # Artifact Interpretation
2
+
3
+ ASL separates evidence health, product verdict, and comparison status. Keep those meanings distinct.
4
+
5
+ ## Read Order
6
+
7
+ 1. `health.json`: whether the evidence-producing run completed with enough trustworthy data to interpret downstream artifacts.
8
+ 2. `verdict.json`: whether the product behavior satisfied the scenario's expectations, budgets, milestones, and required events.
9
+ 3. `comparison.json`: whether a compatible baseline/current pair improved, regressed, stayed unchanged, or remained inconclusive.
10
+ 4. `agent-summary.md`: compressed outcome for humans and agents after the structured artifacts are understood.
11
+
12
+ ## Health
13
+
14
+ When health is not passed, do not claim product improvement or regression from dependent timing, budget, or comparison artifacts. Classify the issue as execution, environment, instrumentation, lifecycle, or evidence capture.
15
+
16
+ ## Verdict
17
+
18
+ Passed health plus failed verdict is trustworthy evidence of a product failure. Diagnose the failed event, milestone, budget, or expectation instead of treating the run as untrusted.
19
+
20
+ ## Comparison
21
+
22
+ Only interpret comparison output when ASL selected or accepted a compatible baseline. If no trusted compatible prior exists, keep the current run as evidence and avoid before/after claims.
23
+
24
+ ## Reporting
25
+
26
+ Reports must cite exact artifact paths and distinguish health status, product verdict, and comparison status.