@fluentcommerce/ai-skills 0.1.0 → 0.3.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.
Potentially problematic release.
This version of @fluentcommerce/ai-skills might be problematic. Click here for more details.
- package/README.md +866 -622
- package/bin/cli.mjs +2112 -1973
- package/content/cli/agents/fluent-cli/agent.json +149 -149
- package/content/cli/agents/fluent-cli.md +132 -132
- package/content/cli/skills/fluent-bootstrap/SKILL.md +214 -181
- package/content/cli/skills/fluent-cli-index/SKILL.md +1 -1
- package/content/cli/skills/fluent-cli-mcp-cicd/SKILL.md +117 -1
- package/content/cli/skills/fluent-cli-reference/SKILL.md +1040 -1031
- package/content/cli/skills/fluent-cli-retailer/SKILL.md +27 -2
- package/content/cli/skills/fluent-cli-settings/SKILL.md +21 -1
- package/content/cli/skills/fluent-connect/SKILL.md +937 -886
- package/content/cli/skills/fluent-module-deploy/SKILL.md +63 -5
- package/content/cli/skills/fluent-profile/SKILL.md +73 -0
- package/content/cli/skills/fluent-workflow/SKILL.md +360 -310
- package/content/dev/agents/fluent-backend-dev/AGENT.md +58 -0
- package/content/dev/agents/fluent-backend-dev/agent.json +69 -0
- package/content/dev/agents/fluent-backend-dev.md +287 -0
- package/content/dev/agents/fluent-dev/AGENT.md +98 -0
- package/content/dev/agents/fluent-dev/agent.json +14 -2
- package/content/dev/agents/fluent-dev.md +194 -525
- package/content/dev/agents/fluent-frontend-dev/AGENT.md +63 -0
- package/content/dev/agents/fluent-frontend-dev/agent.json +52 -0
- package/content/dev/agents/fluent-frontend-dev.md +323 -0
- package/content/dev/skills/fluent-archive/SKILL.md +234 -0
- package/content/dev/skills/fluent-build/SKILL.md +312 -192
- package/content/dev/skills/fluent-connection-analysis/SKILL.md +422 -386
- package/content/dev/skills/fluent-custom-code/SKILL.md +15 -9
- package/content/dev/skills/fluent-data-module-scaffold/SKILL.md +19 -2
- package/content/dev/skills/fluent-e2e-test/SKILL.md +501 -394
- package/content/dev/skills/fluent-event-api/SKILL.md +962 -945
- package/content/dev/skills/fluent-feature-explain/SKILL.md +680 -603
- package/content/dev/skills/fluent-feature-plan/PLAN_TEMPLATE.md +27 -2
- package/content/dev/skills/fluent-feature-plan/SKILL.md +478 -227
- package/content/dev/skills/fluent-feature-status/SKILL.md +335 -0
- package/content/dev/skills/fluent-feedback/SKILL.md +221 -0
- package/content/dev/skills/fluent-implementation-map/SKILL.md +644 -0
- package/content/dev/skills/fluent-job-batch/SKILL.md +10 -0
- package/content/dev/skills/fluent-module-scaffold/SKILL.md +64 -2
- package/content/dev/skills/fluent-module-validate/SKILL.md +778 -775
- package/content/dev/skills/fluent-mystique-analyze/SKILL.md +817 -0
- package/content/dev/skills/fluent-mystique-builder/COMPONENT_TEMPLATE.md +81 -0
- package/content/dev/skills/fluent-mystique-builder/README.md +63 -0
- package/content/dev/skills/fluent-mystique-builder/SKILL.md +1294 -0
- package/content/dev/skills/fluent-mystique-builder/components/INDEX.md +92 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.accordion.md +48 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.action.field.fulfilmentpack.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.action.field.multiparcel.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.action.field.returnitems.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.action.field.wavepick.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.action.inline.md +24 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.activity.entity.md +25 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.analytics.viz.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.attribute.column.md +111 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.attribute.json.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.attribute.jsoneditor.md +54 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.attribute.locationId.md +51 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.attribute.retailerId.md +52 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.button.bar.md +57 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.button.print.download.md +53 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.button.print.inline.compatibility.md +60 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.button.print.inline.md +53 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.button.print.md +24 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.button.print.pick.md +61 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.buttons.add.reject.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.card.attribute.md +73 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.card.attributes.grid.md +40 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.card.image.md +37 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.card.map.point.md +24 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.card.multi.md +79 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.card.product.md +27 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.chart.area.md +34 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.chart.area.wrapper.feed.md +98 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.chart.bar.md +52 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.chart.bar.wrapper.source.md +104 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.chart.gauge.md +28 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.chart.gauge.wrapper.threshold.md +118 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.chart.line.md +32 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.conditional.md +62 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.dashboard.threshold.md +65 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.daterange.wrapper.forwarder.md +56 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.drawer.button.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.event.detail.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.events.search.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.field.daterange.md +83 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.field.filterComplex.md +106 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.field.intrange.md +82 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.field.multistring.md +50 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.filterPanel.md +53 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.json.editor.md +22 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.json.viewer.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.list.customAction.md +79 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.list.md +116 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.list.wrapper.bppmetrics.md +69 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.list.wrapper.feed.md +65 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.list.wrapper.source.md +64 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.modal.button.addItem.md +60 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.modal.button.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.mutation.inline.md +88 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.mystique.collapsible.attributes.md +83 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.mystique.collapsible.text.md +33 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.mystique.link.md +30 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.order.itemDetails.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.order.shipmentDetails.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.filter.select.md +87 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.md +64 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.refresh.md +48 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.section.column.md +71 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.section.header.md +61 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.section.md +59 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.wizard.md +45 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.page.wizard.summary.md +56 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.progress.circular.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.provider.graphql.md +71 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.quantity.list.md +87 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.repeater.md +56 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.reports.ipuipc.md +54 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.return.rowExpansion.md +19 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.scanner.barcode.md +21 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.scanner.barcodeFilter.md +72 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.scanner.camera.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.settingForm.md +64 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.sourcing.profile.drawer.button.md +19 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.sourcing.profile.modal.button.md +64 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.sourcing.strategy.modal.button.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.stepper.md +20 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.tab.content.md +56 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.tabs.card.md +64 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.tabs.md +69 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.tile.metric.md +73 -0
- package/content/dev/skills/fluent-mystique-builder/components/fc.workflow.provider.md +77 -0
- package/content/dev/skills/fluent-mystique-builder/validate-docs.ps1 +260 -0
- package/content/dev/skills/fluent-mystique-scaffold/SKILL.md +1830 -0
- package/content/dev/skills/fluent-mystique-validate/SKILL.md +646 -0
- package/content/dev/skills/fluent-pre-deploy-check/SKILL.md +1144 -1108
- package/content/dev/skills/fluent-retailer-config/SKILL.md +1162 -1111
- package/content/dev/skills/fluent-rollback/SKILL.md +387 -0
- package/content/dev/skills/fluent-rule-scaffold/SKILL.md +515 -385
- package/content/dev/skills/fluent-scope-decompose/SKILL.md +1123 -1021
- package/content/dev/skills/fluent-session-audit-export/SKILL.md +880 -632
- package/content/dev/skills/fluent-session-summary/SKILL.md +320 -195
- package/content/dev/skills/fluent-settings/SKILL.md +160 -1
- package/content/dev/skills/fluent-source-onboard/SKILL.md +31 -3
- package/content/dev/skills/fluent-sourcing/SKILL.md +1185 -0
- package/content/dev/skills/fluent-system-monitoring/SKILL.md +771 -767
- package/content/dev/skills/fluent-test-data/SKILL.md +514 -513
- package/content/dev/skills/fluent-trace/SKILL.md +1169 -1143
- package/content/dev/skills/fluent-transition-api/SKILL.md +364 -346
- package/content/dev/skills/fluent-use-case-discover/SKILL.md +593 -0
- package/content/dev/skills/fluent-use-case-discover/SPEC_TEMPLATE.md +281 -0
- package/content/dev/skills/fluent-version-manage/SKILL.md +53 -2
- package/content/dev/skills/fluent-workflow-analyzer/SKILL.md +995 -959
- package/content/dev/skills/fluent-workflow-builder/SKILL.md +668 -319
- package/content/dev/skills/fluent-workflow-deploy/SKILL.md +480 -267
- package/content/dev/skills/fluent-workspace-tree/SKILL.md +281 -0
- package/content/mcp-extn/agents/fluent-mcp.md +133 -69
- package/content/mcp-extn/skills/fluent-mcp-tools/SKILL.md +812 -461
- package/content/mcp-official/agents/fluent-mcp-core.md +91 -91
- package/content/mcp-official/skills/fluent-mcp-core/SKILL.md +94 -94
- package/content/rfl/skills/fluent-rfl-assess/SKILL.md +172 -172
- package/docs/CAPABILITY_MAP.md +106 -77
- package/docs/DEPLOYMENT_PROMOTION_RUNBOOK.md +218 -0
- package/docs/DESIGN-implementation-map.md +698 -0
- package/docs/DEV_WORKFLOW.md +814 -802
- package/docs/FLOW_RUN.md +142 -142
- package/docs/GETTING_STARTED.md +427 -0
- package/docs/USE_CASES.md +909 -52
- package/metadata.json +184 -156
- package/package.json +3 -2
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fluent-feature-status
|
|
3
|
+
description: Dashboard view of all features and their lifecycle status. Scans accounts/<PROFILE>/features/*/status.json and presents a consolidated table with filtering, sorting, and workspace tree view. Triggers on "feature status", "show features", "what features", "feature dashboard", "where am I", "what's in progress".
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools: Bash, Read, Glob, Grep
|
|
6
|
+
argument-hint: [--profile PROFILE] [--filter STATUS] [--format table|json] [--tree]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Feature Status Dashboard
|
|
10
|
+
|
|
11
|
+
Scan all feature directories for a profile and present a unified dashboard showing lifecycle status, next actions, and workspace health. This is the "where am I?" view that answers "what features exist, what state are they in, and what should I do next?"
|
|
12
|
+
|
|
13
|
+
## Ownership Boundary
|
|
14
|
+
|
|
15
|
+
This skill owns: feature status aggregation, dashboard rendering, workspace tree view, resume recommendations.
|
|
16
|
+
|
|
17
|
+
Other skills own: individual feature lifecycle transitions (`/fluent-use-case-discover`, `/fluent-feature-plan`, `/fluent-archive`, etc.), session audit trail (`/fluent-session-summary`).
|
|
18
|
+
|
|
19
|
+
## When to Use
|
|
20
|
+
|
|
21
|
+
- **Session start** — see where you left off across all features
|
|
22
|
+
- **After completing a major step** — verify status updated correctly
|
|
23
|
+
- **Managing multiple features** — get the big picture at a glance
|
|
24
|
+
- **Before archival** — identify features ready to archive (VERIFIED status)
|
|
25
|
+
- **Onboarding to a workspace** — understand what's been built
|
|
26
|
+
- **Progress check** — during multi-feature work, see the full picture
|
|
27
|
+
|
|
28
|
+
## No Planning Gate
|
|
29
|
+
|
|
30
|
+
This is a **read-only** diagnostic skill. No planning gate required. It can be invoked at any time without approval, writes no files, and makes no mutations.
|
|
31
|
+
|
|
32
|
+
## Inputs
|
|
33
|
+
|
|
34
|
+
| Parameter | Required | Default | Description |
|
|
35
|
+
|-----------|----------|---------|-------------|
|
|
36
|
+
| `--profile` | No | Active CLI profile (or all profiles) | Fluent CLI profile to scan |
|
|
37
|
+
| `--filter` | No | (all statuses) | Filter by status: `DISCOVERY`, `PLANNING`, `APPROVED`, `IN_PROGRESS`, `VERIFIED`, `ARCHIVED` |
|
|
38
|
+
| `--format` | No | `table` | Output format: `table` (human-readable) or `json` (machine-readable) |
|
|
39
|
+
| `--tree` | No | `false` | Also show workspace directory tree with artifact counts |
|
|
40
|
+
|
|
41
|
+
## Execution Flow
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
1. RESOLVE profile
|
|
45
|
+
- From --profile arg, or active Fluent CLI profile, or scan all profiles
|
|
46
|
+
- Validate accounts/<PROFILE>/ directory exists
|
|
47
|
+
|
|
48
|
+
2. SCAN feature directories
|
|
49
|
+
- Glob: accounts/<PROFILE>/features/*/status.json
|
|
50
|
+
- If no --profile: accounts/*/features/*/status.json
|
|
51
|
+
- If no features/ directory -> report "No features found" with guidance
|
|
52
|
+
|
|
53
|
+
3. PARSE each status.json
|
|
54
|
+
- Validate $schema = "feature-status-v1"
|
|
55
|
+
- Extract all fields: feature, retailers (or retailer), status, spec, plan,
|
|
56
|
+
planRevision, architecture, basedOn, next, updated
|
|
57
|
+
- On parse error -> add to warnings list, include with status PARSE_ERROR
|
|
58
|
+
|
|
59
|
+
4. SORT features
|
|
60
|
+
- Primary: status priority (IN_PROGRESS > APPROVED > PLANNING > DISCOVERY > VERIFIED > ARCHIVED)
|
|
61
|
+
- Secondary: updated date descending (most recent first)
|
|
62
|
+
|
|
63
|
+
5. FILTER (if --filter specified)
|
|
64
|
+
- Keep only features matching the requested status
|
|
65
|
+
- Case-insensitive comparison
|
|
66
|
+
|
|
67
|
+
6. DETECT attention flags
|
|
68
|
+
- STALE: IN_PROGRESS + updated > 7 days ago
|
|
69
|
+
- ready to build: APPROVED + no build/deploy reports
|
|
70
|
+
- awaiting spec approval: PLANNING + spec not APPROVED
|
|
71
|
+
- awaiting plan approval: PLANNING + spec APPROVED + plan not APPROVED
|
|
72
|
+
|
|
73
|
+
7. RENDER output
|
|
74
|
+
- table: formatted markdown table with summary footer + recommendation
|
|
75
|
+
- json: structured JSON with features array and summary object
|
|
76
|
+
|
|
77
|
+
8. RECOMMEND next action
|
|
78
|
+
- If any STALE feature -> "Resume: ..."
|
|
79
|
+
- If any IN_PROGRESS feature -> "Continue: ..."
|
|
80
|
+
- If any APPROVED feature -> "Start building: ..."
|
|
81
|
+
- If all VERIFIED/ARCHIVED -> "All features complete."
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Status Priority Order
|
|
85
|
+
|
|
86
|
+
Features are sorted by lifecycle urgency -- active work first, historical last.
|
|
87
|
+
|
|
88
|
+
| Priority | Status | Meaning |
|
|
89
|
+
|----------|--------|---------|
|
|
90
|
+
| 1 | `IN_PROGRESS` | Active work -- resume this first |
|
|
91
|
+
| 2 | `APPROVED` | Ready to start building |
|
|
92
|
+
| 3 | `PLANNING` | Needs plan review/approval |
|
|
93
|
+
| 4 | `DISCOVERY` | Early stage -- spec in progress |
|
|
94
|
+
| 5 | `VERIFIED` | Complete -- ready to archive |
|
|
95
|
+
| 6 | `ARCHIVED` | Historical reference |
|
|
96
|
+
|
|
97
|
+
## Dashboard Table Format
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
=== Feature Dashboard: HMDEV ===
|
|
101
|
+
|
|
102
|
+
| Feature | Retailers | Status | Spec | Plan (Rev) | Arch | Next | Updated |
|
|
103
|
+
|-------------------|--------------|---------------|----------|------------|------|---------------------------|------------|
|
|
104
|
+
| order-return | HM_TEST | IN_PROGRESS | APPROVED | APPROVED (v1) | Yes | /fluent-build | 2026-02-25 |
|
|
105
|
+
| curbside-pickup | Module Test | APPROVED | APPROVED | APPROVED (v2) | Yes | /fluent-rule-scaffold | 2026-02-24 |
|
|
106
|
+
| click-collect | Module Test | PLANNING | APPROVED | PENDING | No | awaiting plan approval | 2026-02-25 |
|
|
107
|
+
| returns-flow | Module Test | DISCOVERY | DRAFT | -- | No | /fluent-use-case-discover | 2026-02-25 |
|
|
108
|
+
|
|
109
|
+
Summary: 4 features (1 IN_PROGRESS, 1 APPROVED, 1 PLANNING, 1 DISCOVERY)
|
|
110
|
+
|
|
111
|
+
Recommendation: Continue /fluent-build on "order-return"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Attention Flags
|
|
115
|
+
|
|
116
|
+
| Condition | Flag | Rendering |
|
|
117
|
+
|-----------|------|-----------|
|
|
118
|
+
| IN_PROGRESS + updated > 7 days ago | STALE | Status shows "IN_PROGRESS (STALE)" |
|
|
119
|
+
| APPROVED + no implementation evidence | ready to build | Highlighted in recommendation |
|
|
120
|
+
| PLANNING + spec not APPROVED | awaiting spec | Next shows "awaiting spec approval" |
|
|
121
|
+
| PLANNING + spec APPROVED + plan not APPROVED | awaiting plan | Next shows "awaiting plan approval" |
|
|
122
|
+
| Has `basedOn` field | basedOn: slug | Arch column shows "Yes (basedOn: slug)" |
|
|
123
|
+
|
|
124
|
+
### Column Definitions
|
|
125
|
+
|
|
126
|
+
| Column | Source | Notes |
|
|
127
|
+
|--------|--------|-------|
|
|
128
|
+
| Feature | `feature` field | Slug (matches directory name) |
|
|
129
|
+
| Retailers | `retailers[]` or `retailer` | Comma-separated if multiple; `--` if null |
|
|
130
|
+
| Status | `status` field | With attention flags appended |
|
|
131
|
+
| Spec | `spec` field | DRAFT / APPROVED / `--` |
|
|
132
|
+
| Plan (Rev) | `plan` + `planRevision` | e.g., "APPROVED (v2)" or "PENDING" or `--` |
|
|
133
|
+
| Arch | `architecture` field | Yes / No; "(basedOn: X)" if basedOn field set |
|
|
134
|
+
| Next | `next` field or derived | Advisory next skill or attention flag |
|
|
135
|
+
| Updated | `updated` field | Last modification date |
|
|
136
|
+
|
|
137
|
+
## JSON Output Format
|
|
138
|
+
|
|
139
|
+
When `--format json`:
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"profile": "HMDEV",
|
|
144
|
+
"scannedAt": "2026-02-25T10:00:00Z",
|
|
145
|
+
"features": [
|
|
146
|
+
{
|
|
147
|
+
"slug": "order-return",
|
|
148
|
+
"retailers": ["HM_TEST"],
|
|
149
|
+
"status": "IN_PROGRESS",
|
|
150
|
+
"spec": "APPROVED",
|
|
151
|
+
"plan": "APPROVED",
|
|
152
|
+
"planRevision": 1,
|
|
153
|
+
"architecture": true,
|
|
154
|
+
"basedOn": null,
|
|
155
|
+
"next": "/fluent-build",
|
|
156
|
+
"updated": "2026-02-25",
|
|
157
|
+
"path": "accounts/HMDEV/features/order-return/",
|
|
158
|
+
"flags": []
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"slug": "curbside-pickup",
|
|
162
|
+
"retailers": ["Module Test"],
|
|
163
|
+
"status": "APPROVED",
|
|
164
|
+
"spec": "APPROVED",
|
|
165
|
+
"plan": "APPROVED",
|
|
166
|
+
"planRevision": 2,
|
|
167
|
+
"architecture": true,
|
|
168
|
+
"basedOn": null,
|
|
169
|
+
"next": "/fluent-rule-scaffold",
|
|
170
|
+
"updated": "2026-02-24",
|
|
171
|
+
"path": "accounts/HMDEV/features/curbside-pickup/",
|
|
172
|
+
"flags": ["ready_to_build"]
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"summary": {
|
|
176
|
+
"total": 4,
|
|
177
|
+
"byStatus": {
|
|
178
|
+
"IN_PROGRESS": 1,
|
|
179
|
+
"APPROVED": 1,
|
|
180
|
+
"PLANNING": 1,
|
|
181
|
+
"DISCOVERY": 1
|
|
182
|
+
},
|
|
183
|
+
"stale": 0
|
|
184
|
+
},
|
|
185
|
+
"recommendation": "Continue /fluent-build on \"order-return\"",
|
|
186
|
+
"warnings": []
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Workspace Tree View (--tree)
|
|
191
|
+
|
|
192
|
+
When `--tree` is specified, scan and render the full workspace structure:
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
=== Workspace: HMDEV ===
|
|
196
|
+
|
|
197
|
+
accounts/HMDEV/
|
|
198
|
+
+-- features/ (4 features)
|
|
199
|
+
| +-- order-return/ (IN_PROGRESS -> /fluent-build)
|
|
200
|
+
| +-- curbside-pickup/ (APPROVED -> /fluent-rule-scaffold)
|
|
201
|
+
| +-- click-collect/ (PLANNING -> awaiting plan approval)
|
|
202
|
+
| +-- returns-flow/ (DISCOVERY -> /fluent-use-case-discover)
|
|
203
|
+
+-- SOURCE/ (2 repos)
|
|
204
|
+
| +-- fc-module-hm-ext/ (module.json: 12 rules)
|
|
205
|
+
| +-- fc-module-returns/ (module.json: 5 rules)
|
|
206
|
+
+-- workflows/
|
|
207
|
+
| +-- HM_TEST/ (8 workflow files)
|
|
208
|
+
+-- reports/
|
|
209
|
+
| +-- build/ (2 reports)
|
|
210
|
+
| +-- pre-deploy/ (1 report)
|
|
211
|
+
| +-- e2e-test/ (0 reports)
|
|
212
|
+
+-- analysis/
|
|
213
|
+
| +-- code/ (3 files)
|
|
214
|
+
| +-- topology/ (1 file)
|
|
215
|
+
| +-- settings/ (0 files)
|
|
216
|
+
+-- tasks/ (2 task plans)
|
|
217
|
+
+-- sessions/ (5 exports)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Tree Artifact Counting
|
|
221
|
+
|
|
222
|
+
| Directory | Count Method |
|
|
223
|
+
|-----------|-------------|
|
|
224
|
+
| `features/*/` | Glob for `status.json` files |
|
|
225
|
+
| `SOURCE/*/` | Glob for `module.json` files; count rules from each |
|
|
226
|
+
| `workflows/RETAILER/` | Count `*.json` excluding `workflow-context.json` |
|
|
227
|
+
| `reports/*/` | Count files per subdirectory |
|
|
228
|
+
| `analysis/*/` | Count files per subdirectory |
|
|
229
|
+
| `tasks/` | Count `*.md` files |
|
|
230
|
+
| `sessions/` | Count `*.json` files |
|
|
231
|
+
|
|
232
|
+
## Multi-Profile View
|
|
233
|
+
|
|
234
|
+
When no `--profile` is specified and multiple profiles have features:
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
=== Feature Dashboard ===
|
|
238
|
+
|
|
239
|
+
### HMDEV (3 features)
|
|
240
|
+
| Feature | Retailers | Status | ... |
|
|
241
|
+
...
|
|
242
|
+
|
|
243
|
+
### SAGIRISH (2 features)
|
|
244
|
+
| Feature | Retailers | Status | ... |
|
|
245
|
+
...
|
|
246
|
+
|
|
247
|
+
Overall: 5 features across 2 profiles (2 IN_PROGRESS, 1 APPROVED, 2 PLANNING)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Edge Cases
|
|
251
|
+
|
|
252
|
+
### No features directory
|
|
253
|
+
```
|
|
254
|
+
No features found for profile HMDEV.
|
|
255
|
+
Start with: /fluent-use-case-discover to define your first feature.
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Empty features directory
|
|
259
|
+
Same message as above.
|
|
260
|
+
|
|
261
|
+
### Malformed status.json
|
|
262
|
+
```
|
|
263
|
+
Warnings:
|
|
264
|
+
features/broken-feature/status.json: Invalid JSON (unexpected token at line 5)
|
|
265
|
+
features/old-feature/status.json: Missing required field "status"
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Include in table with status `PARSE_ERROR`. Do not skip -- visibility matters.
|
|
269
|
+
|
|
270
|
+
### Missing fields in status.json
|
|
271
|
+
Use `--` for any missing optional field. Required fields (`feature`, `status`) trigger a warning.
|
|
272
|
+
|
|
273
|
+
### Backward compatibility
|
|
274
|
+
If `retailers` array is absent but `retailer` (string) exists, treat as `["retailer-value"]`. If both exist, prefer `retailers`.
|
|
275
|
+
|
|
276
|
+
### Archived features
|
|
277
|
+
Include at bottom of table. Exclude from summary counts by default. Show separately: "Plus 2 archived features (use --filter ARCHIVED to view)".
|
|
278
|
+
|
|
279
|
+
## Handoff Protocol
|
|
280
|
+
|
|
281
|
+
### Emitted Signals
|
|
282
|
+
- `-> READY: accounts/PROFILE/features/` -- Dashboard rendered successfully
|
|
283
|
+
- `-> NEXT: /fluent-<next-skill> --feature "slug"` -- Recommend resuming highest-priority feature (skill name from status.json `next` field)
|
|
284
|
+
- `-> SKIP: No features found` -- Empty workspace, suggest /fluent-use-case-discover
|
|
285
|
+
|
|
286
|
+
### Consumed Signals
|
|
287
|
+
This skill does not consume handoff signals -- it reads `status.json` files directly.
|
|
288
|
+
|
|
289
|
+
## Error Reporting
|
|
290
|
+
|
|
291
|
+
| Severity | Code | Scenario | Recovery |
|
|
292
|
+
|----------|------|----------|----------|
|
|
293
|
+
| LOW | `PARSE_WARNING` | Malformed status.json | Skip feature, show warning |
|
|
294
|
+
| LOW | `MISSING_FIELD` | Optional field missing | Display as `--` |
|
|
295
|
+
| MEDIUM | `NO_FEATURES` | No feature directories found | Guide to /fluent-use-case-discover |
|
|
296
|
+
| MEDIUM | `PROFILE_NOT_FOUND` | Profile directory does not exist | Guide to /fluent-connect |
|
|
297
|
+
|
|
298
|
+
## Session Tracking
|
|
299
|
+
|
|
300
|
+
When invoked, log:
|
|
301
|
+
```
|
|
302
|
+
SKILL: /fluent-feature-status
|
|
303
|
+
args: [--profile PROFILE] [--filter STATUS] [--format FORMAT] [--tree]
|
|
304
|
+
outcome: completed | failed
|
|
305
|
+
features_found: count
|
|
306
|
+
features_by_status: { "IN_PROGRESS": 1, "APPROVED": 2, ... }
|
|
307
|
+
stale_count: count
|
|
308
|
+
warnings: count
|
|
309
|
+
recommendation: "next action"
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Integration with Other Skills
|
|
313
|
+
|
|
314
|
+
| Skill | Relationship |
|
|
315
|
+
|-------|-------------|
|
|
316
|
+
| `/fluent-use-case-discover` | Creates features in DISCOVERY status |
|
|
317
|
+
| `/fluent-feature-plan` | Moves features to PLANNING then APPROVED |
|
|
318
|
+
| `/fluent-feature-explain` | Sets `architecture: true` |
|
|
319
|
+
| `/fluent-archive` | Moves features to ARCHIVED |
|
|
320
|
+
| `/fluent-rollback` | May regress feature status after deployment rollback |
|
|
321
|
+
| `/fluent-session-summary` | Complementary -- session changes vs feature lifecycle |
|
|
322
|
+
| `/fluent-scope-decompose` | Can batch-create features via `--batch-features` |
|
|
323
|
+
|
|
324
|
+
## Tips
|
|
325
|
+
|
|
326
|
+
- Run this at the **start of every session** to orient yourself
|
|
327
|
+
- Use `--filter IN_PROGRESS` to focus on active work
|
|
328
|
+
- Use `--filter APPROVED` to find features ready to build
|
|
329
|
+
- The `next` field tells you exactly which skill to invoke next
|
|
330
|
+
- Combine with `/fluent-session-summary` for a complete picture
|
|
331
|
+
- Use `--tree` when onboarding to a workspace to see everything
|
|
332
|
+
- The JSON output (`--format json`) is useful for scripting
|
|
333
|
+
- Features are sorted by priority -- first row is always the most urgent
|
|
334
|
+
- STALE flag warns about features that may have been forgotten
|
|
335
|
+
- Archived features are hidden by default -- use `--filter ARCHIVED` to see them
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fluent-feedback
|
|
3
|
+
description: View, review, and promote skill execution feedback. Dashboard shows per-skill success/failure rates, recurring issues, and learnings ready for promotion. Triggers on "feedback dashboard", "show feedback", "review feedback", "promote learning", "skill feedback", "what went wrong".
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
6
|
+
argument-hint: dashboard | review <skill-name> | promote <record-id> | export [--format json|confluence]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Skill Feedback Manager
|
|
10
|
+
|
|
11
|
+
View, analyze, and promote feedback records captured during skill execution. Feedback records are written by skills after each execution (see Feedback Loop Protocol) and stored as JSONL files in `accounts/<PROFILE>/feedback/`.
|
|
12
|
+
|
|
13
|
+
## Commands
|
|
14
|
+
|
|
15
|
+
### `dashboard` (default)
|
|
16
|
+
|
|
17
|
+
Show per-skill feedback summary for the current profile.
|
|
18
|
+
|
|
19
|
+
**Steps:**
|
|
20
|
+
|
|
21
|
+
1. Determine `<PROFILE>` from the active Fluent CLI profile or ask the user
|
|
22
|
+
2. Check if `accounts/<PROFILE>/feedback/index.json` exists
|
|
23
|
+
3. If yes, read it and display summary table
|
|
24
|
+
4. If no, scan for any `.jsonl` files in `accounts/<PROFILE>/feedback/` and rebuild index
|
|
25
|
+
5. If no feedback directory exists, report "No feedback captured yet" and explain how feedback gets generated
|
|
26
|
+
|
|
27
|
+
**Output format:**
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
Skill Feedback Dashboard — <PROFILE>
|
|
31
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
32
|
+
Skill │ Total │ OK │ FAIL │ Corrected │ Top Issue
|
|
33
|
+
───────────────────────┼───────┼─────┼──────┼───────────┼──────────────────
|
|
34
|
+
workflow-builder │ 17 │ 12 │ 3 │ 2 │ Ghost categories
|
|
35
|
+
workflow-deploy │ 13 │ 8 │ 4 │ 1 │ POST vs PUT
|
|
36
|
+
settings │ 8 │ 5 │ 2 │ 1 │ Missing context
|
|
37
|
+
rule-scaffold │ 7 │ 6 │ 1 │ 0 │ —
|
|
38
|
+
|
|
39
|
+
Recurring issues (3+ occurrences):
|
|
40
|
+
1. UNUSED_CATEGORY_FOUND — 5 hits ← READY TO PROMOTE
|
|
41
|
+
2. Wrong REST method — 3 hits ← READY TO PROMOTE
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### `review <skill-name>`
|
|
45
|
+
|
|
46
|
+
Show all feedback records for a specific skill, grouped by outcome.
|
|
47
|
+
|
|
48
|
+
**Steps:**
|
|
49
|
+
|
|
50
|
+
1. Read `accounts/<PROFILE>/feedback/<skill-name>.jsonl`
|
|
51
|
+
2. Parse each line as JSON
|
|
52
|
+
3. Group by outcome: FAILURE and USER_CORRECTED first (most actionable)
|
|
53
|
+
4. For each record, show: timestamp, outcome, feature, phases summary, learnings
|
|
54
|
+
5. Highlight records with `confidence: "CONFIRMED"` that have 3+ occurrences — flag as "ready to promote"
|
|
55
|
+
6. Show user corrections prominently — these are the highest-signal feedback
|
|
56
|
+
|
|
57
|
+
**Output format per record:**
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
[2026-02-24 14:30] PARTIAL_SUCCESS — curbside-pickup (ORDER::HD)
|
|
61
|
+
Phases: pre-flight ✓ → build-rulesets ✓ → deploy ✗ (UNUSED_CATEGORY_FOUND)
|
|
62
|
+
Resolution: Added explicit category to all statuses
|
|
63
|
+
Learning: "Never use empty string for status categories" [CONFIRMED, 5 hits]
|
|
64
|
+
← READY TO PROMOTE
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### `promote <record-id>`
|
|
68
|
+
|
|
69
|
+
Promote a confirmed learning into a skill's Known Pitfalls section.
|
|
70
|
+
|
|
71
|
+
**Promotion guardrails (ALL must pass):**
|
|
72
|
+
|
|
73
|
+
1. Learning must have evidence from **3+ distinct sessions** (check `id` prefixes for different dates/times)
|
|
74
|
+
2. At least one `USER_CORRECTED` record exists for this learning, OR user explicitly says "promote this"
|
|
75
|
+
3. Learning text is **generic and portable** — not account-specific, not retailer-secret, not environment-only
|
|
76
|
+
4. If any guardrail fails: keep at `CONFIRMED`, explain why, suggest how to meet the threshold
|
|
77
|
+
|
|
78
|
+
**If guardrails pass:**
|
|
79
|
+
|
|
80
|
+
1. Read the target `SKILL.md` file for the skill referenced in the learning
|
|
81
|
+
2. Find or create the `## Known Pitfalls` section
|
|
82
|
+
3. Find or create the `<!-- feedback-promoted: managed section -->` block
|
|
83
|
+
4. Append the learning in format:
|
|
84
|
+
```
|
|
85
|
+
- **<ERROR_CODE>** — <learning text>.
|
|
86
|
+
_Source: <N> feedback records, first seen <date>, promoted <today>_
|
|
87
|
+
```
|
|
88
|
+
5. Write a promotion record to `.fluent-ai-skills/feedback/promotions.jsonl`:
|
|
89
|
+
```json
|
|
90
|
+
{"promotedAt":"<ISO>","skill":"<name>","learning":"<text>","evidence":["<id1>","<id2>","<id3>"],"promotedBy":"user","section":"Known Pitfalls"}
|
|
91
|
+
```
|
|
92
|
+
6. Update the original feedback records: set `confidence` from `CONFIRMED` to `PROMOTED`
|
|
93
|
+
|
|
94
|
+
### `export [--format json|confluence]`
|
|
95
|
+
|
|
96
|
+
Export feedback for team sharing.
|
|
97
|
+
|
|
98
|
+
**JSON format (default):** Writes all `.jsonl` files to a single `accounts/<PROFILE>/feedback/export-<date>.json` with structure:
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"profile": "<PROFILE>",
|
|
102
|
+
"exportedAt": "<ISO>",
|
|
103
|
+
"skills": {
|
|
104
|
+
"<skill-name>": [ ...records... ]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Confluence format:** Generates a wiki-markup table suitable for pasting into Confluence:
|
|
110
|
+
```
|
|
111
|
+
|| Skill || Issue || Occurrences || Confidence || Learning ||
|
|
112
|
+
| workflow-builder | UNUSED_CATEGORY_FOUND | 5 | CONFIRMED | Never use empty string for categories |
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Write to `accounts/<PROFILE>/feedback/export-<date>.wiki` or `.json`.
|
|
116
|
+
|
|
117
|
+
## Feedback Record Schema (feedback-record-v1)
|
|
118
|
+
|
|
119
|
+
Reference schema for records written by other skills. This skill reads them; other skills write them.
|
|
120
|
+
|
|
121
|
+
```jsonc
|
|
122
|
+
{
|
|
123
|
+
"$schema": "feedback-record-v1",
|
|
124
|
+
"id": "fb-<YYYYMMDD>-<HHMMSS>-<3char>", // unique, sortable
|
|
125
|
+
"timestamp": "<ISO-8601>",
|
|
126
|
+
"skill": "<skill-name>", // which skill produced this
|
|
127
|
+
"feature": "<slug>", // feature slug if applicable, null otherwise
|
|
128
|
+
"profile": "<PROFILE>",
|
|
129
|
+
"retailer": "<retailer-name>",
|
|
130
|
+
"entityType": "<ORDER|FULFILMENT|...>", // primary entity, null if N/A
|
|
131
|
+
"entitySubtype": "<HD|CC|...>", // subtype, null if N/A
|
|
132
|
+
|
|
133
|
+
"outcome": "<SUCCESS|PARTIAL_SUCCESS|FAILURE|BLOCKED|USER_CORRECTED>",
|
|
134
|
+
|
|
135
|
+
"phases": [
|
|
136
|
+
{
|
|
137
|
+
"name": "<phase-name>", // e.g., "pre-flight-check", "build-rulesets", "deploy"
|
|
138
|
+
"status": "<PASS|FAIL|SKIP>",
|
|
139
|
+
"error": "<error-code>", // only if FAIL
|
|
140
|
+
"errorDetail": "<human-readable>", // only if FAIL
|
|
141
|
+
"resolution": "<what-fixed-it>" // only if FAIL then resolved
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
|
|
145
|
+
"learnings": [
|
|
146
|
+
{
|
|
147
|
+
"type": "<GOTCHA|PATTERN|CORRECTION|WORKAROUND|CONSTRAINT>",
|
|
148
|
+
"scope": "<platform|account|feature>",
|
|
149
|
+
"skill": "<target-skill>", // which skill should learn this
|
|
150
|
+
"text": "<learning text>",
|
|
151
|
+
"confidence": "<OBSERVED|CONFIRMED|PROMOTED>",
|
|
152
|
+
"tags": ["<tag1>", "<tag2>"],
|
|
153
|
+
"relatedError": "<error-code>" // for pattern matching
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
|
|
157
|
+
"userCorrections": [
|
|
158
|
+
{
|
|
159
|
+
"what": "<what-agent-did-wrong>",
|
|
160
|
+
"correction": "<what-user-said>",
|
|
161
|
+
"impact": "<HIGH|MEDIUM|LOW>"
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
|
|
165
|
+
"tags": ["<tag1>", "<tag2>"],
|
|
166
|
+
"planRef": "<path-to-plan-if-applicable>"
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Secret redaction rules
|
|
171
|
+
|
|
172
|
+
Before writing any feedback record, redact:
|
|
173
|
+
- `accessToken`, `clientSecret`, `password`, API keys, bearer tokens
|
|
174
|
+
- Any value matching patterns: `eyJ...` (JWT), `sk-...`, `token=...`
|
|
175
|
+
|
|
176
|
+
**Keep** (needed for retrieval filtering): profile name, retailer ref, entity refs, order refs, setting names, workflow names.
|
|
177
|
+
|
|
178
|
+
## Index Schema
|
|
179
|
+
|
|
180
|
+
`accounts/<PROFILE>/feedback/index.json`:
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"$schema": "feedback-index-v1",
|
|
185
|
+
"profile": "<PROFILE>",
|
|
186
|
+
"lastUpdated": "<ISO-8601>",
|
|
187
|
+
"skills": {
|
|
188
|
+
"<skill-name>": {
|
|
189
|
+
"total": 17,
|
|
190
|
+
"success": 12,
|
|
191
|
+
"partialSuccess": 2,
|
|
192
|
+
"failure": 3,
|
|
193
|
+
"blocked": 0,
|
|
194
|
+
"userCorrected": 2,
|
|
195
|
+
"lastUpdated": "<ISO-8601>",
|
|
196
|
+
"topIssue": "UNUSED_CATEGORY_FOUND",
|
|
197
|
+
"topIssueSeverity": "HIGH"
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Rebuilding the Index
|
|
204
|
+
|
|
205
|
+
If `index.json` is missing or stale, rebuild from JSONL source files:
|
|
206
|
+
|
|
207
|
+
1. Glob `accounts/<PROFILE>/feedback/*.jsonl`
|
|
208
|
+
2. For each file, count records by outcome
|
|
209
|
+
3. For each file, find most frequent `relatedError` → `topIssue`
|
|
210
|
+
4. Write `index.json`
|
|
211
|
+
|
|
212
|
+
## No Planning Gate
|
|
213
|
+
|
|
214
|
+
This skill is read-only by default (dashboard, review, export). Only `promote` modifies files, and it has its own guardrails. No planning gate required.
|
|
215
|
+
|
|
216
|
+
## Known Pitfalls
|
|
217
|
+
<!-- feedback-promoted: managed section, updated by feedback loop -->
|
|
218
|
+
|
|
219
|
+
_(No promoted learnings yet — this section will be populated as the feedback loop matures.)_
|
|
220
|
+
|
|
221
|
+
<!-- end feedback-promoted -->
|