@thiaq/project-skill 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
@@ -26,6 +26,7 @@ npx thiaq-project-skill install --agent codex
26
26
  ```text
27
27
  Use the thiaq-project skill. Refresh the existing ThiaQ project additively:
28
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.
29
+ available, show me a draft three-level product tree for review, and only then
30
+ propose a reviewed product map without making the customer or project name the
31
+ root node.
31
32
  ```
package/SKILL.md CHANGED
@@ -57,12 +57,15 @@ Jira, browser traces, tests, or other connected tools.
57
57
  selector gaps, blocked paths, screenshots, and bug candidates.
58
58
  8. Fuse static repo analysis with live discovery. Prefer names that match the
59
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.
60
+ 9. Draft an explicit tree before any hierarchy write. It must have at least
61
+ three levels: `Product Area -> Feature or Workflow -> Surface`. Controls may
62
+ be fourth-level leaves. The customer or project name is context, not the
63
+ root tree node.
64
+ 10. Show the proposed tree to the first user in the chat, using indentation or
65
+ bullets so the structure is visible. Ask what should be renamed, merged,
66
+ split, moved, marked uncertain, or treated as release-critical.
67
+ 11. Only after the first user reviews or explicitly asks you to proceed, call
68
+ ThiaQ MCP tools to submit summaries and proposed changes.
66
69
  12. After discovery, use ThiaQ test ideas and issue categories to propose
67
70
  deterministic coverage work.
68
71
 
@@ -194,11 +197,35 @@ Use `get_project_context` first. Then call the smallest useful write operation:
194
197
  - `propose_access_profile_changes` for test URL, role, auth, and secret refs.
195
198
  - `propose_safety_policy_changes` for safe/unsafe action boundaries.
196
199
  - `list_test_ideas` after discovery.
200
+ - `list_operational_state` to inspect the agent-manageable workspace backlog:
201
+ ideas, groups, issues, journey candidates, runner work, and proposals.
202
+ - `update_test_idea` to soft-triage, archive, restore, or annotate test ideas.
203
+ - `group_test_ideas` to dedupe or collect ideas into scenario, area, or review
204
+ groups.
205
+ - `merge_test_ideas` to archive duplicate ideas under a primary idea.
197
206
  - `propose_test_idea_promotion` to create reviewable promotion work.
198
207
  - `list_issue_categories` for UX confusion, selector, driver, assertion, and
199
208
  safety gaps.
209
+ - `create_issue_category` to store an operational issue category from evidence.
210
+ - `update_issue_category` to close, reopen, archive, restore, relabel, or
211
+ reprioritize operational issue categories.
212
+ - `merge_issue_categories` to archive duplicate issues under a primary issue.
200
213
  - `create_repair_proposal` when an issue needs product, adapter, selector, or
201
214
  assertion repair.
215
+ - `update_journey_candidate` to reprioritize, archive, restore, or annotate
216
+ candidate journeys without approving executable coverage.
217
+ - `cancel_runner_job` for stale queued/running discovery or scenario work.
218
+ - `retry_runner_job` to clone failed/stale runner work without changing original
219
+ evidence.
220
+ - `update_proposal_status` to withdraw, archive, restore, or supersede draft
221
+ proposals. Do not use it for final accept/reject review gates.
222
+ - `bulk_archive_operational_records` to dry-run and then archive large noisy
223
+ operational backlogs by type, status, source run, and explicit keep IDs.
224
+ - `reconcile_operational_state` to dry-run or apply safe stale runner cleanup.
225
+
226
+ Use soft mutation statuses instead of deletion. Evidence, run artifacts,
227
+ approved flows, approved journeys, manifests, safety policy, and CI tier changes
228
+ remain review-gated.
202
229
 
203
230
  For tool schemas and payload examples, read
204
231
  `references/mcp-tools.md` only when preparing MCP calls.
@@ -216,9 +243,11 @@ When submitting repo evidence, keep findings structured:
216
243
  "personas": [{ "name": "Workspace Admin", "evidence": ["docs/admin.md"] }],
217
244
  "jobs": [{ "title": "Create and share a workflow", "personaName": "Analyst" }],
218
245
  "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" }]
246
+ "nodes": [
247
+ { "nodeId": "area.dashboard", "parentId": null, "level": 1, "kind": "product_area", "name": "Dashboard" },
248
+ { "nodeId": "feature.projects", "parentId": "area.dashboard", "level": 2, "kind": "feature", "name": "Projects" },
249
+ { "nodeId": "surface.project-list", "parentId": "feature.projects", "level": 3, "kind": "surface", "name": "Project list" }
250
+ ]
222
251
  },
223
252
  "accessProfile": {
224
253
  "loginUrl": "https://staging.example.com",
@@ -240,13 +269,20 @@ should expose product behavior, not account metadata:
240
269
  - Top visible level: product areas such as Dashboard, Canvas Authoring,
241
270
  Collaboration, Admin, Billing, Reporting, or Workspace Organization.
242
271
  - Second level: features or workflows inside each area.
243
- - Third level: surfaces, controls, states, or canvas affordances that scenarios
244
- can anchor to.
272
+ - Third level: surfaces, states, or canvas affordances that scenarios can
273
+ anchor to.
274
+ - Optional fourth level: controls only when the control is stable, named, and
275
+ useful as a scenario anchor.
245
276
  - Scenario and issue counts should attach to the most specific useful node.
246
277
  - Never use the customer, project, tenant, or product name as the visible root
247
278
  node. Keep that as surrounding context.
248
279
  - Carry evidence and confidence for inferred nodes so the first user can
249
280
  rename, merge, split, or reject suggestions.
281
+ - Do not submit a flat list of sections as a hierarchy. The hierarchy proposal
282
+ must contain explicit tree nodes with stable `nodeId`, `parentId`, `level`,
283
+ `kind`, `name`, evidence, confidence, and review questions.
284
+ - Do not submit the hierarchy before showing the draft tree to the user unless
285
+ the user explicitly tells you to proceed without review.
250
286
 
251
287
  Use repo structure alone only as a starting hypothesis. Prefer the fused view:
252
288
  what users can see in live discovery, what code/routes/tests call it, and what
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thiaq/project-skill",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "description": "ThiaQ project setup skill for Codex and Claude Code agents.",
@@ -111,12 +111,18 @@ but mark them as proposals that should be fused with live discovery.
111
111
  ## Product Hierarchy Proposal
112
112
 
113
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.
114
+ with static repo analysis. Before calling it, show the proposed tree to the
115
+ first user and ask what should be renamed, merged, split, moved, marked
116
+ uncertain, or treated as release-critical. Do not treat inferred names as final.
116
117
 
117
118
  The visible tree should start with product areas. Do not make the customer,
118
119
  tenant, project, or product name the root node.
119
120
 
121
+ The proposal must include an explicit tree with at least three levels:
122
+ `Product Area -> Feature or Workflow -> Surface`. Controls may be fourth-level
123
+ leaves when they are stable scenario anchors. Flat sections or areas with nested
124
+ free-form metadata are not enough.
125
+
120
126
  ```json
121
127
  {
122
128
  "name": "propose_product_hierarchy_changes",
@@ -126,26 +132,29 @@ tenant, project, or product name the root node.
126
132
  "summary": "Combines live UI discovery with repo routes, tests, and docs.",
127
133
  "source": "discovery:job-id + repo-summary:main",
128
134
  "payload": {
129
- "areas": [
135
+ "nodes": [
130
136
  {
131
- "areaId": "area.canvas-authoring",
137
+ "nodeId": "area.canvas-authoring",
138
+ "parentId": null,
139
+ "level": 1,
140
+ "kind": "product_area",
132
141
  "name": "Canvas Authoring",
133
142
  "evidenceRefs": ["discovery:screen.canvas", "app/routes/canvas.tsx"],
134
143
  "confidence": 0.82
135
- }
136
- ],
137
- "features": [
144
+ },
138
145
  {
139
- "featureId": "feature.canvas-shapes",
140
- "areaId": "area.canvas-authoring",
146
+ "nodeId": "feature.canvas-shapes",
147
+ "parentId": "area.canvas-authoring",
148
+ "level": 2,
149
+ "kind": "feature",
141
150
  "name": "Shapes",
142
151
  "evidenceRefs": ["discovery:control.shape-toolbar", "tests/e2e/shapes.spec.ts"]
143
- }
144
- ],
145
- "surfaces": [
152
+ },
146
153
  {
147
- "surfaceId": "surface.shape-toolbar",
148
- "featureId": "feature.canvas-shapes",
154
+ "nodeId": "surface.shape-toolbar",
155
+ "parentId": "feature.canvas-shapes",
156
+ "level": 3,
157
+ "kind": "surface",
149
158
  "name": "Shape toolbar",
150
159
  "evidenceRefs": ["discovery:control.shape-toolbar"]
151
160
  }
@@ -231,3 +240,262 @@ flow code.
231
240
  }
232
241
  }
233
242
  ```
243
+
244
+ ## Operational Workspace Mutations
245
+
246
+ Agents may directly manage living QA workspace state when the operation is
247
+ soft, reversible, and reasoned. Do not hard-delete evidence. Do not accept or
248
+ reject review gates. Do not mutate approved flow code, journey specs, manifests,
249
+ safety policy, access policy, or CI tiers.
250
+
251
+ ### List Operational State
252
+
253
+ Use this before cleanup work to inspect all MCP-manageable backlog records in
254
+ one bounded payload.
255
+
256
+ ```json
257
+ {
258
+ "name": "list_operational_state",
259
+ "arguments": {
260
+ "projectId": "project-id",
261
+ "limit": "50",
262
+ "status": "draft"
263
+ }
264
+ }
265
+ ```
266
+
267
+ ### Update A Test Idea
268
+
269
+ Use this to triage, annotate, archive, restore, or reprioritize discovery
270
+ findings.
271
+
272
+ ```json
273
+ {
274
+ "name": "update_test_idea",
275
+ "arguments": {
276
+ "projectId": "project-id",
277
+ "ideaId": "idea.dashboard.create",
278
+ "status": "archived",
279
+ "reason": "Covered by scenario group scenario.dashboard.create"
280
+ }
281
+ }
282
+ ```
283
+
284
+ ### Group Test Ideas
285
+
286
+ Use this to dedupe or collect findings into scenario, product-area, or review
287
+ groups.
288
+
289
+ ```json
290
+ {
291
+ "name": "group_test_ideas",
292
+ "arguments": {
293
+ "projectId": "project-id",
294
+ "groupId": "scenario.dashboard.create",
295
+ "groupKind": "scenario",
296
+ "label": "Dashboard create path",
297
+ "ideaIds": ["idea.dashboard.create", "idea.dashboard.empty-state"],
298
+ "rationale": "These findings describe one scenario candidate."
299
+ }
300
+ }
301
+ ```
302
+
303
+ ### Merge Test Ideas
304
+
305
+ Use this when several findings describe the same coverage need. The primary is
306
+ kept; secondaries are archived with merge evidence.
307
+
308
+ ```json
309
+ {
310
+ "name": "merge_test_ideas",
311
+ "arguments": {
312
+ "projectId": "project-id",
313
+ "primaryIdeaId": "idea.dashboard.create",
314
+ "secondaryIdeaIds": ["idea.dashboard.empty-state"],
315
+ "reason": "Both findings describe the same dashboard create scenario."
316
+ }
317
+ }
318
+ ```
319
+
320
+ ### Create An Issue Category
321
+
322
+ Use this to persist a new operational gap that the agent found in evidence.
323
+
324
+ ```json
325
+ {
326
+ "name": "create_issue_category",
327
+ "arguments": {
328
+ "projectId": "project-id",
329
+ "categoryId": "selector-gap.dashboard-create",
330
+ "categoryType": "selector_gap",
331
+ "label": "Dashboard create selector gap",
332
+ "severity": "medium",
333
+ "sourceIds": ["idea.dashboard.create"],
334
+ "reason": "No stable role/test-id locator exists for the create action."
335
+ }
336
+ }
337
+ ```
338
+
339
+ ### Update An Issue Category
340
+
341
+ Use this to close, reopen, archive, restore, relabel, or reprioritize UX,
342
+ selector, driver, assertion, or safety gaps.
343
+
344
+ ```json
345
+ {
346
+ "name": "update_issue_category",
347
+ "arguments": {
348
+ "projectId": "project-id",
349
+ "categoryId": "selector-gap.dashboard-create",
350
+ "status": "closed",
351
+ "reason": "Stable role locator added to the reviewed interaction contract."
352
+ }
353
+ }
354
+ ```
355
+
356
+ ### Merge Issue Categories
357
+
358
+ Use this when multiple issues describe the same gap. The primary issue remains;
359
+ secondaries are archived.
360
+
361
+ ```json
362
+ {
363
+ "name": "merge_issue_categories",
364
+ "arguments": {
365
+ "projectId": "project-id",
366
+ "primaryCategoryId": "selector-gap.dashboard-create",
367
+ "secondaryCategoryIds": ["selector-gap.create-button"],
368
+ "reason": "Both point at the same missing create-button locator."
369
+ }
370
+ }
371
+ ```
372
+
373
+ ### Update A Journey Candidate
374
+
375
+ Use this for ranking and triage only. It does not approve executable coverage.
376
+
377
+ ```json
378
+ {
379
+ "name": "update_journey_candidate",
380
+ "arguments": {
381
+ "projectId": "project-id",
382
+ "candidateId": "journey-candidate-id",
383
+ "priority": "high",
384
+ "status": "active",
385
+ "reason": "Matches release-critical onboarding path."
386
+ }
387
+ }
388
+ ```
389
+
390
+ ### Cancel Runner Work
391
+
392
+ Use this for queued or running discovery/scenario jobs that are stale or unsafe.
393
+ Completed jobs are immutable.
394
+
395
+ ```json
396
+ {
397
+ "name": "cancel_runner_job",
398
+ "arguments": {
399
+ "projectId": "project-id",
400
+ "runnerJobId": "runner-job-id",
401
+ "runnerJobRequestId": "runner-request-id",
402
+ "reason": "Superseded by discovery run with updated safety boundaries."
403
+ }
404
+ }
405
+ ```
406
+
407
+ ### Retry Runner Work
408
+
409
+ Use this to clone a failed or stale runner job/request into new queued work. The
410
+ original evidence remains unchanged.
411
+
412
+ ```json
413
+ {
414
+ "name": "retry_runner_job",
415
+ "arguments": {
416
+ "projectId": "project-id",
417
+ "runnerJobId": "runner-job-id",
418
+ "reason": "Runner environment is now healthy."
419
+ }
420
+ }
421
+ ```
422
+
423
+ ### Withdraw Or Supersede A Proposal
424
+
425
+ Use this for draft proposal lifecycle cleanup. Final accept/reject remains a UI
426
+ review gate.
427
+
428
+ ```json
429
+ {
430
+ "name": "update_proposal_status",
431
+ "arguments": {
432
+ "projectId": "project-id",
433
+ "proposalId": "proposal-id",
434
+ "status": "superseded",
435
+ "supersededById": "replacement-proposal-id",
436
+ "reason": "Merged into a broader repair proposal."
437
+ }
438
+ }
439
+ ```
440
+
441
+ ### Bulk Archive Operational Records
442
+
443
+ Use this for large discovery-noise resets when thousands of proposals or test
444
+ ideas would otherwise require one call per record. It is dry-run by default and
445
+ returns compact counts plus sample IDs, not full proposal or idea bodies.
446
+
447
+ By default, it targets only `proposals` and `test_ideas`. Add more record types
448
+ explicitly when clearing groups, issues, journey candidates, or stale runner
449
+ work. It never hard-deletes evidence, never archives accepted/rejected
450
+ proposals, never archives approved/promoted/implemented test ideas, and only
451
+ cancels queued/running runner work.
452
+
453
+ Preview first:
454
+
455
+ ```json
456
+ {
457
+ "name": "bulk_archive_operational_records",
458
+ "arguments": {
459
+ "projectId": "project-id",
460
+ "recordTypes": ["proposals", "test_ideas"],
461
+ "sourceRunIds": ["runner.discovery.ffe22c16"],
462
+ "proposalTypes": ["coverage-gap", "candidate-pathway", "bug-candidate"],
463
+ "dryRun": "true",
464
+ "excludeIds": ["proposal-to-keep", "idea.to.keep"],
465
+ "reason": "Preview cleanup of superseded discovery noise."
466
+ }
467
+ }
468
+ ```
469
+
470
+ Apply after reviewing the returned counts:
471
+
472
+ ```json
473
+ {
474
+ "name": "bulk_archive_operational_records",
475
+ "arguments": {
476
+ "projectId": "project-id",
477
+ "recordTypes": ["proposals", "test_ideas"],
478
+ "sourceRunIds": ["runner.discovery.ffe22c16"],
479
+ "dryRun": "false",
480
+ "excludeIds": ["proposal-to-keep", "idea.to.keep"],
481
+ "reason": "Archive superseded discovery noise after preserving latest real findings."
482
+ }
483
+ }
484
+ ```
485
+
486
+ ### Reconcile Operational State
487
+
488
+ Use this to find stale queued/running runner work. It is dry-run by default.
489
+ Only set `dryRun` to `"false"` when the cancellation is safe.
490
+
491
+ ```json
492
+ {
493
+ "name": "reconcile_operational_state",
494
+ "arguments": {
495
+ "projectId": "project-id",
496
+ "staleRunnerHours": "24",
497
+ "dryRun": "true",
498
+ "reason": "Nightly cleanup of stale queued discovery work."
499
+ }
500
+ }
501
+ ```