@jterrats/open-orchestra 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.
- package/AGENTS.md +90 -0
- package/CHANGELOG.md +104 -0
- package/CLAUDE.md +103 -0
- package/README.md +173 -22
- package/dist/assets/web-console.js +743 -0
- package/dist/autonomous-workflow.d.ts +45 -0
- package/dist/autonomous-workflow.js +386 -0
- package/dist/autonomous-workflow.js.map +1 -0
- package/dist/benchmark.d.ts +8 -0
- package/dist/benchmark.js +193 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/burndown.d.ts +3 -0
- package/dist/burndown.js +141 -0
- package/dist/burndown.js.map +1 -0
- package/dist/clarification.d.ts +6 -0
- package/dist/clarification.js +88 -0
- package/dist/clarification.js.map +1 -0
- package/dist/cli.js +221 -4
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.d.ts +5 -0
- package/dist/collaboration-flows.js +256 -0
- package/dist/collaboration-flows.js.map +1 -0
- package/dist/command-manifest.d.ts +11 -0
- package/dist/command-manifest.js +52 -0
- package/dist/command-manifest.js.map +1 -0
- package/dist/commands.d.ts +39 -0
- package/dist/commands.js +1069 -2
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -1
- package/dist/defaults.d.ts +7 -11
- package/dist/defaults.js +7 -625
- package/dist/defaults.js.map +1 -1
- package/dist/delegation-decision.d.ts +14 -0
- package/dist/delegation-decision.js +391 -0
- package/dist/delegation-decision.js.map +1 -0
- package/dist/detect-commands.d.ts +3 -0
- package/dist/detect-commands.js +28 -0
- package/dist/detect-commands.js.map +1 -0
- package/dist/diagram-validation.d.ts +36 -0
- package/dist/diagram-validation.js +118 -0
- package/dist/diagram-validation.js.map +1 -0
- package/dist/fs-utils.d.ts +2 -0
- package/dist/fs-utils.js +75 -6
- package/dist/fs-utils.js.map +1 -1
- package/dist/github.d.ts +11 -0
- package/dist/github.js +48 -0
- package/dist/github.js.map +1 -0
- package/dist/health-checks.d.ts +28 -0
- package/dist/health-checks.js +219 -0
- package/dist/health-checks.js.map +1 -0
- package/dist/health-commands.d.ts +2 -0
- package/dist/health-commands.js +18 -0
- package/dist/health-commands.js.map +1 -0
- package/dist/instruction-apply.d.ts +34 -0
- package/dist/instruction-apply.js +150 -0
- package/dist/instruction-apply.js.map +1 -0
- package/dist/instruction-blocks.d.ts +22 -0
- package/dist/instruction-blocks.js +120 -0
- package/dist/instruction-blocks.js.map +1 -0
- package/dist/instruction-imports.d.ts +12 -0
- package/dist/instruction-imports.js +45 -0
- package/dist/instruction-imports.js.map +1 -0
- package/dist/instruction-stale.d.ts +9 -0
- package/dist/instruction-stale.js +106 -0
- package/dist/instruction-stale.js.map +1 -0
- package/dist/instruction-types.d.ts +66 -0
- package/dist/instruction-types.js +2 -0
- package/dist/instruction-types.js.map +1 -0
- package/dist/instruction-updates.d.ts +4 -0
- package/dist/instruction-updates.js +5 -0
- package/dist/instruction-updates.js.map +1 -0
- package/dist/knowledge-base.d.ts +10 -0
- package/dist/knowledge-base.js +117 -0
- package/dist/knowledge-base.js.map +1 -0
- package/dist/mcp-oauth-proxy.d.ts +39 -0
- package/dist/mcp-oauth-proxy.js +80 -0
- package/dist/mcp-oauth-proxy.js.map +1 -0
- package/dist/pr-review.d.ts +20 -0
- package/dist/pr-review.js +142 -0
- package/dist/pr-review.js.map +1 -0
- package/dist/project-detection.d.ts +22 -0
- package/dist/project-detection.js +174 -0
- package/dist/project-detection.js.map +1 -0
- package/dist/prompt-registry.d.ts +56 -0
- package/dist/prompt-registry.js +163 -0
- package/dist/prompt-registry.js.map +1 -0
- package/dist/release-candidate.d.ts +41 -0
- package/dist/release-candidate.js +196 -0
- package/dist/release-candidate.js.map +1 -0
- package/dist/release-commands.d.ts +4 -0
- package/dist/release-commands.js +50 -0
- package/dist/release-commands.js.map +1 -0
- package/dist/roles/ai-support-roles.d.ts +11 -0
- package/dist/roles/ai-support-roles.js +67 -0
- package/dist/roles/ai-support-roles.js.map +1 -0
- package/dist/roles/core-roles.d.ts +11 -0
- package/dist/roles/core-roles.js +144 -0
- package/dist/roles/core-roles.js.map +1 -0
- package/dist/roles/engineering-roles.d.ts +11 -0
- package/dist/roles/engineering-roles.js +176 -0
- package/dist/roles/engineering-roles.js.map +1 -0
- package/dist/roles/governance-roles.d.ts +11 -0
- package/dist/roles/governance-roles.js +117 -0
- package/dist/roles/governance-roles.js.map +1 -0
- package/dist/roles/index.d.ts +11 -0
- package/dist/roles/index.js +17 -0
- package/dist/roles/index.js.map +1 -0
- package/dist/roles/platform-ops-roles.d.ts +11 -0
- package/dist/roles/platform-ops-roles.js +158 -0
- package/dist/roles/platform-ops-roles.js.map +1 -0
- package/dist/roles/qa-ux-roles.d.ts +11 -0
- package/dist/roles/qa-ux-roles.js +193 -0
- package/dist/roles/qa-ux-roles.js.map +1 -0
- package/dist/roles/release-ops-roles.d.ts +11 -0
- package/dist/roles/release-ops-roles.js +109 -0
- package/dist/roles/release-ops-roles.js.map +1 -0
- package/dist/runtime-adapters.d.ts +6 -0
- package/dist/runtime-adapters.js +88 -0
- package/dist/runtime-adapters.js.map +1 -0
- package/dist/runtime-bootstrap.d.ts +12 -0
- package/dist/runtime-bootstrap.js +136 -0
- package/dist/runtime-bootstrap.js.map +1 -0
- package/dist/skills.d.ts +36 -0
- package/dist/skills.js +665 -0
- package/dist/skills.js.map +1 -0
- package/dist/subagent-protocol.d.ts +41 -0
- package/dist/subagent-protocol.js +179 -0
- package/dist/subagent-protocol.js.map +1 -0
- package/dist/telemetry-consent.d.ts +24 -0
- package/dist/telemetry-consent.js +95 -0
- package/dist/telemetry-consent.js.map +1 -0
- package/dist/telemetry-export.d.ts +14 -0
- package/dist/telemetry-export.js +126 -0
- package/dist/telemetry-export.js.map +1 -0
- package/dist/telemetry-records.d.ts +3 -0
- package/dist/telemetry-records.js +96 -0
- package/dist/telemetry-records.js.map +1 -0
- package/dist/telemetry-redaction.d.ts +9 -0
- package/dist/telemetry-redaction.js +55 -0
- package/dist/telemetry-redaction.js.map +1 -0
- package/dist/telemetry-types.d.ts +52 -0
- package/dist/telemetry-types.js +2 -0
- package/dist/telemetry-types.js.map +1 -0
- package/dist/telemetry.d.ts +4 -0
- package/dist/telemetry.js +4 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +304 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validation.d.ts +3 -1
- package/dist/validation.js +28 -5
- package/dist/validation.js.map +1 -1
- package/dist/web-api.js +167 -3
- package/dist/web-api.js.map +1 -1
- package/dist/web-console.js +6 -160
- package/dist/web-console.js.map +1 -1
- package/dist/workflow-gates.js +4 -2
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-services.js +143 -67
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-templates.d.ts +10 -0
- package/dist/workflow-templates.js +141 -0
- package/dist/workflow-templates.js.map +1 -0
- package/dist/workspace-classification.d.ts +5 -0
- package/dist/workspace-classification.js +127 -0
- package/dist/workspace-classification.js.map +1 -0
- package/dist/workspace-validator.js +11 -1
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.d.ts +8 -4
- package/dist/workspace.js +111 -4
- package/dist/workspace.js.map +1 -1
- package/docs/autonomous-workflow.md +165 -0
- package/docs/benchmark.md +219 -0
- package/docs/dev-team-specialist-role-profiles.md +171 -0
- package/docs/mcp-oauth-proxy-evaluation.md +44 -0
- package/docs/multi-agent-orchestrator-backlog.md +413 -1
- package/docs/open-orchestra-dogfooding-findings.md +66 -0
- package/docs/orchestra-mvp.md +161 -3
- package/docs/runtime-adapters.md +86 -0
- package/docs/runtime-llm-flow.md +124 -0
- package/docs/setup-agents-dogfooding-findings.md +101 -0
- package/docs/skill-loading-strategy.md +114 -0
- package/docs/source-of-truth-and-agent-learning.md +83 -0
- package/package.json +9 -5
- package/rules/agent-roles.mdc +30 -0
- package/rules/ai-assisted-development.mdc +22 -0
- package/skills/agent-learning/SKILL.md +24 -0
- package/skills/agent-learning/manifest.json +40 -0
- package/skills/backlog-sync/SKILL.md +24 -0
- package/skills/backlog-sync/manifest.json +41 -0
- package/skills/diagram-export/SKILL.md +35 -0
- package/skills/diagram-export/manifest.json +40 -0
- package/skills/model-evaluation/SKILL.md +25 -0
- package/skills/model-evaluation/manifest.json +41 -0
- package/skills/playwright-evidence/SKILL.md +28 -0
- package/skills/playwright-evidence/manifest.json +46 -0
- package/skills/pr-review/SKILL.md +23 -0
- package/skills/pr-review/manifest.json +43 -0
- package/skills/prompt-registry/SKILL.md +24 -0
- package/skills/prompt-registry/manifest.json +45 -0
- package/skills/release-readiness/SKILL.md +25 -0
- package/skills/release-readiness/manifest.json +45 -0
- package/skills/source-of-truth/SKILL.md +24 -0
- package/skills/source-of-truth/manifest.json +47 -0
- package/skills/static-analysis/SKILL.md +26 -0
- package/skills/static-analysis/manifest.json +46 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Skill Loading Strategy
|
|
2
|
+
|
|
3
|
+
Open Orchestra should keep primary agent instruction files small. AGENTS.md, CLAUDE.md, Cursor rules, and ORCHESTRA.md should act as an entry point, not as the full operating manual for every capability.
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
Load detailed capability instructions only when the current task needs them, while keeping core governance rules always available.
|
|
8
|
+
|
|
9
|
+
## Core Pattern
|
|
10
|
+
|
|
11
|
+
Use a two-layer model:
|
|
12
|
+
|
|
13
|
+
- **Core instructions:** short, always-loaded rules for safety, user alignment, engineering standards, gates, and how to select skills.
|
|
14
|
+
- **Skills:** focused sub-files with task-specific procedures, examples, scripts, templates, and evidence rules.
|
|
15
|
+
|
|
16
|
+
The main files should include a compact Skill Index instead of embedding every procedure inline.
|
|
17
|
+
|
|
18
|
+
## Skill Manifest
|
|
19
|
+
|
|
20
|
+
Each skill should expose metadata that allows a parent agent or middleware to decide whether to load it.
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"id": "static-analysis",
|
|
25
|
+
"name": "Static Analysis",
|
|
26
|
+
"summary": "Run and interpret local quality, type, dependency, secret, and security checks.",
|
|
27
|
+
"triggers": ["lint", "typecheck", "secret", "sast", "precommit", "dependency"],
|
|
28
|
+
"roles": ["developer", "tech_lead", "qa", "sdet", "security", "devops"],
|
|
29
|
+
"capabilities": ["quality-gate", "security-review", "commit-readiness"],
|
|
30
|
+
"riskAreas": ["security", "release", "maintainability"],
|
|
31
|
+
"entry": "skills/static-analysis/SKILL.md",
|
|
32
|
+
"assets": ["skills/static-analysis/checklist.md"],
|
|
33
|
+
"evidence": ["command", "report"],
|
|
34
|
+
"sourceGroups": ["codebase", "quality-security", "agent-memory"],
|
|
35
|
+
"loadBudget": "normal"
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Source Selection
|
|
40
|
+
|
|
41
|
+
Before loading full skill instructions, the parent agent should select authoritative source groups for the task. The source catalog lives in `.agent-workflow/source-of-truth.json` and is documented in [source-of-truth-and-agent-learning.md](source-of-truth-and-agent-learning.md).
|
|
42
|
+
|
|
43
|
+
Skill manifests should be able to declare `sourceGroups` so the orchestrator can load the right local files, docs, official vendor references, and prior lessons without pulling unrelated context.
|
|
44
|
+
|
|
45
|
+
## Loading Flow
|
|
46
|
+
|
|
47
|
+
1. Parse the task brief into goal, touched paths, impacted systems, requested outputs, risk areas, and likely roles.
|
|
48
|
+
2. Activate roles from the role catalog.
|
|
49
|
+
3. Match task signals against skill manifests by triggers, paths, roles, capabilities, and risk areas.
|
|
50
|
+
4. Load only the selected skill summaries first.
|
|
51
|
+
5. Load the full `SKILL.md` only when the skill is needed for execution or review.
|
|
52
|
+
6. Load matching source-of-truth entries and recent relevant lessons for the selected skills.
|
|
53
|
+
7. Load skill assets, templates, scripts, or examples only at the point of use.
|
|
54
|
+
8. Record selected skills and source groups in task context, handoffs, evidence, and final summary.
|
|
55
|
+
|
|
56
|
+
## Built-in Skill Candidates
|
|
57
|
+
|
|
58
|
+
- `prompt-registry`: read and update `.generated-prompts/` registers for substantial AI-generated artifacts.
|
|
59
|
+
- `diagram-export`: generate, validate, and export architecture or workflow diagrams.
|
|
60
|
+
- `static-analysis`: run local quality, typing, SAST, dependency, and secret checks.
|
|
61
|
+
- `pr-review`: produce review findings, PR summary, risks, rollout notes, and missing-test gaps.
|
|
62
|
+
- `playwright-evidence`: plan browser automation and attach screenshots, traces, videos, and reports.
|
|
63
|
+
- `backlog-sync`: keep GitHub issues, local stories, and workflow tasks aligned.
|
|
64
|
+
- `release-readiness`: validate gates, rollback, observability, support, and customer-impact evidence.
|
|
65
|
+
- `model-evaluation`: run prompt/model/provider-routing evaluations and compare outputs.
|
|
66
|
+
- `source-of-truth`: select authoritative project, vendor, and workflow sources before acting.
|
|
67
|
+
- `agent-learning`: record reusable failure lessons and promote repeated lessons into skills or rules.
|
|
68
|
+
|
|
69
|
+
## Fallback for LLMs Without Native Skills
|
|
70
|
+
|
|
71
|
+
If an LLM platform cannot load skills dynamically, Open Orchestra should provide middleware behavior:
|
|
72
|
+
|
|
73
|
+
- A parent orchestrator reads the manifest and selects skills.
|
|
74
|
+
- The orchestrator injects only the selected skill text into the child agent prompt.
|
|
75
|
+
- The orchestrator keeps full skill content out of the base system prompt.
|
|
76
|
+
- The loaded skill IDs are written to `.agent-workflow/` events and handoff artifacts.
|
|
77
|
+
|
|
78
|
+
This keeps the project portable across Cursor, Claude, Codex, VS Code, GitHub Actions, and future web clients.
|
|
79
|
+
|
|
80
|
+
## Main File Budget
|
|
81
|
+
|
|
82
|
+
Primary MD files should stay bounded:
|
|
83
|
+
|
|
84
|
+
- Keep role and skill catalogs as indexes with links.
|
|
85
|
+
- Move long procedures into skills or docs.
|
|
86
|
+
- Prefer activation criteria over exhaustive instructions.
|
|
87
|
+
- Keep examples inside the skill that owns them.
|
|
88
|
+
- Review file size when a main MD crosses a practical context threshold.
|
|
89
|
+
|
|
90
|
+
## Implemented CLI Surface
|
|
91
|
+
|
|
92
|
+
- `orchestra skills list` lists the canonical built-in skill catalog.
|
|
93
|
+
- `orchestra skills plan --task <id>` selects skills from task text, owner role, paths, risks, and source groups.
|
|
94
|
+
- `orchestra skills render --target generic|claude|cursor|codex|vscode --task <id>` renders selected skills for a runtime or IDE.
|
|
95
|
+
- `orchestra skills render --target <target> --skills <csv>` renders explicit skills when no task exists.
|
|
96
|
+
- `orchestra skills validate` validates canonical skills against portable `manifest.json` and `SKILL.md` files.
|
|
97
|
+
- `orchestra sources list` exposes the source-of-truth catalog.
|
|
98
|
+
- `orchestra lessons list/add/promote` manages local agent learning and promotes repeated lessons into reviewable artifacts.
|
|
99
|
+
|
|
100
|
+
The CLI render path is the universal fallback for environments without native skill support.
|
|
101
|
+
|
|
102
|
+
## Generated Markdown Update Policy
|
|
103
|
+
|
|
104
|
+
Generated `.md`, `.mdc`, and agent instruction files should be managed through explicit ownership rules instead of blind rewrites.
|
|
105
|
+
|
|
106
|
+
- Use generated block markers such as `<!-- open-orchestra:start skill-index -->` and `<!-- open-orchestra:end skill-index -->` for sections the CLI owns.
|
|
107
|
+
- Keep user-authored sections outside managed blocks and never overwrite them during generation.
|
|
108
|
+
- Store generator metadata: generator name, version, source manifest, target file, managed block id, and last rendered hash.
|
|
109
|
+
- Default to idempotent updates: rerunning the generator without source changes should produce no diff.
|
|
110
|
+
- Provide `--dry-run` and `--check` modes before writing generated docs.
|
|
111
|
+
- If a generated section was manually edited, detect drift and require explicit `--force` or emit a conflict.
|
|
112
|
+
- Promote stable runtime lessons or prompts into versioned docs/rules/skills only through reviewed generated blocks.
|
|
113
|
+
|
|
114
|
+
This keeps Claude, Cursor, Codex, VS Code, and generic CLI outputs synchronized without turning primary instruction files into unbounded generated blobs.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Source of Truth and Agent Learning
|
|
2
|
+
|
|
3
|
+
Open Orchestra should make context provenance explicit. Agents and subagents should know where to look before acting, and they should record repeatable failure lessons after an action fails.
|
|
4
|
+
|
|
5
|
+
## Source of Truth Catalog
|
|
6
|
+
|
|
7
|
+
The source catalog answers: which document, file, or external reference is authoritative for a decision?
|
|
8
|
+
|
|
9
|
+
Default source groups:
|
|
10
|
+
|
|
11
|
+
- `project-instructions`: `AGENTS.md`, `ORCHESTRA.md`, `CLAUDE.md`, Cursor rules, and local agent rules.
|
|
12
|
+
- `product-backlog`: GitHub issues, local backlog docs, acceptance criteria, user stories, and task graph state.
|
|
13
|
+
- `architecture`: ADRs, architecture docs, service boundaries, diagrams, domain models, and integration contracts.
|
|
14
|
+
- `codebase`: source files, tests, package manifests, config, generated types, and local command contracts.
|
|
15
|
+
- `quality-security`: static analysis config, pre-commit hooks, SAST reports, dependency scans, secret scans, QA plans, and Playwright evidence.
|
|
16
|
+
- `devops-runtime`: CI/CD workflows, deployment docs, IaC, observability, rollback, incident, and release artifacts.
|
|
17
|
+
- `vendor-docs`: official provider, framework, package, cloud, and browser documentation.
|
|
18
|
+
- `agent-memory`: decisions, handoffs, evidence, prompt registry entries, and lessons learned.
|
|
19
|
+
|
|
20
|
+
Rules:
|
|
21
|
+
|
|
22
|
+
- Prefer local project sources before generic external guidance.
|
|
23
|
+
- Prefer primary vendor documentation over blogs, examples, or generated answers.
|
|
24
|
+
- For current or fast-changing APIs, verify against official docs before implementation.
|
|
25
|
+
- Record which source group justified a material decision in decisions, handoffs, evidence, or final summaries.
|
|
26
|
+
- If sources conflict, stop and record the conflict instead of silently choosing one.
|
|
27
|
+
|
|
28
|
+
## Versioning Policy
|
|
29
|
+
|
|
30
|
+
- Track the schema, documentation, examples, and promoted rules or skills.
|
|
31
|
+
- Do not track the live `.agent-workflow/agent-lessons.jsonl` file by default; it is local runtime state and can contain machine-specific commands, timestamps, paths, or sensitive context.
|
|
32
|
+
- Do not track the live `.generated-prompts/` directory by default; prompt registers are generated local runtime memory unless a project explicitly promotes selected entries into versioned docs, rules, or skills.
|
|
33
|
+
- Track `source-of-truth.json` only when a project intentionally wants shared authoritative sources. Otherwise regenerate it through `orchestra init` and project config.
|
|
34
|
+
- Promote repeated lessons into versioned skills or rules after review.
|
|
35
|
+
|
|
36
|
+
## Agent Lessons Log
|
|
37
|
+
|
|
38
|
+
The lessons log captures operational mistakes that an agent can avoid next time. It is not a blame log; it is a repeat-prevention mechanism.
|
|
39
|
+
|
|
40
|
+
Store lessons as JSONL in `.agent-workflow/agent-lessons.jsonl`.
|
|
41
|
+
|
|
42
|
+
Example entry:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"timestamp": "2026-05-03T00:00:00.000Z",
|
|
47
|
+
"taskId": "SKILL-001",
|
|
48
|
+
"actor": "parent",
|
|
49
|
+
"operation": "edit-doc-with-node-script",
|
|
50
|
+
"failedAction": "embedded Markdown fences inside a JavaScript template literal",
|
|
51
|
+
"errorSignature": "SyntaxError: Unexpected identifier",
|
|
52
|
+
"rootCause": "unescaped backticks in generated script content",
|
|
53
|
+
"fix": "build long Markdown content as an array of lines or escape fences explicitly",
|
|
54
|
+
"prevention": "before running generated edit scripts, scan for nested template literals and Markdown fences",
|
|
55
|
+
"appliesTo": ["node", "markdown", "code-generation"],
|
|
56
|
+
"verifiedBy": ["reran edit script successfully"]
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Record a lesson when:
|
|
61
|
+
|
|
62
|
+
- The same class of failure is likely to happen again.
|
|
63
|
+
- A command failed because of quoting, escaping, shell behavior, permissions, cwd, missing dependency, or stale assumption.
|
|
64
|
+
- A test failure revealed a reusable project convention.
|
|
65
|
+
- A provider, tool, or runtime behaved differently than expected.
|
|
66
|
+
|
|
67
|
+
Do not record a lesson for:
|
|
68
|
+
|
|
69
|
+
- One-off typos with no reusable prevention value.
|
|
70
|
+
- Secrets, raw credentials, private customer data, or sensitive prompt/response content.
|
|
71
|
+
- Failures already covered by a current lesson unless the prevention changed.
|
|
72
|
+
|
|
73
|
+
## Learning Flow
|
|
74
|
+
|
|
75
|
+
1. Before acting, select relevant source groups and load only the necessary files or docs.
|
|
76
|
+
2. Before repeating a risky operation, search `.agent-workflow/agent-lessons.jsonl` for matching operation, error signature, or tool.
|
|
77
|
+
3. After a failure, classify whether it is reusable knowledge.
|
|
78
|
+
4. If reusable, append one JSONL entry with root cause, fix, prevention, and verification.
|
|
79
|
+
5. If the same lesson appears repeatedly, promote it into the relevant skill or project rule.
|
|
80
|
+
|
|
81
|
+
## Relationship to Skills
|
|
82
|
+
|
|
83
|
+
Skills should declare which source groups they use and which lessons are relevant. The orchestrator should load lessons only for the selected skills and current operation, not the full historical log.
|
package/package.json
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jterrats/open-orchestra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"orchestra": "bin/orchestra.js"
|
|
7
7
|
},
|
|
8
8
|
"scripts": {
|
|
9
|
-
"build": "tsc",
|
|
9
|
+
"build": "tsc && npm run build:web",
|
|
10
10
|
"typecheck": "tsc --noEmit",
|
|
11
11
|
"test": "npm run build && node --test test/**/*.js extensions/**/*.test.cjs",
|
|
12
|
-
"lint": "eslint . && prettier --check \"{bin,scripts,test}/**/*.js\" \"extensions/**/*.{cjs,json,md}\" \"src/**/*.ts\" \"*.json\"",
|
|
13
|
-
"format": "prettier --write \"{bin,scripts,test}/**/*.js\" \"extensions/**/*.{cjs,json,md}\" \"src/**/*.ts\" \"*.json\"",
|
|
12
|
+
"lint": "eslint . && prettier --check \"{bin,scripts,test,src}/**/*.js\" \"extensions/**/*.{cjs,json,md}\" \"src/**/*.ts\" \"*.json\"",
|
|
13
|
+
"format": "prettier --write \"{bin,scripts,test,src}/**/*.js\" \"extensions/**/*.{cjs,json,md}\" \"src/**/*.ts\" \"*.json\"",
|
|
14
14
|
"secret-scan": "node scripts/secret-scan.js",
|
|
15
15
|
"validate:workflow": "sh -c 'test ! -d .agent-workflow || (npm run build && node bin/orchestra.js validate)'",
|
|
16
16
|
"precommit": "npm run lint && npm run typecheck && npm run secret-scan && npm test && npm run validate:workflow",
|
|
17
|
-
"hooks:install": "git config core.hooksPath .githooks"
|
|
17
|
+
"hooks:install": "git config core.hooksPath .githooks",
|
|
18
|
+
"build:web": "esbuild src/web-console-client.js --bundle --format=esm --platform=browser --target=es2022 --outfile=dist/assets/web-console.js"
|
|
18
19
|
},
|
|
19
20
|
"engines": {
|
|
20
21
|
"node": ">=22"
|
|
@@ -22,6 +23,7 @@
|
|
|
22
23
|
"devDependencies": {
|
|
23
24
|
"@eslint/js": "^10.0.1",
|
|
24
25
|
"@types/node": "^25.6.0",
|
|
26
|
+
"esbuild": "^0.28.0",
|
|
25
27
|
"eslint": "^10.2.1",
|
|
26
28
|
"prettier": "^3.8.3",
|
|
27
29
|
"typescript": "^6.0.3",
|
|
@@ -45,8 +47,10 @@
|
|
|
45
47
|
"dist/",
|
|
46
48
|
"rules/",
|
|
47
49
|
"docs/",
|
|
50
|
+
"skills/",
|
|
48
51
|
"AGENTS.md",
|
|
49
52
|
"CLAUDE.md",
|
|
53
|
+
"CHANGELOG.md",
|
|
50
54
|
"README.md",
|
|
51
55
|
"package.json"
|
|
52
56
|
],
|
package/rules/agent-roles.mdc
CHANGED
|
@@ -39,16 +39,41 @@ Use roles to force complete thinking, not to create silos. A single agent may co
|
|
|
39
39
|
- Does not start coding until acceptance criteria and technical boundaries are clear enough.
|
|
40
40
|
- Confirms the agreed implementation approach before editing files, except for trivial mechanical changes.
|
|
41
41
|
|
|
42
|
+
## Frontend Specialist
|
|
43
|
+
- Owns browser behavior, component architecture, responsive UI, accessibility implementation, client performance, and visual regression risk.
|
|
44
|
+
- Reviews user-facing web changes against mobile-first flows, WCAG-oriented checks, and Playwright-visible behavior.
|
|
45
|
+
- Blocks frontend changes that cannot be verified in target browsers or viewports.
|
|
46
|
+
|
|
47
|
+
## Backend Specialist
|
|
48
|
+
- Owns service boundaries, API contracts, domain services, persistence integration, concurrency, and failure modes.
|
|
49
|
+
- Reviews backend changes for secure coding, observability, idempotency, retries, data integrity, and server-side tests.
|
|
50
|
+
- Blocks backend changes with unclear contracts, untested failure modes, or unsafe data handling.
|
|
51
|
+
|
|
52
|
+
## Mobile Specialist
|
|
53
|
+
- Owns mobile UX, device compatibility, offline behavior, permissions, native or hybrid runtime constraints, and store readiness.
|
|
54
|
+
- Reviews mobile changes with device evidence instead of relying only on desktop responsive checks.
|
|
55
|
+
- Blocks mobile releases without device matrix, runtime constraints, or store readiness evidence when applicable.
|
|
56
|
+
|
|
42
57
|
## QA
|
|
43
58
|
- Owns verification strategy, test coverage, regression risk, and release confidence.
|
|
44
59
|
- Defines happy paths, failure paths, boundary cases, and non-functional checks.
|
|
45
60
|
- Challenges work that has implementation but no credible test plan.
|
|
46
61
|
|
|
62
|
+
## SDET / Test Automation Engineer
|
|
63
|
+
- Owns automated test architecture, Playwright fixtures, page objects, resilient locators, and CI test reliability.
|
|
64
|
+
- Converts QA plans and acceptance criteria into repeatable smoke, regression, and evidence-producing tests.
|
|
65
|
+
- Blocks automation-heavy releases when tests are brittle, unisolated, or missing traceable evidence.
|
|
66
|
+
|
|
47
67
|
## DevOps
|
|
48
68
|
- Owns deployment, CI/CD, observability, runtime configuration, rollback, and operational readiness.
|
|
49
69
|
- Verifies environment segregation, infrastructure as code, migrations, secrets, and runbooks.
|
|
50
70
|
- Blocks releases that cannot be deployed, monitored, rolled back, or supported.
|
|
51
71
|
|
|
72
|
+
## Platform Engineer
|
|
73
|
+
- Owns internal developer platforms, golden paths, reusable templates, self-service workflows, and platform guardrails.
|
|
74
|
+
- Treats developer experience as a product while preserving security, compliance, cost visibility, and operational control.
|
|
75
|
+
- Blocks cross-repo platform changes without template validation, adoption notes, or self-service smoke evidence.
|
|
76
|
+
|
|
52
77
|
## Security
|
|
53
78
|
- Owns threat modeling, abuse cases, data classification, identity, secrets, and dependency risk.
|
|
54
79
|
- Reviews authentication, authorization, input handling, logging, encryption, and third-party exposure.
|
|
@@ -89,6 +114,11 @@ Use roles to force complete thinking, not to create silos. A single agent may co
|
|
|
89
114
|
- Reviews user-facing changes for diagnosability, help text, recovery paths, and support escalation needs.
|
|
90
115
|
- Feeds production incidents, tickets, and user pain back into Product Owner and QA workflows.
|
|
91
116
|
|
|
117
|
+
## AI Evaluation / Prompt Quality Engineer
|
|
118
|
+
- Owns eval objectives, datasets, rubrics, prompt regression checks, model comparisons, and LLM behavior evidence.
|
|
119
|
+
- Treats prompt, model routing, and provider fallback changes as testable product behavior.
|
|
120
|
+
- Blocks AI behavior changes that rely on subjective review without eval cases, scoring rationale, or accepted residual risk.
|
|
121
|
+
|
|
92
122
|
## Compliance / Privacy
|
|
93
123
|
- Owns regulatory requirements, privacy obligations, retention, consent, auditability, and data processing risk.
|
|
94
124
|
- Reviews PII, restricted data, data residency, retention policies, access logs, consent, and third-party processors.
|
|
@@ -29,3 +29,25 @@ AI-generated work must meet the same engineering bar as human-written work. Spee
|
|
|
29
29
|
- Discuss the approach with the user before non-trivial AI-assisted implementation.
|
|
30
30
|
- Explain trade-offs clearly and identify risks introduced by generated code.
|
|
31
31
|
- If generated code reveals a better or riskier path than agreed, pause and realign before continuing.
|
|
32
|
+
|
|
33
|
+
## Prompt Registry
|
|
34
|
+
|
|
35
|
+
- Use `.generated-prompts/` as the durable prompt register for generated or substantially changed artifacts.
|
|
36
|
+
- Before creating or substantially changing an artifact, read the relevant register file to preserve conventions, constraints, decisions, and known risks.
|
|
37
|
+
- After substantial changes, add or update one entry for the artifact with task, active role, key decisions, evidence, and the final prompt or a concise prompt summary.
|
|
38
|
+
- Keep only the latest prompt in each entry; rely on git history for prior versions. Do not update entries for typos, formatting-only edits, or single-line mechanical fixes.
|
|
39
|
+
|
|
40
|
+
## Skill Loading
|
|
41
|
+
|
|
42
|
+
- Keep primary agent instruction files as short indexes plus non-negotiable rules.
|
|
43
|
+
- Load detailed skills only when task signals, active roles, touched paths, or risk areas require them.
|
|
44
|
+
- Prefer skill summaries first; load full skill instructions, assets, scripts, and examples only at execution time.
|
|
45
|
+
- Record selected skills in task context, handoffs, evidence, and final summaries when they materially shaped the work.
|
|
46
|
+
|
|
47
|
+
## Source of Truth and Learning
|
|
48
|
+
|
|
49
|
+
- Select authoritative source groups before acting: project instructions, backlog, architecture, codebase, quality/security, DevOps/runtime, vendor docs, and agent memory.
|
|
50
|
+
- Prefer local project sources first and official vendor documentation for current APIs, frameworks, cloud services, providers, and tools.
|
|
51
|
+
- When an action fails in a reusable way, record the lesson in `.agent-workflow/agent-lessons.jsonl` with operation, error signature, root cause, fix, prevention, and verification.
|
|
52
|
+
- Before repeating risky operations, search prior lessons for matching tool, command, error signature, or operation.
|
|
53
|
+
- Promote repeated lessons into the relevant skill or rule instead of letting agents rediscover the same failure.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Agent Learning
|
|
2
|
+
|
|
3
|
+
Record reusable failure lessons and promote repeated lessons into skills or rules.
|
|
4
|
+
|
|
5
|
+
## When To Load
|
|
6
|
+
|
|
7
|
+
- Trigger: `failure`
|
|
8
|
+
- Trigger: `failed`
|
|
9
|
+
- Trigger: `error`
|
|
10
|
+
- Trigger: `syntax`
|
|
11
|
+
- Trigger: `escaping`
|
|
12
|
+
- Trigger: `permission`
|
|
13
|
+
- Trigger: `lesson`
|
|
14
|
+
- Trigger: `learn`
|
|
15
|
+
|
|
16
|
+
## Procedure
|
|
17
|
+
|
|
18
|
+
- Search relevant lessons before repeating risky operations.
|
|
19
|
+
- After reusable failures, record operation, error signature, root cause, fix, prevention, and verification.
|
|
20
|
+
- Promote repeated lessons into versioned skills or rules after review.
|
|
21
|
+
|
|
22
|
+
## Evidence
|
|
23
|
+
|
|
24
|
+
- `file`
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "agent-learning",
|
|
3
|
+
"name": "Agent Learning",
|
|
4
|
+
"summary": "Record reusable failure lessons and promote repeated lessons into skills or rules.",
|
|
5
|
+
"triggers": [
|
|
6
|
+
"failure",
|
|
7
|
+
"failed",
|
|
8
|
+
"error",
|
|
9
|
+
"syntax",
|
|
10
|
+
"escaping",
|
|
11
|
+
"permission",
|
|
12
|
+
"lesson",
|
|
13
|
+
"learn"
|
|
14
|
+
],
|
|
15
|
+
"roles": [
|
|
16
|
+
"parent",
|
|
17
|
+
"context_curator",
|
|
18
|
+
"toolsmith",
|
|
19
|
+
"developer",
|
|
20
|
+
"qa"
|
|
21
|
+
],
|
|
22
|
+
"capabilities": [
|
|
23
|
+
"failure-learning",
|
|
24
|
+
"memory-hygiene",
|
|
25
|
+
"repeat-prevention"
|
|
26
|
+
],
|
|
27
|
+
"riskAreas": [
|
|
28
|
+
"maintainability",
|
|
29
|
+
"governance"
|
|
30
|
+
],
|
|
31
|
+
"sourceGroups": [
|
|
32
|
+
"agent-memory",
|
|
33
|
+
"codebase"
|
|
34
|
+
],
|
|
35
|
+
"evidence": [
|
|
36
|
+
"file"
|
|
37
|
+
],
|
|
38
|
+
"loadBudget": "small",
|
|
39
|
+
"entry": "skills/agent-learning/SKILL.md"
|
|
40
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Backlog Sync
|
|
2
|
+
|
|
3
|
+
Keep GitHub issues, local stories, and workflow tasks aligned.
|
|
4
|
+
|
|
5
|
+
## When To Load
|
|
6
|
+
|
|
7
|
+
- Trigger: `backlog`
|
|
8
|
+
- Trigger: `issue`
|
|
9
|
+
- Trigger: `story`
|
|
10
|
+
- Trigger: `epic`
|
|
11
|
+
- Trigger: `github`
|
|
12
|
+
- Trigger: `acceptance criteria`
|
|
13
|
+
- Trigger: `refine`
|
|
14
|
+
|
|
15
|
+
## Procedure
|
|
16
|
+
|
|
17
|
+
- Confirm backlog IDs and acceptance criteria before implementation.
|
|
18
|
+
- Keep local tasks, docs, and GitHub issues aligned when one changes.
|
|
19
|
+
- Surface missing refinement as a blocker instead of guessing scope.
|
|
20
|
+
|
|
21
|
+
## Evidence
|
|
22
|
+
|
|
23
|
+
- `file`
|
|
24
|
+
- `report`
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "backlog-sync",
|
|
3
|
+
"name": "Backlog Sync",
|
|
4
|
+
"summary": "Keep GitHub issues, local stories, and workflow tasks aligned.",
|
|
5
|
+
"triggers": [
|
|
6
|
+
"backlog",
|
|
7
|
+
"issue",
|
|
8
|
+
"story",
|
|
9
|
+
"epic",
|
|
10
|
+
"github",
|
|
11
|
+
"acceptance criteria",
|
|
12
|
+
"refine"
|
|
13
|
+
],
|
|
14
|
+
"roles": [
|
|
15
|
+
"product_manager",
|
|
16
|
+
"product_owner",
|
|
17
|
+
"business_analyst",
|
|
18
|
+
"planner",
|
|
19
|
+
"parent"
|
|
20
|
+
],
|
|
21
|
+
"capabilities": [
|
|
22
|
+
"backlog-management",
|
|
23
|
+
"story-refinement",
|
|
24
|
+
"scope-control"
|
|
25
|
+
],
|
|
26
|
+
"riskAreas": [
|
|
27
|
+
"governance",
|
|
28
|
+
"scope"
|
|
29
|
+
],
|
|
30
|
+
"sourceGroups": [
|
|
31
|
+
"product-backlog",
|
|
32
|
+
"project-instructions",
|
|
33
|
+
"agent-memory"
|
|
34
|
+
],
|
|
35
|
+
"evidence": [
|
|
36
|
+
"file",
|
|
37
|
+
"report"
|
|
38
|
+
],
|
|
39
|
+
"loadBudget": "small",
|
|
40
|
+
"entry": "skills/backlog-sync/SKILL.md"
|
|
41
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Diagram Export
|
|
2
|
+
|
|
3
|
+
Create, validate, and export architecture, workflow, and sequence diagrams.
|
|
4
|
+
|
|
5
|
+
## When To Load
|
|
6
|
+
|
|
7
|
+
- Trigger: `diagram`
|
|
8
|
+
- Trigger: `mermaid`
|
|
9
|
+
- Trigger: `architecture`
|
|
10
|
+
- Trigger: `flow`
|
|
11
|
+
- Trigger: `sequence`
|
|
12
|
+
- Trigger: `draw.io`
|
|
13
|
+
- Trigger: `lucid`
|
|
14
|
+
|
|
15
|
+
## Procedure
|
|
16
|
+
|
|
17
|
+
- Identify the diagram purpose and authoritative architecture sources before drawing.
|
|
18
|
+
- Choose the diagram style from the decision matrix before drafting.
|
|
19
|
+
- Prefer text-native diagrams such as Mermaid unless the project requires another format.
|
|
20
|
+
- Run `orchestra diagrams lint --file <diagram.mmd>` for lint-only validation before sharing Mermaid diagrams.
|
|
21
|
+
- Attach evidence with `orchestra diagrams lint --file <diagram.mmd> --task <task-id>` when the diagram supports workflow delivery.
|
|
22
|
+
- If `mmdc` is missing, report the install guidance instead of pretending validation passed.
|
|
23
|
+
|
|
24
|
+
## Decision Matrix
|
|
25
|
+
|
|
26
|
+
- Architecture boundary or component ownership: C4/container or component diagram.
|
|
27
|
+
- User, business, or agent workflow: flowchart or state diagram.
|
|
28
|
+
- Service/API/message exchange: sequence diagram.
|
|
29
|
+
- Data ownership or relationships: entity relationship diagram.
|
|
30
|
+
- Runtime topology, infrastructure, or deployment: deployment or infrastructure diagram.
|
|
31
|
+
|
|
32
|
+
## Evidence
|
|
33
|
+
|
|
34
|
+
- `file`
|
|
35
|
+
- `report`
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "diagram-export",
|
|
3
|
+
"name": "Diagram Export",
|
|
4
|
+
"summary": "Create, validate, and export architecture, workflow, and sequence diagrams.",
|
|
5
|
+
"triggers": [
|
|
6
|
+
"diagram",
|
|
7
|
+
"mermaid",
|
|
8
|
+
"architecture",
|
|
9
|
+
"flow",
|
|
10
|
+
"sequence",
|
|
11
|
+
"draw.io",
|
|
12
|
+
"lucid"
|
|
13
|
+
],
|
|
14
|
+
"roles": [
|
|
15
|
+
"architect",
|
|
16
|
+
"business_analyst",
|
|
17
|
+
"product_manager",
|
|
18
|
+
"tech_lead",
|
|
19
|
+
"technical_writer"
|
|
20
|
+
],
|
|
21
|
+
"capabilities": [
|
|
22
|
+
"diagramming",
|
|
23
|
+
"architecture-communication"
|
|
24
|
+
],
|
|
25
|
+
"riskAreas": [
|
|
26
|
+
"architecture",
|
|
27
|
+
"documentation"
|
|
28
|
+
],
|
|
29
|
+
"sourceGroups": [
|
|
30
|
+
"architecture",
|
|
31
|
+
"product-backlog",
|
|
32
|
+
"agent-memory"
|
|
33
|
+
],
|
|
34
|
+
"evidence": [
|
|
35
|
+
"file",
|
|
36
|
+
"report"
|
|
37
|
+
],
|
|
38
|
+
"loadBudget": "normal",
|
|
39
|
+
"entry": "skills/diagram-export/SKILL.md"
|
|
40
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Model Evaluation
|
|
2
|
+
|
|
3
|
+
Run prompt, model, provider-routing, fallback, and rubric evaluations.
|
|
4
|
+
|
|
5
|
+
## When To Load
|
|
6
|
+
|
|
7
|
+
- Trigger: `model`
|
|
8
|
+
- Trigger: `llm`
|
|
9
|
+
- Trigger: `prompt`
|
|
10
|
+
- Trigger: `provider`
|
|
11
|
+
- Trigger: `fallback`
|
|
12
|
+
- Trigger: `eval`
|
|
13
|
+
- Trigger: `rubric`
|
|
14
|
+
- Trigger: `routing`
|
|
15
|
+
|
|
16
|
+
## Procedure
|
|
17
|
+
|
|
18
|
+
- Define eval objectives, cases, rubric, and expected behavior before changing prompts or routing.
|
|
19
|
+
- Compare model/provider behavior for material changes and record disagreements.
|
|
20
|
+
- Avoid storing raw sensitive prompts or responses in provenance artifacts.
|
|
21
|
+
|
|
22
|
+
## Evidence
|
|
23
|
+
|
|
24
|
+
- `report`
|
|
25
|
+
- `file`
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "model-evaluation",
|
|
3
|
+
"name": "Model Evaluation",
|
|
4
|
+
"summary": "Run prompt, model, provider-routing, fallback, and rubric evaluations.",
|
|
5
|
+
"triggers": [
|
|
6
|
+
"model",
|
|
7
|
+
"llm",
|
|
8
|
+
"prompt",
|
|
9
|
+
"provider",
|
|
10
|
+
"fallback",
|
|
11
|
+
"eval",
|
|
12
|
+
"rubric",
|
|
13
|
+
"routing"
|
|
14
|
+
],
|
|
15
|
+
"roles": [
|
|
16
|
+
"ai_evaluation_engineer",
|
|
17
|
+
"toolsmith",
|
|
18
|
+
"architect",
|
|
19
|
+
"parent"
|
|
20
|
+
],
|
|
21
|
+
"capabilities": [
|
|
22
|
+
"llm-evaluation",
|
|
23
|
+
"provider-routing",
|
|
24
|
+
"prompt-quality"
|
|
25
|
+
],
|
|
26
|
+
"riskAreas": [
|
|
27
|
+
"governance",
|
|
28
|
+
"quality"
|
|
29
|
+
],
|
|
30
|
+
"sourceGroups": [
|
|
31
|
+
"vendor-docs",
|
|
32
|
+
"agent-memory",
|
|
33
|
+
"quality-security"
|
|
34
|
+
],
|
|
35
|
+
"evidence": [
|
|
36
|
+
"report",
|
|
37
|
+
"file"
|
|
38
|
+
],
|
|
39
|
+
"loadBudget": "normal",
|
|
40
|
+
"entry": "skills/model-evaluation/SKILL.md"
|
|
41
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Playwright Evidence
|
|
2
|
+
|
|
3
|
+
Plan browser automation and attach screenshots, traces, videos, and reports.
|
|
4
|
+
|
|
5
|
+
## When To Load
|
|
6
|
+
|
|
7
|
+
- Trigger: `playwright`
|
|
8
|
+
- Trigger: `browser`
|
|
9
|
+
- Trigger: `e2e`
|
|
10
|
+
- Trigger: `screenshot`
|
|
11
|
+
- Trigger: `trace`
|
|
12
|
+
- Trigger: `video`
|
|
13
|
+
- Trigger: `responsive`
|
|
14
|
+
- Trigger: `web`
|
|
15
|
+
- Trigger: `ui`
|
|
16
|
+
|
|
17
|
+
## Procedure
|
|
18
|
+
|
|
19
|
+
- Plan user-value scenarios from acceptance criteria before writing tests.
|
|
20
|
+
- Use resilient locators and page objects for repeated flows.
|
|
21
|
+
- Attach screenshots, traces, videos, or reports as evidence for release decisions.
|
|
22
|
+
|
|
23
|
+
## Evidence
|
|
24
|
+
|
|
25
|
+
- `screenshot`
|
|
26
|
+
- `trace`
|
|
27
|
+
- `video`
|
|
28
|
+
- `report`
|