@thiaq/project-skill 0.1.0

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 ADDED
@@ -0,0 +1,31 @@
1
+ # @thiaq/project-skill
2
+
3
+ npm distribution for the ThiaQ project setup skill.
4
+
5
+ The package installs the `thiaq-project` skill into local agent skill folders so
6
+ Codex or Claude Code can refresh a ThiaQ project from live discovery plus static
7
+ repo analysis.
8
+
9
+ ## Install From npm
10
+
11
+ ```bash
12
+ npm install --save-dev @thiaq/project-skill
13
+ npx thiaq-project-skill install --agent codex --agent claude-code
14
+ ```
15
+
16
+ ## Install From A Packed Tarball
17
+
18
+ ```bash
19
+ npm pack ./skills/thiaq-project
20
+ npm install --save-dev ./thiaq-project-skill-0.1.0.tgz
21
+ npx thiaq-project-skill install --agent codex
22
+ ```
23
+
24
+ ## Agent Prompt
25
+
26
+ ```text
27
+ Use the thiaq-project skill. Refresh the existing ThiaQ project additively:
28
+ read existing project context, scan the repo, use live discovery evidence if
29
+ available, and propose a reviewed product map without making the customer or
30
+ project name the root node.
31
+ ```
package/SKILL.md ADDED
@@ -0,0 +1,263 @@
1
+ ---
2
+ name: thiaq-project
3
+ description: Set up or refresh a ThiaQ project using hosted ThiaQ MCP tools. Use when an agent is asked to understand a product for ThiaQ, install or connect the runner/extension, run safe discovery, summarize repo/docs/GitHub/Jira/tests, fuse live UI evidence with static code analysis, infer personas and jobs, identify product areas/features/surfaces/controls, propose product map naming, propose access and safety policy, group test ideas, create issue/repair proposals, or prepare deterministic QA coverage without making the user fill long forms.
4
+ ---
5
+
6
+ # ThiaQ Project
7
+
8
+ Use this skill to populate ThiaQ from both live product discovery and static
9
+ repo evidence. Treat ThiaQ as a hosted control plane: submit summaries and
10
+ reviewable change sets through MCP, then let the first user confirm naming,
11
+ module boundaries, and critical paths in the UI.
12
+
13
+ This is a generic ThiaQ skill. It tells the harness what ThiaQ needs to know;
14
+ the harness decides how to collect that context from repo files, docs, GitHub,
15
+ Jira, browser traces, tests, or other connected tools.
16
+
17
+ ## Core Rules
18
+
19
+ - Keep ThiaQ core product-agnostic. Put product-specific mechanics in the
20
+ customer repo, product adapter, or repo summary.
21
+ - Do not change customer application code unless the user explicitly asks for
22
+ an app-code change. Treat setup as outside-in QA/tooling work.
23
+ - Create or update ThiaQ files only under the repo's existing QA/test/tooling
24
+ conventions, such as `qa/thiaq`, `tests/thiaq`, `test/thiaq`, `e2e/thiaq`,
25
+ `playwright/thiaq`, or `cypress/thiaq`.
26
+ - Ensure repo-local ThiaQ runtime state is ignored by Git. At minimum,
27
+ `.gitignore` should contain `.thiaq/`; runner token configs such as
28
+ `thiaq.runner.json` should also stay uncommitted unless the team has a safe
29
+ secret-management pattern.
30
+ - Never send secrets, production customer data, broad raw source, or token
31
+ values to ThiaQ.
32
+ - Submit additive findings. Do not overwrite confirmed product knowledge.
33
+ - MCP writes must create change sets, proposals, or runner job requests.
34
+ - Approved CI still requires reviewed Git-backed flows, journeys, manifests,
35
+ interaction contracts, and assertions.
36
+ - Coordinate/browser-agent actions are discovery evidence until reviewed into a
37
+ deterministic selector or product-driver contract.
38
+
39
+ ## Workflow
40
+
41
+ 1. Identify the ThiaQ project id and hosted MCP endpoint.
42
+ 2. Confirm the runner or browser extension is installed and connected, or help
43
+ the user create the smallest repo-local adapter needed to run safely.
44
+ 3. Read available static product context: repo docs, connected issues,
45
+ existing tests, routes, labels, fixtures, naming, product language, feature
46
+ folders, stories, scripts, registries, manifests, and QA tooling.
47
+ 4. Check whether the repo has a ThiaQ adapter in a repo-local tooling folder:
48
+ `qa/thiaq/adapter.ts`, `tests/thiaq/adapter.ts`,
49
+ `test/thiaq/adapter.ts`, `e2e/thiaq/adapter.ts`,
50
+ `playwright/thiaq/adapter.ts`, `cypress/thiaq/adapter.ts`,
51
+ `.thiaq/adapter.ts`, or `thiaq.adapter.ts`.
52
+ 5. If no adapter exists, propose a small repo-local adapter before discovery.
53
+ 6. Ask the user only for missing high-risk setup facts: safe URL, test role,
54
+ auth/session method, and destructive-action boundaries.
55
+ 7. Start safe live discovery when access and safety boundaries are clear. Use
56
+ discovery to capture screens, surfaces, controls, canvas affordances,
57
+ selector gaps, blocked paths, screenshots, and bug candidates.
58
+ 8. Fuse static repo analysis with live discovery. Prefer names that match the
59
+ product's own docs, routes, UI labels, tests, and issue language.
60
+ 9. Propose a reviewable product map shaped like
61
+ `Product Area -> Feature or Workflow -> Surface or Control`. The customer or
62
+ project name is context, not the root tree node.
63
+ 10. Ask the first user to review naming, split/merge areas, confirm critical
64
+ paths, and flag anything ThiaQ should never automate.
65
+ 11. Call ThiaQ MCP tools to submit summaries and proposed changes.
66
+ 12. After discovery, use ThiaQ test ideas and issue categories to propose
67
+ deterministic coverage work.
68
+
69
+ ## What To Inspect
70
+
71
+ Prefer targeted reads over broad dumps:
72
+
73
+ - product docs: `README`, `docs/`, `product/`, onboarding guides;
74
+ - routes and navigation: router files, app shell, route manifests;
75
+ - surface labels and naming: page titles, route names, test IDs, visible labels,
76
+ domain nouns, workflow names, issue labels;
77
+ - tests: Playwright/Cypress specs, fixtures, page objects, selectors;
78
+ - adapters: product drivers, canvas/test bridges, helper registries;
79
+ - implementation shape: feature folders, components, stories, scripts,
80
+ registries, manifests, permissions, and data models that explain product
81
+ boundaries;
82
+ - discovery artifacts: visited URLs, screenshots, controls, accessibility
83
+ snapshots, selector gaps, blocked paths, canvas object evidence, and
84
+ bug-candidate ideas;
85
+ - issue context: GitHub/Jira labels, bug reports, UX notes when available;
86
+ - existing manifests: capabilities, use cases, journeys, flow registries.
87
+
88
+ Preserve evidence as short references such as `docs/product.md:12`,
89
+ `app/routes/dashboard.tsx`, `tests/e2e/create-project.spec.ts`, or issue URLs.
90
+
91
+ ## Repo-Local Adapter
92
+
93
+ The customer's repo should own product-specific setup, test helpers, drivers,
94
+ naming standards, and secret references. ThiaQ Cloud owns orchestration, review
95
+ state, findings, and artifacts; it should not bake customer adapters into the
96
+ platform.
97
+
98
+ When an adapter is missing, pick the folder that matches the repo's existing
99
+ test/tooling style. Prefer an existing top-level `qa/`, `tests/`, `test/`,
100
+ `e2e/`, `playwright/`, or `cypress/` folder. Fall back to `qa/thiaq`. Do not
101
+ place ThiaQ setup under `src/`, `app/`, `pages/`, `routes/`, `components/`, or
102
+ other application-code roots.
103
+
104
+ Propose a file like `tests/thiaq/adapter.ts` or `qa/thiaq/adapter.ts`:
105
+
106
+ ```ts
107
+ const defineThiaQAdapter = (adapter) => adapter;
108
+
109
+ export default defineThiaQAdapter({
110
+ id: "example-product",
111
+ name: "Example Product",
112
+ capabilities: {
113
+ capabilities: ["discovery", "recipe_run", "visual_anchors"],
114
+ jobTypes: ["discovery", "recipe_run"],
115
+ labels: ["dashboard", "admin", "workflow"]
116
+ },
117
+ doctor(context) {
118
+ return {
119
+ checks: [
120
+ {
121
+ id: "base-url",
122
+ label: "Safe test URL is configured",
123
+ status: context.baseUrl ? "passed" : "failed",
124
+ message: context.baseUrl ?? "Set runner baseUrl"
125
+ }
126
+ ],
127
+ ok: Boolean(context.baseUrl)
128
+ };
129
+ }
130
+ });
131
+ ```
132
+
133
+ Use the inline helper for a zero-dependency first setup. If the repo can add
134
+ developer dependencies, install `@thiaq/adapter-contract` and import
135
+ `defineThiaQAdapter` for stricter TypeScript typing.
136
+
137
+ Add product-specific methods only when the generic runner is insufficient:
138
+
139
+ - `runDiscovery(context, job)` for custom login, seed data, app startup, or
140
+ product-specific screenshot/anchor capture.
141
+ - `runRecipe(context, job)` for repo-owned deterministic recipe execution.
142
+ - `runSuite(context, job)` for existing Playwright/Cypress suite integration.
143
+ - `summarizeRepo(context)` for repo-local product summaries.
144
+
145
+ Prefer adapter code that calls existing test helpers, page objects, fixtures,
146
+ and product drivers. Do not duplicate working test infrastructure just to fit
147
+ ThiaQ.
148
+
149
+ The runner config may point at the adapter:
150
+
151
+ ```json
152
+ {
153
+ "adapter": "example-product",
154
+ "adapterPath": "tests/thiaq/adapter.ts",
155
+ "baseUrl": "http://localhost:5174",
156
+ "repoPath": "/path/to/customer/repo"
157
+ }
158
+ ```
159
+
160
+ `thiaq runner setup` should add `.thiaq/` and `thiaq.runner.json` to
161
+ `.gitignore` so local artifacts and runner tokens do not get committed.
162
+
163
+ Run `thiaq runner doctor` before discovery. Treat failed adapter checks as
164
+ setup blockers and warnings as explicit caveats in the ThiaQ project summary.
165
+
166
+ ## Required User Questions
167
+
168
+ Ask only when the answer cannot be inferred safely:
169
+
170
+ - What safe test URL should ThiaQ open?
171
+ - What test role/account should discovery use?
172
+ - What actions are safe to perform automatically?
173
+ - What data must never be created, edited, deleted, transmitted, or persisted?
174
+ - Which environment stores secrets, and what reference name should ThiaQ use?
175
+
176
+ Do not ask the user to paste long product forms if repo evidence can answer the
177
+ question.
178
+
179
+ ## MCP Tool Use
180
+
181
+ Use the hosted MCP endpoint in Code Mode/search-and-execute when available. In
182
+ that mode, first call `query` to find the typed ThiaQ operation, then call
183
+ `execute` with the smallest useful operation and arguments.
184
+
185
+ Use `get_project_context` first. Then call the smallest useful write operation:
186
+
187
+ - `submit_repo_summary` for repo/docs/tests/Jira/GitHub summaries.
188
+ - `propose_product_profile_changes` for product basics.
189
+ - `propose_persona_changes` for additive personas.
190
+ - `propose_job_changes` for persona-linked jobs.
191
+ - `start_discovery_run` after runner or extension setup and safety review.
192
+ - `propose_product_hierarchy_changes` for reviewable product maps that fuse
193
+ static repo analysis with live discovery evidence.
194
+ - `propose_access_profile_changes` for test URL, role, auth, and secret refs.
195
+ - `propose_safety_policy_changes` for safe/unsafe action boundaries.
196
+ - `list_test_ideas` after discovery.
197
+ - `propose_test_idea_promotion` to create reviewable promotion work.
198
+ - `list_issue_categories` for UX confusion, selector, driver, assertion, and
199
+ safety gaps.
200
+ - `create_repair_proposal` when an issue needs product, adapter, selector, or
201
+ assertion repair.
202
+
203
+ For tool schemas and payload examples, read
204
+ `references/mcp-tools.md` only when preparing MCP calls.
205
+
206
+ ## Summary Shape
207
+
208
+ When submitting repo evidence, keep findings structured:
209
+
210
+ ```json
211
+ {
212
+ "productProfile": {
213
+ "productName": "Example",
214
+ "productBrief": "Short product description"
215
+ },
216
+ "personas": [{ "name": "Workspace Admin", "evidence": ["docs/admin.md"] }],
217
+ "jobs": [{ "title": "Create and share a workflow", "personaName": "Analyst" }],
218
+ "hierarchy": {
219
+ "areas": [{ "areaId": "area.dashboard", "name": "Dashboard" }],
220
+ "features": [{ "featureId": "feature.projects", "areaId": "area.dashboard", "name": "Projects" }],
221
+ "surfaces": [{ "surfaceId": "surface.project-list", "featureId": "feature.projects", "name": "Project list" }]
222
+ },
223
+ "accessProfile": {
224
+ "loginUrl": "https://staging.example.com",
225
+ "testRole": "Primary test user",
226
+ "secretReference": "THIAQ_STAGING_SESSION"
227
+ },
228
+ "safetyPolicy": {
229
+ "safeActions": ["create test data"],
230
+ "unsafeActions": ["delete real customer data"]
231
+ }
232
+ }
233
+ ```
234
+
235
+ ## Product Map Guidance
236
+
237
+ Build a product map that a QA-oriented user can navigate immediately. The tree
238
+ should expose product behavior, not account metadata:
239
+
240
+ - Top visible level: product areas such as Dashboard, Canvas Authoring,
241
+ Collaboration, Admin, Billing, Reporting, or Workspace Organization.
242
+ - Second level: features or workflows inside each area.
243
+ - Third level: surfaces, controls, states, or canvas affordances that scenarios
244
+ can anchor to.
245
+ - Scenario and issue counts should attach to the most specific useful node.
246
+ - Never use the customer, project, tenant, or product name as the visible root
247
+ node. Keep that as surrounding context.
248
+ - Carry evidence and confidence for inferred nodes so the first user can
249
+ rename, merge, split, or reject suggestions.
250
+
251
+ Use repo structure alone only as a starting hypothesis. Prefer the fused view:
252
+ what users can see in live discovery, what code/routes/tests call it, and what
253
+ docs or issues say the product team calls it.
254
+
255
+ ## Completion Criteria
256
+
257
+ Finish with a short status:
258
+
259
+ - summaries submitted,
260
+ - change sets created,
261
+ - missing setup facts,
262
+ - recommended next ThiaQ action,
263
+ - any safety caveats.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "ThiaQ Project Setup"
3
+ short_description: "Set up ThiaQ from live discovery plus repo analysis."
4
+ default_prompt: "Use this skill to connect my runner or extension, discover my app, scan my repo, and propose a reviewed ThiaQ product map through the hosted MCP tools."
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import { cp, mkdir, rm } from "node:fs/promises";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { homedir } from "node:os";
6
+
7
+ const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
8
+ const args = process.argv.slice(2);
9
+
10
+ function hasFlag(flag) {
11
+ return args.includes(flag);
12
+ }
13
+
14
+ function valuesFor(flag) {
15
+ const values = [];
16
+ for (let index = 0; index < args.length; index += 1) {
17
+ if (args[index] === flag && args[index + 1]) values.push(args[index + 1]);
18
+ }
19
+ return values;
20
+ }
21
+
22
+ if (hasFlag("--help") || hasFlag("-h")) {
23
+ console.log(`Usage:
24
+ thiaq-project-skill install [--agent codex] [--agent claude-code] [--target /path/to/skills]
25
+
26
+ Examples:
27
+ thiaq-project-skill install --agent codex
28
+ thiaq-project-skill install --agent codex --agent claude-code
29
+ thiaq-project-skill install --target ./.codex/skills
30
+ `);
31
+ process.exit(0);
32
+ }
33
+
34
+ const command = args[0] ?? "install";
35
+ if (command !== "install") {
36
+ throw new Error(`Unsupported command: ${command}`);
37
+ }
38
+
39
+ const explicitTargets = valuesFor("--target").map((target) => resolve(target));
40
+ const agents = valuesFor("--agent");
41
+ const selectedAgents =
42
+ agents.length > 0 || explicitTargets.length === 0 ? agents : [];
43
+ const defaultAgents =
44
+ agents.length > 0 || explicitTargets.length > 0 ? selectedAgents : ["codex"];
45
+
46
+ const agentTargets = defaultAgents.map((agent) => {
47
+ if (agent === "codex") return join(homedir(), ".codex", "skills");
48
+ if (agent === "claude-code" || agent === "claude") {
49
+ return join(homedir(), ".claude", "skills");
50
+ }
51
+ throw new Error(`Unsupported agent: ${agent}`);
52
+ });
53
+
54
+ const targets = [...new Set([...explicitTargets, ...agentTargets])];
55
+
56
+ for (const target of targets) {
57
+ const destination = join(target, "thiaq-project");
58
+ await mkdir(target, { recursive: true });
59
+ await rm(destination, { recursive: true, force: true });
60
+ await cp(packageRoot, destination, {
61
+ recursive: true,
62
+ filter(source) {
63
+ return !source.includes(`${packageRoot}/node_modules`);
64
+ }
65
+ });
66
+ console.log(`Installed thiaq-project skill to ${destination}`);
67
+ }
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import { access, readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
7
+ const requiredFiles = [
8
+ "SKILL.md",
9
+ "README.md",
10
+ "agents/openai.yaml",
11
+ "references/mcp-tools.md"
12
+ ];
13
+
14
+ for (const file of requiredFiles) {
15
+ await access(join(root, file));
16
+ }
17
+
18
+ const skill = await readFile(join(root, "SKILL.md"), "utf8");
19
+ if (!skill.startsWith("---\n")) {
20
+ throw new Error("SKILL.md must start with YAML frontmatter");
21
+ }
22
+
23
+ for (const required of ["name: thiaq-project", "description:"]) {
24
+ if (!skill.includes(required)) {
25
+ throw new Error(`SKILL.md missing required frontmatter: ${required}`);
26
+ }
27
+ }
28
+
29
+ console.log("thiaq-project skill package is valid");
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@thiaq/project-skill",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "private": false,
6
+ "description": "ThiaQ project setup skill for Codex and Claude Code agents.",
7
+ "license": "UNLICENSED",
8
+ "bin": {
9
+ "thiaq-project-skill": "./bin/install.mjs"
10
+ },
11
+ "files": [
12
+ "SKILL.md",
13
+ "README.md",
14
+ "agents",
15
+ "references",
16
+ "bin",
17
+ "package.json"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "scripts": {
23
+ "build": "node ./bin/validate.mjs",
24
+ "prepack": "node ./bin/validate.mjs"
25
+ }
26
+ }
@@ -0,0 +1,233 @@
1
+ # ThiaQ MCP Tool Reference
2
+
3
+ Endpoint shape:
4
+
5
+ ```http
6
+ POST /api/mcp?optimize_context=search_and_execute
7
+ Authorization: Bearer <thiaq api token>
8
+ Content-Type: application/json
9
+ ```
10
+
11
+ Prefer Code Mode/search-and-execute for hosted commercial use. Search first:
12
+
13
+ ```json
14
+ {
15
+ "jsonrpc": "2.0",
16
+ "id": "search-1",
17
+ "method": "tools/call",
18
+ "params": {
19
+ "name": "query",
20
+ "arguments": {
21
+ "projectId": "project-id",
22
+ "query": "personas jobs product hierarchy"
23
+ }
24
+ }
25
+ }
26
+ ```
27
+
28
+ Then execute typed calls:
29
+
30
+ ```json
31
+ {
32
+ "jsonrpc": "2.0",
33
+ "id": "execute-1",
34
+ "method": "tools/call",
35
+ "params": {
36
+ "name": "execute",
37
+ "arguments": {
38
+ "projectId": "project-id",
39
+ "calls": [
40
+ {
41
+ "name": "get_project_context",
42
+ "arguments": { "projectId": "project-id" }
43
+ }
44
+ ]
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ Native JSON-RPC tools are also available for development and small tool catalogs:
51
+
52
+ ```json
53
+ {
54
+ "jsonrpc": "2.0",
55
+ "id": "call-1",
56
+ "method": "tools/call",
57
+ "params": {
58
+ "name": "get_project_context",
59
+ "arguments": { "projectId": "project-id" }
60
+ }
61
+ }
62
+ ```
63
+
64
+ ## Read Context
65
+
66
+ ```json
67
+ {
68
+ "name": "get_project_context",
69
+ "arguments": { "projectId": "project-id" }
70
+ }
71
+ ```
72
+
73
+ ## Submit Repo Summary
74
+
75
+ Use this for structured static analysis from docs, routes, tests, feature
76
+ folders, stories, fixtures, registries, manifests, issue trackers, and existing
77
+ QA tooling. Include product-map suggestions when the repo provides evidence,
78
+ but mark them as proposals that should be fused with live discovery.
79
+
80
+ ```json
81
+ {
82
+ "name": "submit_repo_summary",
83
+ "arguments": {
84
+ "projectId": "project-id",
85
+ "source": {
86
+ "sourceId": "repo.main",
87
+ "sourceType": "repo",
88
+ "label": "Main product repo",
89
+ "uri": "https://github.com/org/repo"
90
+ },
91
+ "title": "Repo product summary",
92
+ "summaryMarkdown": "Concise static findings with evidence refs.",
93
+ "evidenceRefs": ["README.md", "app/routes/dashboard.tsx", "tests/e2e/create.spec.ts"],
94
+ "findings": {
95
+ "productProfile": {},
96
+ "personas": [],
97
+ "jobs": [],
98
+ "hierarchy": {
99
+ "areas": [],
100
+ "features": [],
101
+ "surfaces": [],
102
+ "namingAssumptions": []
103
+ },
104
+ "accessProfile": {},
105
+ "safetyPolicy": {}
106
+ }
107
+ }
108
+ }
109
+ ```
110
+
111
+ ## Product Hierarchy Proposal
112
+
113
+ Use `propose_product_hierarchy_changes` after fusing live discovery evidence
114
+ with static repo analysis. The proposal should be reviewable by the first user;
115
+ do not treat inferred names as final.
116
+
117
+ The visible tree should start with product areas. Do not make the customer,
118
+ tenant, project, or product name the root node.
119
+
120
+ ```json
121
+ {
122
+ "name": "propose_product_hierarchy_changes",
123
+ "arguments": {
124
+ "projectId": "project-id",
125
+ "title": "Review discovered product map",
126
+ "summary": "Combines live UI discovery with repo routes, tests, and docs.",
127
+ "source": "discovery:job-id + repo-summary:main",
128
+ "payload": {
129
+ "areas": [
130
+ {
131
+ "areaId": "area.canvas-authoring",
132
+ "name": "Canvas Authoring",
133
+ "evidenceRefs": ["discovery:screen.canvas", "app/routes/canvas.tsx"],
134
+ "confidence": 0.82
135
+ }
136
+ ],
137
+ "features": [
138
+ {
139
+ "featureId": "feature.canvas-shapes",
140
+ "areaId": "area.canvas-authoring",
141
+ "name": "Shapes",
142
+ "evidenceRefs": ["discovery:control.shape-toolbar", "tests/e2e/shapes.spec.ts"]
143
+ }
144
+ ],
145
+ "surfaces": [
146
+ {
147
+ "surfaceId": "surface.shape-toolbar",
148
+ "featureId": "feature.canvas-shapes",
149
+ "name": "Shape toolbar",
150
+ "evidenceRefs": ["discovery:control.shape-toolbar"]
151
+ }
152
+ ],
153
+ "reviewQuestions": [
154
+ "Should Shapes and Connectors stay separate, or merge under Canvas Editing?"
155
+ ]
156
+ }
157
+ }
158
+ }
159
+ ```
160
+
161
+ ## Propose Changes
162
+
163
+ Use the same shape for:
164
+
165
+ - `propose_product_profile_changes`
166
+ - `propose_persona_changes`
167
+ - `propose_job_changes`
168
+ - `propose_product_hierarchy_changes`
169
+ - `propose_access_profile_changes`
170
+ - `propose_safety_policy_changes`
171
+
172
+ ```json
173
+ {
174
+ "name": "propose_job_changes",
175
+ "arguments": {
176
+ "projectId": "project-id",
177
+ "title": "Review persona jobs from repo",
178
+ "summary": "Adds jobs inferred from docs and E2E specs.",
179
+ "source": "repo-summary:main",
180
+ "payload": {
181
+ "jobs": [
182
+ {
183
+ "jobId": "job.create.workflow",
184
+ "personaName": "Process Analyst",
185
+ "title": "Create a workflow from the dashboard",
186
+ "description": "Open the dashboard, create a process map, and reach an editable canvas."
187
+ }
188
+ ]
189
+ }
190
+ }
191
+ }
192
+ ```
193
+
194
+ ## Start Discovery Request
195
+
196
+ This creates a runner job request. It does not execute approved CI.
197
+ Run it after the runner or extension is connected, auth/session handling is
198
+ available, and safe/unsafe action boundaries are known. Discovery should
199
+ capture live UI evidence: screens, surfaces, controls, selector gaps, blocked
200
+ paths, screenshots, canvas affordances, and bug candidates.
201
+
202
+ ```json
203
+ {
204
+ "name": "start_discovery_run",
205
+ "arguments": {
206
+ "projectId": "project-id",
207
+ "targetUrl": "https://staging.example.com/dashboard",
208
+ "safetyPolicyId": "change-set-or-policy-id",
209
+ "budget": {
210
+ "maxStates": 8,
211
+ "maxActionsPerState": 12,
212
+ "timeLimitMinutes": 20
213
+ }
214
+ }
215
+ }
216
+ ```
217
+
218
+ ## Promote Test Ideas
219
+
220
+ This creates a reviewable promotion change set. It does not write approved
221
+ flow code.
222
+
223
+ ```json
224
+ {
225
+ "name": "propose_test_idea_promotion",
226
+ "arguments": {
227
+ "projectId": "project-id",
228
+ "ideaIds": ["idea.dashboard.create"],
229
+ "tier": "release_gate",
230
+ "summary": "Promote the dashboard create path into a draft recipe."
231
+ }
232
+ }
233
+ ```