showdar-skills 0.10.0 → 0.12.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/CHANGELOG.md +30 -0
- package/README.md +120 -13
- package/bin/showdar.js +40 -3
- package/package.json +1 -1
- package/profiles/full.json +1 -1
- package/profiles/insurance.json +1 -0
- package/router/conflicts.yaml +8 -0
- package/router/skill-map.yaml +10 -1
- package/router/triggers.yaml +4 -0
- package/skills/showdar-git/SKILL.md +25 -1
- package/skills/showdar-insurance-domain/SKILL.md +132 -0
- package/skills/showdar-insurance-domain/references/concepts.md +23 -0
- package/skills/showdar-insurance-domain/references/glossary.md +70 -0
- package/skills/showdar-insurance-domain/references/source-protocol.md +42 -0
- package/skills/showdar-insurance-review/SKILL.md +129 -0
- package/skills/showdar-insurance-review/references/concepts.md +23 -0
- package/skills/showdar-insurance-review/references/glossary.md +70 -0
- package/skills/showdar-insurance-review/references/review-qa.md +29 -0
- package/skills/showdar-insurance-review/references/source-protocol.md +42 -0
- package/skills/showdar-insurance-workflows/SKILL.md +130 -0
- package/skills/showdar-insurance-workflows/references/concepts.md +23 -0
- package/skills/showdar-insurance-workflows/references/glossary.md +70 -0
- package/skills/showdar-insurance-workflows/references/lifecycle.md +29 -0
- package/skills/showdar-insurance-workflows/references/source-protocol.md +42 -0
- package/src/adapter-renderers.js +9 -1
- package/src/capabilities.js +3 -0
- package/src/catalog.js +4 -1
- package/src/git-start.js +87 -0
- package/src/project.js +26 -31
- package/src/runtime-route.js +99 -0
- package/src/validate.js +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,36 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.12.0]
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Canonical `showdar route --stdin|--prompt [--json]` runtime bridge projecting lifecycle primary, advisors, the seven public Intent keys, advisory domain matches, and installed/missing skill availability.
|
|
14
|
+
- Specialized domain discovery overlay using deterministic Unicode phrase matching over `router/skill-map.yaml` inline trigger arrays; insurance terminology, underwriting/rating flows, and insurer API/UI review map to `showdar-insurance-domain`, `showdar-insurance-workflows`, and `showdar-insurance-review` without granting authority.
|
|
15
|
+
- `showdar git-start --type --name [--base] [--dry-run] [--json]` for deterministic safe local task-branch preparation without inferred staging, commit, merge, or push.
|
|
16
|
+
- Task branch isolation guidance: branch-before-edit on integration/default branches, repository-policy priority, one branch per coherent task, and conservative dirty-worktree blocking.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Managed harness instructions and commands invoke the canonical runtime router with native/static fallback when the CLI is unavailable.
|
|
21
|
+
- Init/add guidance reflects the complete installed set; add refreshes existing commands and instructions even when the skill is already installed.
|
|
22
|
+
- Showdar Git documents one branch per coherent task, repository-policy priority, and explicit completion/integration authority.
|
|
23
|
+
- Task completion defaults to verify and report; merge and push each require their own explicit authority.
|
|
24
|
+
|
|
25
|
+
### Safety / Compatibility
|
|
26
|
+
|
|
27
|
+
- Domain discovery does not grant authority and never replaces the lifecycle primary or rewrites Intent/mutation.
|
|
28
|
+
- Phase 6G authority, state, evidence, trace, and manifest contracts unchanged; no engine vendoring into projects.
|
|
29
|
+
- No implicit branch commit/merge/push; no automatic stash, reset, restore, or clean.
|
|
30
|
+
- Existing v0.11 projects remain compatible; no migration required.
|
|
31
|
+
|
|
32
|
+
## [0.11.0]
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- Add three independently installable insurance skills for insurer domain terminology, cross-line-of-business workflows, and terminology/API review, with Vietnamese–English–technical mappings and insurer/product-specific scoping.
|
|
37
|
+
- Add an insurance profile and route insurance-domain requests to the relevant skills without limiting the system to motor insurance or HDInsurance.
|
|
38
|
+
|
|
9
39
|
## [0.10.0]
|
|
10
40
|
|
|
11
41
|
### Added
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/showdar-skills)
|
|
4
4
|
[](https://nodejs.org/)
|
|
5
5
|
[](./LICENSE)
|
|
6
|
-
[](#skill-catalog)
|
|
7
7
|
|
|
8
8
|
Production-grade software engineering skills for coding agents. Showdar covers
|
|
9
9
|
the full lifecycle—from requirements and planning through implementation, QA,
|
|
@@ -40,9 +40,91 @@ Claude Code as supported installation targets. Choose `backend`, `qa`, or
|
|
|
40
40
|
`product` when that gives discovery a more precise context; use `full` when
|
|
41
41
|
you want all capabilities available.
|
|
42
42
|
|
|
43
|
+
## Runtime routing and task branches
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
printf '%s\n' 'Implement the approved underwriting form and add tests' | showdar route --stdin --json
|
|
47
|
+
showdar route --prompt "Explain insurance terminology"
|
|
48
|
+
showdar git-start --dry-run --type feature --name "IDP-123 Add pricing form"
|
|
49
|
+
showdar git-start --type feature --name "IDP-123 Add pricing form"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Prefer `--stdin` for arbitrary or multiline prompts. Supply stdin as literal data;
|
|
53
|
+
never interpolate request text into a shell command. Both commands support `--json`
|
|
54
|
+
with a schemaVersion 1 envelope (`command`, `ok`, `data`, `warnings`, `errors`).
|
|
55
|
+
|
|
56
|
+
`route` is read-only. It consumes the existing Phase 6G authority resolver and thin
|
|
57
|
+
route, projecting exactly the seven public Intent keys plus lifecycle primary and
|
|
58
|
+
advisors. It never exposes internal capabilities, frames or authority diagnostics.
|
|
59
|
+
It neither authorizes work nor creates a branch. It preserves canonical advisor
|
|
60
|
+
semantics: a security-review phrase is not guaranteed to become a security advisor.
|
|
61
|
+
|
|
62
|
+
Domain discovery is a separate advisory overlay using the canonical
|
|
63
|
+
`router/skill-map.yaml` inline trigger arrays and grouped domain catalog metadata.
|
|
64
|
+
It uses deterministic Unicode phrase matching, not lifecycle scoring. Insurance
|
|
65
|
+
terminology can recommend `showdar-insurance-domain`, underwriting/rating business
|
|
66
|
+
flows `showdar-insurance-workflows`, and insurer API/UI terminology review
|
|
67
|
+
`showdar-insurance-review`. These skills do not replace lifecycle primaryCapability,
|
|
68
|
+
rewrite Intent/mutation, or grant authority. The existing ASCII/token ranking
|
|
69
|
+
helper is unsuitable for Vietnamese phrase discovery. No duplicate trigger table
|
|
70
|
+
or second authority engine is introduced.
|
|
71
|
+
|
|
72
|
+
When `.showdar.json` exists, availability checks managed native skill files and
|
|
73
|
+
recorded, still-present globally satisfied skills. Missing lifecycle primary,
|
|
74
|
+
advisors and domain matches are reported separately with `showdar add <name>`
|
|
75
|
+
suggestions; another installed skill never substitutes for the canonical route.
|
|
76
|
+
Without a project manifest, `managed` is false and installed/missing fields are
|
|
77
|
+
null (unknown), not fabricated. Invalid manifests fail explicitly. Explicit named
|
|
78
|
+
installed skills may load directly; this adds no mutation authority.
|
|
79
|
+
|
|
80
|
+
Managed project guidance invokes `showdar route --stdin --json` for automatic
|
|
81
|
+
selection, then loads the installed lifecycle skill, domain overlays and advisors.
|
|
82
|
+
The runtime bridge requires the `showdar` CLI in the harness environment. If it is
|
|
83
|
+
unavailable, native skill descriptions/static discovery are the fallback. No npm
|
|
84
|
+
install, npx fetch, package dependency mutation or remote download happens.
|
|
85
|
+
Projects receive only existing skills/commands/instructions/manifest; no wholesale
|
|
86
|
+
`src/`, `engine/` or `router/` copy. Init and add regenerate complete installed-set
|
|
87
|
+
guidance, including re-adding an existing skill. Global installs keep native discovery
|
|
88
|
+
and do not write project AGENTS.md or CLAUDE.md.
|
|
89
|
+
|
|
90
|
+
The four workflows remain native discoverable/installable skills; `route` does not
|
|
91
|
+
introduce workflow selection. Profiles remain primitive-only: `full` contains all
|
|
92
|
+
18 primitives, and the insurance profile remains unchanged.
|
|
93
|
+
|
|
94
|
+
Before the first local-write task source edit on develop/development/dev/main/master
|
|
95
|
+
or the repository default/integration branch, prepare a task branch. Priority is
|
|
96
|
+
repository instructions/documented convention, explicit current user instruction,
|
|
97
|
+
clearly detected convention, then Showdar defaults. Explicit trunk/direct-work policy
|
|
98
|
+
wins. One coherent task uses one branch across plan/build/test/review. Completion
|
|
99
|
+
means verify and report; commit, merge and push need their own authority.
|
|
100
|
+
|
|
101
|
+
`git-start` prepares local branch state only. Types: feature (new capability), fix
|
|
102
|
+
(defect), refactor (internal structure), test, docs, chore (tooling/config), release,
|
|
103
|
+
hotfix (explicit urgent production repair). Slugs are lowercase, hyphenated, ticket
|
|
104
|
+
preserving and bounded; task text is passed as data and never executed.
|
|
105
|
+
|
|
106
|
+
Base resolution uses explicit `--base`, repository-local `showdar.gitBase`, established
|
|
107
|
+
local develop/development/dev, then local default/main/master. The helper does not
|
|
108
|
+
parse prose instructions or create develop. Read policy first and supply its base
|
|
109
|
+
when convention differs. Local Git config `showdar.gitBranchPrefix` supports custom
|
|
110
|
+
prefixes; `showdar.gitDirectWork=true` records an explicit direct-work convention.
|
|
111
|
+
Hotfix requires a convention via `--base` or `showdar.gitBase`.
|
|
112
|
+
|
|
113
|
+
Dry-run validates Git state/type/slug/base/collision and changes no refs. Execution
|
|
114
|
+
revalidates, then creates/switches only a task branch. Already on the matching branch
|
|
115
|
+
is a no-op; another task branch is blocked. An existing target is reused automatically
|
|
116
|
+
only when its tip equals both current HEAD and base; divergent/ambiguous targets stop
|
|
117
|
+
without overwriting history. Detached HEAD and active Git operations stop.
|
|
118
|
+
|
|
119
|
+
Dirty worktrees are blocked before any switch: the helper cannot prove ownership.
|
|
120
|
+
Confirmed current-task-only changes may use equivalent repository-specific branch
|
|
121
|
+
preparation after explicit ownership inspection. No automatic stash/reset/restore/clean,
|
|
122
|
+
staging, commit, merge or push occurs. Branch preparation itself does not authorize
|
|
123
|
+
source edits.
|
|
124
|
+
|
|
43
125
|
## Why Showdar?
|
|
44
126
|
|
|
45
|
-
- **
|
|
127
|
+
- **18 focused primitive skills** plus 4 adaptive workflow skills (22 installable), including an opt-in insurance domain profile.
|
|
46
128
|
- **Lifecycle coverage** from product rules to implementation, verification,
|
|
47
129
|
security, operations, release readiness, and Git completion.
|
|
48
130
|
- **Intent-based discovery** that selects the workflow matching the request.
|
|
@@ -72,7 +154,7 @@ SKILL.md
|
|
|
72
154
|
only when needed
|
|
73
155
|
```
|
|
74
156
|
|
|
75
|
-
The
|
|
157
|
+
The 18 primitive skills are not eagerly loaded as full prompts. Lightweight
|
|
76
158
|
descriptions help the agent choose one skill; that skill then loads its
|
|
77
159
|
workflow and deeper knowledge progressively. Workflow skills add a portable
|
|
78
160
|
orchestration layer: a workflow selects the lifecycle stages a task actually
|
|
@@ -95,7 +177,7 @@ agent/subagent, or MCP behavior across harnesses.
|
|
|
95
177
|
|
|
96
178
|
## Adapter model
|
|
97
179
|
|
|
98
|
-
The portable core (
|
|
180
|
+
The portable core (18 primitives + 4 workflows) never changes per harness.
|
|
99
181
|
A thin native adapter layer renders harness-specific entry surfaces only:
|
|
100
182
|
|
|
101
183
|
```text
|
|
@@ -135,8 +217,8 @@ the same canonical semantic body as the `AGENTS.md`/`CLAUDE.md` blocks.
|
|
|
135
217
|
`/showdar/skill` is generated for OpenCode/Claude as generic
|
|
136
218
|
installed-skill discovery. Commands are generated dynamically from the
|
|
137
219
|
installed skill set: `minimal` yields 8 direct commands plus the generic
|
|
138
|
-
entry; adding `feature` yields 9 plus generic. All
|
|
139
|
-
unless all
|
|
220
|
+
entry; adding `feature` yields 9 plus generic. All 22 commands never exist
|
|
221
|
+
unless all 22 skills are installed.
|
|
140
222
|
|
|
141
223
|
## Native install examples
|
|
142
224
|
|
|
@@ -226,7 +308,8 @@ skill, but still does not eagerly load every skill body.
|
|
|
226
308
|
| `backend` | 14 | APIs, services, and runtime operations |
|
|
227
309
|
| `qa` | 9 | Testing and quality workflows |
|
|
228
310
|
| `product` | 6 | Product, requirements, and design work |
|
|
229
|
-
| `
|
|
311
|
+
| `insurance` | 3 | Insurance terminology, business flows, and UI/API review |
|
|
312
|
+
| `full` | 18 | All primitive capabilities |
|
|
230
313
|
|
|
231
314
|
Legacy aliases remain compatible:
|
|
232
315
|
|
|
@@ -239,7 +322,7 @@ New manifests store the canonical `developer` profile.
|
|
|
239
322
|
|
|
240
323
|
## Skill catalog
|
|
241
324
|
|
|
242
|
-
All
|
|
325
|
+
All 18 primitive entries are first-class Showdar skills. Four workflow skills
|
|
243
326
|
compose them; see [Workflow skills](#workflow-skills).
|
|
244
327
|
|
|
245
328
|
### Analysis and planning
|
|
@@ -274,6 +357,14 @@ compose them; see [Workflow skills](#workflow-skills).
|
|
|
274
357
|
| `showdar-security` | Assessing threat models, attack surfaces, trust boundaries, auth/authz, secrets, exposure, or exploitability. |
|
|
275
358
|
| `showdar-ops` | Inspecting or changing CI/CD, containers, environments, deployment, observability, rollback, or runtime operations. |
|
|
276
359
|
|
|
360
|
+
### Insurance
|
|
361
|
+
|
|
362
|
+
| Skill | Use when |
|
|
363
|
+
| --- | --- |
|
|
364
|
+
| `showdar-insurance-domain` | Vietnamese insurer terminology, product taxonomy, coverage concepts, and VI/EN glossary. |
|
|
365
|
+
| `showdar-insurance-workflows` | Product configuration, underwriting, pricing, policy lifecycle, collection, or claims flows. |
|
|
366
|
+
| `showdar-insurance-review` | Reviewing insurer UI, domain/API mappings, validations, and QA scenarios. |
|
|
367
|
+
|
|
277
368
|
### Delivery and recovery
|
|
278
369
|
|
|
279
370
|
| Skill | Use when |
|
|
@@ -547,11 +638,27 @@ showdar add feature
|
|
|
547
638
|
showdar add bugfix --ai cursor
|
|
548
639
|
showdar add release --scope global --ai claude
|
|
549
640
|
showdar add incident
|
|
641
|
+
showdar add insurance-domain
|
|
642
|
+
showdar add insurance-workflows
|
|
643
|
+
showdar add insurance-review
|
|
644
|
+
showdar init --profile insurance
|
|
550
645
|
```
|
|
551
646
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
647
|
+
After a Showdar Skills release containing these entries is published, upgrade the CLI
|
|
648
|
+
and add one insurance skill at a time from the insurer project:
|
|
649
|
+
|
|
650
|
+
```bash
|
|
651
|
+
npm install -g showdar-skills@latest
|
|
652
|
+
showdar add insurance-domain --ai codex
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
Use `showdar add insurance-workflows --ai codex` and
|
|
656
|
+
`showdar add insurance-review --ai codex` when those are needed. For a new project
|
|
657
|
+
that wants all three, `showdar init --profile insurance --ai codex` installs the set.
|
|
658
|
+
|
|
659
|
+
Accepted names are the short form (`debug`, `feature`, `insurance-domain`)
|
|
660
|
+
or the canonical form (`showdar-debug`, `showdar-feature`). The release ships exactly 18 primitive
|
|
661
|
+
skills plus 4 workflow skills (22 installable total); profiles install
|
|
555
662
|
primitive sets only. There is no `showdar workflow ...` command. `showdar add`
|
|
556
663
|
is idempotent, preserves the configured profile, supports `--ai`/`--scope`
|
|
557
664
|
overrides, and refuses to overwrite a foreign same-name skill directory that
|
|
@@ -641,7 +748,7 @@ Project overrides live in the user-owned `.showdar/overrides.json` file:
|
|
|
641
748
|
skill descriptions, discovery hints, advisory guidance text, custom
|
|
642
749
|
workflow policy refinement, and new project-owned profiles. Showdar reads
|
|
643
750
|
and validates the file but never rewrites or deletes it; built-in
|
|
644
|
-
workflow semantics and the
|
|
751
|
+
workflow semantics and the seven built-in profiles cannot be overridden.
|
|
645
752
|
Pack-local profiles select pack-owned skills and workflows only.
|
|
646
753
|
|
|
647
754
|
Showdar computes a full-tree SHA-256 over the validated pack source at
|
|
@@ -746,7 +853,7 @@ showdar remove [--scope <project|global>]
|
|
|
746
853
|
Main flags are `--ai`, `--profile`, and `--scope`. `--ai` accepts `universal`,
|
|
747
854
|
`codex`, `opencode`, `cursor`, `claude`, or `all` for `init` (single targets
|
|
748
855
|
for `add`). `--scope` accepts `project` or `global` and defaults to `project`;
|
|
749
|
-
`--profile` accepts the
|
|
856
|
+
`--profile` accepts the seven canonical profiles and the deprecated
|
|
750
857
|
`mobile`/`web` aliases. Run `showdar --help` or a command's `--help` for
|
|
751
858
|
current options.
|
|
752
859
|
|
package/bin/showdar.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { parseArgs } from 'node:util';
|
|
4
|
+
import { startTaskBranch, formatGitStart } from '../src/git-start.js';
|
|
5
|
+
import { routeRequest, formatRoute } from '../src/runtime-route.js';
|
|
3
6
|
import { homedir } from 'node:os';
|
|
4
7
|
import { readFile } from 'node:fs/promises';
|
|
5
8
|
import { fileURLToPath } from 'node:url';
|
|
@@ -33,6 +36,14 @@ function scopeAfter(args) {
|
|
|
33
36
|
|
|
34
37
|
function printHelp(version, command = null) {
|
|
35
38
|
const scopeUsage = '[--scope <project|global>]';
|
|
39
|
+
if (command === 'route') {
|
|
40
|
+
console.log('Usage: showdar route (--stdin | --prompt <text>) [--json]');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (command === 'git-start') {
|
|
44
|
+
console.log('Usage: showdar git-start --type <type> --name <task> [--base <branch>] [--dry-run] [--json]');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
36
47
|
if (command === 'init') {
|
|
37
48
|
console.log(`Showdar Skills ${version}\n\nUsage:\n showdar init ${scopeUsage} [--profile <name>] [--ai <universal|codex|opencode|cursor|claude|all>]\n\nDefaults: scope project, profile full, AI target universal.\nProject scope writes native skills, one native instruction surface, and project .showdar.json. Global scope writes verified user skill directories and ~/.showdar/global.json without instruction files. Codex and universal use .agents/skills in project scope and ~/.agents/skills in global scope; cursor uses .cursor/skills in project scope and ~/.cursor/skills in global scope; --ai all writes each shared destination once, generates OpenCode and Claude commands, and writes only the AGENTS.md block.\n\nProfiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\nAI targets: ${AI_TARGETS.join(', ')}`);
|
|
38
49
|
return;
|
|
@@ -45,7 +56,7 @@ function printHelp(version, command = null) {
|
|
|
45
56
|
console.log(`Showdar Skills ${version}\n\nUsage:\n showdar add <skill> [--ai <universal|codex|opencode|cursor|claude>] [--scope <project|global>]\n\nExamples:\n showdar add debug\n showdar add showdar-security\n showdar add test --ai cursor\n showdar add review --scope global --ai claude\n\nDefault scope: project. Default AI target: universal, or the configured .showdar.json value when present.`);
|
|
46
57
|
return;
|
|
47
58
|
}
|
|
48
|
-
console.log(`Showdar Skills ${version}\n\nUsage:\n showdar init ${scopeUsage} [--profile <name>] [--ai <universal|codex|opencode|cursor|claude|all>] [--pack <local-path>]\n showdar add <skill> [--ai <universal|codex|opencode|cursor|claude>] [--scope <project|global>]\n showdar add-pack <local-path>\n showdar remove-pack <name>\n showdar add-workflow <local-path>\n showdar status ${scopeUsage}\n showdar doctor ${scopeUsage}\n showdar validate\n showdar list [--extensions]\n showdar remove ${scopeUsage}\n showdar create-pack <path> [--vendor <vendor>] [--description <text>] [--with-workflow <id>] [--with-profile <name>]\n showdar validate-pack <local-path> [--json]\n showdar inspect-pack <local-path> [--json] [--checkpoint <file>]\n showdar doctor ${scopeUsage} [--extensions] [--json]\n showdar update-pack <local-path> [--dry-run] [--json]\n showdar validate\n showdar list [--extensions] [--json]\n showdar remove ${scopeUsage}\n\nExtension packs accept local directories/workspace paths only; tarball, URL, Git, and registry sources are rejected.\n\nDefaults: scope project, profile full, AI target universal.\nProfiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\nAI targets: ${AI_TARGETS.join(', ')}`);
|
|
59
|
+
console.log(`Showdar Skills ${version}\n\nUsage:\n showdar init ${scopeUsage} [--profile <name>] [--ai <universal|codex|opencode|cursor|claude|all>] [--pack <local-path>]\n showdar add <skill> [--ai <universal|codex|opencode|cursor|claude>] [--scope <project|global>]\n showdar route (--stdin | --prompt <text>) [--json]\n showdar git-start --type <type> --name <task> [--base <branch>] [--dry-run] [--json]\n showdar add-pack <local-path>\n showdar remove-pack <name>\n showdar add-workflow <local-path>\n showdar status ${scopeUsage}\n showdar doctor ${scopeUsage}\n showdar validate\n showdar list [--extensions]\n showdar remove ${scopeUsage}\n showdar create-pack <path> [--vendor <vendor>] [--description <text>] [--with-workflow <id>] [--with-profile <name>]\n showdar validate-pack <local-path> [--json]\n showdar inspect-pack <local-path> [--json] [--checkpoint <file>]\n showdar doctor ${scopeUsage} [--extensions] [--json]\n showdar update-pack <local-path> [--dry-run] [--json]\n showdar validate\n showdar list [--extensions] [--json]\n showdar remove ${scopeUsage}\n\nExtension packs accept local directories/workspace paths only; tarball, URL, Git, and registry sources are rejected.\n\nDefaults: scope project, profile full, AI target universal.\nProfiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\nAI targets: ${AI_TARGETS.join(', ')}`);
|
|
49
60
|
}
|
|
50
61
|
|
|
51
62
|
async function main() {
|
|
@@ -59,10 +70,33 @@ async function main() {
|
|
|
59
70
|
console.log(version);
|
|
60
71
|
return;
|
|
61
72
|
}
|
|
62
|
-
if (args.includes('--help') || args.includes('-h')) return printHelp(version, command);
|
|
73
|
+
if (!['route', 'git-start'].includes(command) && (args.includes('--help') || args.includes('-h'))) return printHelp(version, command);
|
|
63
74
|
|
|
64
75
|
const scope = ['init', 'status', 'doctor', 'remove', 'add'].includes(command) ? scopeAfter(args) : null;
|
|
65
76
|
|
|
77
|
+
if (command === 'git-start') {
|
|
78
|
+
const { values } = parseArgs({ args: args.slice(1), options: { type: { type: 'string' }, name: { type: 'string' }, base: { type: 'string' }, 'dry-run': { type: 'boolean' }, json: { type: 'boolean' }, help: { type: 'boolean', short: 'h' } } });
|
|
79
|
+
if (values.help) return printHelp(version, command);
|
|
80
|
+
const data = startTaskBranch({ cwd: projectRoot, type: values.type, name: values.name, base: values.base, dryRun: values['dry-run'] });
|
|
81
|
+
console.log(values.json ? JSON.stringify({ schemaVersion: 1, command, ok: true, data, warnings: [], errors: [] }, null, 2) : formatGitStart(data));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (command === 'route') {
|
|
86
|
+
const { values } = parseArgs({ args: args.slice(1), options: { stdin: { type: 'boolean' }, prompt: { type: 'string' }, json: { type: 'boolean' }, help: { type: 'boolean', short: 'h' } } });
|
|
87
|
+
if (values.help) return printHelp(version, command);
|
|
88
|
+
if (Boolean(values.stdin) === (values.prompt !== undefined)) throw new Error('Select exactly one of --stdin or --prompt.');
|
|
89
|
+
let prompt = values.prompt;
|
|
90
|
+
if (values.stdin) {
|
|
91
|
+
process.stdin.setEncoding('utf8');
|
|
92
|
+
prompt = '';
|
|
93
|
+
for await (const chunk of process.stdin) prompt += chunk;
|
|
94
|
+
}
|
|
95
|
+
const data = await routeRequest({ prompt, cwd: projectRoot, packageRoot });
|
|
96
|
+
console.log(values.json ? JSON.stringify({ schemaVersion: 1, command, ok: true, data, warnings: [], errors: [] }, null, 2) : formatRoute(data));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
66
100
|
if (command === 'list') {
|
|
67
101
|
if (args.includes('--extensions')) {
|
|
68
102
|
const isJson = args.includes('--json');
|
|
@@ -342,6 +376,9 @@ async function main() {
|
|
|
342
376
|
}
|
|
343
377
|
|
|
344
378
|
main().catch((error) => {
|
|
345
|
-
|
|
379
|
+
const command = process.argv[2];
|
|
380
|
+
if (['route', 'git-start'].includes(command) && process.argv.slice(3).includes('--json')) {
|
|
381
|
+
console.log(JSON.stringify({ schemaVersion: 1, command, ok: false, data: null, warnings: [], errors: [{ code: 'INVALID_REQUEST', message: error.message }] }, null, 2));
|
|
382
|
+
} else console.error(`showdar: ${error.message}`);
|
|
346
383
|
process.exitCode = 1;
|
|
347
384
|
});
|
package/package.json
CHANGED
package/profiles/full.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"skills":["showdar-understand","showdar-plan","showdar-design","showdar-build","showdar-debug","showdar-test","showdar-review","showdar-upgrade","showdar-ship","showdar-recover","showdar-git","showdar-requirements","showdar-quality","showdar-security","showdar-ops"]}
|
|
1
|
+
{"skills":["showdar-understand","showdar-plan","showdar-design","showdar-build","showdar-debug","showdar-test","showdar-review","showdar-upgrade","showdar-ship","showdar-recover","showdar-git","showdar-requirements","showdar-quality","showdar-security","showdar-ops","showdar-insurance-domain","showdar-insurance-workflows","showdar-insurance-review"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"skills":["showdar-insurance-domain","showdar-insurance-workflows","showdar-insurance-review"]}
|
package/router/conflicts.yaml
CHANGED
|
@@ -48,3 +48,11 @@ overlap_matrix:
|
|
|
48
48
|
boundary: quality plans scenario coverage and confidence; ship decides whether release or handoff evidence is sufficient
|
|
49
49
|
- pair: showdar-upgrade vs showdar-build
|
|
50
50
|
boundary: upgrade changes dependency or platform compatibility; build changes application behavior within the supported stack
|
|
51
|
+
- pair: showdar-insurance-domain vs showdar-insurance-workflows
|
|
52
|
+
boundary: insurance-domain resolves terminology and concept mappings; insurance-workflows analyzes scoped business transitions and rules
|
|
53
|
+
- pair: showdar-insurance-workflows vs showdar-insurance-review
|
|
54
|
+
boundary: insurance-workflows derives sourced flows and rules; insurance-review checks concrete UI, model, API, and QA mappings against that evidence
|
|
55
|
+
- pair: showdar-insurance-workflows vs showdar-requirements
|
|
56
|
+
boundary: insurance-workflows applies insurance concepts to a scoped flow; showdar-requirements owns cross-domain requirement readiness and unresolved stakeholder decisions
|
|
57
|
+
- pair: showdar-insurance-review vs showdar-review
|
|
58
|
+
boundary: insurance-review checks business terminology and data mappings; showdar-review checks implementation correctness and maintainability
|
package/router/skill-map.yaml
CHANGED
|
@@ -38,7 +38,7 @@ routes:
|
|
|
38
38
|
triggers: ["resume interrupted implementation", "recover partial work", "session stopped", "continue partial work", "missing context"]
|
|
39
39
|
skill: showdar-recover
|
|
40
40
|
git:
|
|
41
|
-
triggers: ["commit", "stage only task files", "merge branch", "rebase branch", "cherry-pick commit", "git conflict", "push branch", "clean merged branches", "finish git workflow"]
|
|
41
|
+
triggers: ["commit", "stage only task files", "merge branch", "rebase branch", "cherry-pick commit", "git conflict", "push branch", "clean merged branches", "finish git workflow", "start task branch", "create feature branch", "create fix branch", "branch for this task"]
|
|
42
42
|
skill: showdar-git
|
|
43
43
|
requirements:
|
|
44
44
|
triggers: ["requirements", "business rules", "acceptance criteria", "user stories", "use cases", "requirement matrix", "missing requirement", "ambiguity"]
|
|
@@ -52,3 +52,12 @@ routes:
|
|
|
52
52
|
ops:
|
|
53
53
|
triggers: ["CI/CD", "GitHub Actions", "Docker", "container", "deployment", "deploy", "observability", "rollback", "runtime operations", "staging"]
|
|
54
54
|
skill: showdar-ops
|
|
55
|
+
insurance-domain:
|
|
56
|
+
triggers: ["insurance terminology", "insurance glossary", "bảo hiểm", "thuật ngữ bảo hiểm", "taxonomy bảo hiểm", "line of business", "coverage term", "sum insured meaning"]
|
|
57
|
+
skill: showdar-insurance-domain
|
|
58
|
+
insurance-workflows:
|
|
59
|
+
triggers: ["insurance business flow", "underwriting", "insurance pricing", "premium rating", "policy issuance", "insurance claim flow", "endorsement flow", "renewal flow", "bồi thường", "thẩm định bảo hiểm", "flow thu phí"]
|
|
60
|
+
skill: showdar-insurance-workflows
|
|
61
|
+
insurance-review:
|
|
62
|
+
triggers: ["insurer API mapping", "insurance UI terminology", "review insurance schema", "insurance QA scenarios", "sub-limit mapping", "coverage validation", "mapping UI API bảo hiểm"]
|
|
63
|
+
skill: showdar-insurance-review
|
package/router/triggers.yaml
CHANGED
|
@@ -25,6 +25,10 @@ rules:
|
|
|
25
25
|
- local Git commit, staging, branch, merge, rebase, conflict, cleanup, and explicit push intent routes to showdar-git
|
|
26
26
|
- explicit rebase, cherry-pick, merge, or Git conflict operations route to showdar-git; interrupted implementation recovery routes to showdar-recover
|
|
27
27
|
- product or business input, missing requirements, business rules, user stories, use cases, acceptance criteria, and requirement readiness route to showdar-requirements
|
|
28
|
+
- glossary, taxonomy, aliases, and VI/EN insurance concepts route to showdar-insurance-domain
|
|
29
|
+
- product configuration, underwriting, rating, quote, issuance, collection, endorsement, renewal, cancellation, and claims flows route to showdar-insurance-workflows
|
|
30
|
+
- concrete insurer UI/domain/API mapping, terminology review, and insurance QA cases route to showdar-insurance-review
|
|
31
|
+
- generic requirements and QA requests retain their existing routes unless insurance-specific evidence mapping is the task
|
|
28
32
|
- QA scenarios, risk-based coverage, regression scope, compatibility matrices, exploratory checks, and bug-report quality route to showdar-quality
|
|
29
33
|
- explicit security, authz, secrets, exposure, attack-surface, threat, or exploitability intent routes to showdar-security before general review
|
|
30
34
|
- operational CI/CD, container, environment, deployment, observability, rollback, or runtime intent routes to showdar-ops; release readiness remains showdar-ship and Git-only work remains showdar-git
|
|
@@ -46,6 +46,29 @@ This skill owns repository state transitions, not source-code review or GitHub a
|
|
|
46
46
|
- Push, tag, remote deletion, pull with mutation, GitHub operations, and release actions require explicit intent.
|
|
47
47
|
- Report exactly what changed after each Git mutation.
|
|
48
48
|
|
|
49
|
+
## Task branch isolation
|
|
50
|
+
|
|
51
|
+
Before the first task-owned source edit for a local-write engineering task, inspect Git state (`git status --short`, current branch, branch history and repository policy). Direct develop/main edits are not the default: on develop, development, dev, main, master or the default/integration branch, prepare a dedicated task branch before source mutation.
|
|
52
|
+
|
|
53
|
+
Priority: repository instructions/documented branching convention; explicit current user instruction; clearly detected existing convention; Showdar safe default. Explicit trunk-based/direct-work policy wins: do not impose GitFlow. Branch preparation does not authorize source mutation.
|
|
54
|
+
|
|
55
|
+
Use one branch per coherent task across understand, requirements, plan, design, build, test and review. Continue the current task branch; never create a branch per skill or nested branches.
|
|
56
|
+
|
|
57
|
+
Default types: new user-visible capability → `feature`; observed defect → `fix`; internal restructuring → `refactor`; tests only → `test`; documentation only → `docs`; tooling/config/maintenance → `chore`; release preparation → `release`; explicit urgent production repair → `hotfix`. Names use a bounded lowercase hyphen slug preserving ticket keys.
|
|
58
|
+
|
|
59
|
+
Prefer established local develop for normal work; otherwise the repository default/integration branch. Do not create develop automatically. Explicit hotfix follows repository convention. Read prose policy yourself; the helper does not parse repository instructions. Supply `--base` or repository-local Git config `showdar.gitBase`, `showdar.gitBranchPrefix`, `showdar.gitDirectWork` for deterministic custom conventions.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
showdar git-start --dry-run --type feature --name "Task description"
|
|
63
|
+
showdar git-start --type feature --name "Task description"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The helper revalidates before creating/switching and never edits source. A clean worktree can branch. Confirmed current-task changes may be carried only through equivalent repository-specific Git preparation with proven ownership and Git permission; the helper conservatively blocks dirty changes before switching because it cannot prove ownership. Unrelated/ambiguous changes → STOP. No hidden stash, reset, restore or clean.
|
|
67
|
+
|
|
68
|
+
Existing same-name branches must be inspected. The helper reuses only an unused branch with the same tip as both current HEAD and base; an already-active matching branch is a continue/no-op. Any other collision → STOP; never reset or overwrite branch history. Already on another task branch → inspect task identity before switching.
|
|
69
|
+
|
|
70
|
+
Default completion: task branch → verify → report. No inferred commit, merge or push. Merge only when explicitly requested or clearly included in current repository/user task authority; push remains independently explicit.
|
|
71
|
+
|
|
49
72
|
## Workflow
|
|
50
73
|
|
|
51
74
|
### 1. Inspect Git state
|
|
@@ -273,7 +296,8 @@ report -> SHA, staged paths, exclusions, and clean/dirty final state
|
|
|
273
296
|
### Feature completion without push
|
|
274
297
|
|
|
275
298
|
```text
|
|
276
|
-
|
|
299
|
+
task branch -> verify -> report
|
|
300
|
+
selective commit only when requested; merge only with current task authority
|
|
277
301
|
remote -> not touched because no push request was given
|
|
278
302
|
```
|
|
279
303
|
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: showdar-insurance-domain
|
|
3
|
+
description: Use when Vietnamese insurer work involves insurance terminology, product taxonomy, coverage concepts, VI/EN glossary, or insurer/product-specific vocabulary.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# Insurance domain
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Reason in insurance business language and preserve exact
|
|
12
|
+
mappings to implementation identifiers. This is a multi-line
|
|
13
|
+
insurer domain: motor, health, accident, travel, property,
|
|
14
|
+
cargo, engineering, liability, personal insurance and other
|
|
15
|
+
supported products. HDInsurance/HDI or motor examples never
|
|
16
|
+
establish the whole system's scope. Do not assume modules
|
|
17
|
+
already exist.
|
|
18
|
+
|
|
19
|
+
## Sources and scope
|
|
20
|
+
|
|
21
|
+
Read [source protocol](references/source-protocol.md) for every
|
|
22
|
+
domain task. Read [glossary](references/glossary.md) for
|
|
23
|
+
terminology and [concepts](references/concepts.md) for
|
|
24
|
+
relationships/taxonomy. Load only relevant sections.
|
|
25
|
+
|
|
26
|
+
For each term, keep five layers separate: industry meaning,
|
|
27
|
+
insurer alias, product/version meaning, UI label, exact
|
|
28
|
+
technical/API identifier. A likely translation is a candidate,
|
|
29
|
+
not an approved insurer term. `planCode` alone does not
|
|
30
|
+
establish whether its meaning is a gói, chương trình, phương án
|
|
31
|
+
or technical grouping.
|
|
32
|
+
|
|
33
|
+
Keep VI accents; prefer language used by insurer operations.
|
|
34
|
+
Preserve an insurer's approved wording within its scope and
|
|
35
|
+
record aliases instead of overwriting a shared term. Do not
|
|
36
|
+
translate JSON keys, enums or identifiers. Avoid literal
|
|
37
|
+
translations such as policy → “chính sách” or premium → “cao
|
|
38
|
+
cấp”. Do not equate application, quote, contract and
|
|
39
|
+
certificate.
|
|
40
|
+
|
|
41
|
+
## Workflow
|
|
42
|
+
|
|
43
|
+
1. Identify the requested module and known market, insurer, product, product version and API version. Unknown scope stays explicit; ask only for missing context that changes the answer.
|
|
44
|
+
2. Extract exact terms and source locations from supplied glossary, wording, BA/spec, SOP, API/schema, screenshots and sample data.
|
|
45
|
+
3. Match by meaning, not spelling. Explain distinctions and relationships before suggesting labels or mappings. Label observed code behavior separately from business requirements.
|
|
46
|
+
4. Record conflicts and ask for verification of the affected interpretation. Continue independent analysis; do not choose the newer document, more convenient term or API name as business authority.
|
|
47
|
+
|
|
48
|
+
## Term resolution
|
|
49
|
+
|
|
50
|
+
- Use the legal Vietnamese term for statutory roles and concepts when the applicable
|
|
51
|
+
legal source defines it. Label its EN rendering as a working
|
|
52
|
+
translation unless a bilingual authority confirms the English
|
|
53
|
+
term.
|
|
54
|
+
- Use wording, schedule and endorsements to interpret product coverage and exclusions.
|
|
55
|
+
Keep the exact product/version and effective scope with each
|
|
56
|
+
term.
|
|
57
|
+
- Use the insurer glossary and SOP for approved operator vocabulary. Preserve a
|
|
58
|
+
differing local alias alongside the normalized domain concept.
|
|
59
|
+
- Use API contracts for wire spelling, enum values, types and null behavior. Do not
|
|
60
|
+
silently promote technical names to product names or visible UI
|
|
61
|
+
labels.
|
|
62
|
+
- Use observed screens and implementation to report what exists. Keep observations
|
|
63
|
+
distinct from approved or requested behavior.
|
|
64
|
+
- When one displayed label maps to several API values, or an API value has several
|
|
65
|
+
product-specific meanings, show the conditional mapping instead
|
|
66
|
+
of flattening it.
|
|
67
|
+
- When sources conflict, preserve both meanings, source versions and the affected
|
|
68
|
+
decision. Ask which source governs that scope.
|
|
69
|
+
|
|
70
|
+
## Output contract
|
|
71
|
+
|
|
72
|
+
Produce only the requested scope. A glossary/mapping uses:
|
|
73
|
+
|
|
74
|
+
| VI term | EN term | Meaning/distinction | Insurer/product alias | UI label | API path/type/enum | Scope | Source/location | Evidence status |
|
|
75
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
76
|
+
|
|
77
|
+
Use `unknown` for missing API mappings and `candidate` for
|
|
78
|
+
unapproved labels. Add relationships and unresolved conflicts
|
|
79
|
+
when relevant. Do not generate invented identifiers to fill the
|
|
80
|
+
table.
|
|
81
|
+
|
|
82
|
+
## Example
|
|
83
|
+
|
|
84
|
+
Example: a sample `planCode: "A"` proves only that the sample
|
|
85
|
+
contains that field/value. Report its business meaning and UI
|
|
86
|
+
label as unresolved until a glossary, contract or BA definition
|
|
87
|
+
establishes them.
|
|
88
|
+
|
|
89
|
+
## When to use
|
|
90
|
+
Analyze insurer terminology, taxonomy, business concepts or
|
|
91
|
+
glossary mappings across any supported line of business.
|
|
92
|
+
## When not to use
|
|
93
|
+
For state transitions or rule derivation use
|
|
94
|
+
`showdar-insurance-workflows`; for implementation/UI QA use
|
|
95
|
+
`showdar-insurance-review`.
|
|
96
|
+
## Inputs and assumptions
|
|
97
|
+
Use supplied glossary, BA/spec, wording, SOP, API/schema and
|
|
98
|
+
scoped samples. No insurer-specific source is bundled.
|
|
99
|
+
## Non-negotiable rules
|
|
100
|
+
Keep source, scope and evidence status attached to each mapping.
|
|
101
|
+
A seed translation is not an approved UI label.
|
|
102
|
+
## Decision points
|
|
103
|
+
Exact approved mapping available: preserve it. Meaning
|
|
104
|
+
uncertain: keep mapping unknown. Conflicting definitions: report
|
|
105
|
+
both.
|
|
106
|
+
## Stack detection
|
|
107
|
+
Identify actual models and API versions only when mapping to
|
|
108
|
+
implementation. Framework choice cannot define insurance
|
|
109
|
+
meaning.
|
|
110
|
+
## Failure modes
|
|
111
|
+
Same word can refer to different concepts across products.
|
|
112
|
+
Apparent synonyms can hide different monetary or legal effects.
|
|
113
|
+
## Stop conditions
|
|
114
|
+
Do not finalize a mapping that would change money, coverage,
|
|
115
|
+
party role or contractual meaning without evidence.
|
|
116
|
+
## Escalation conditions
|
|
117
|
+
Ask for the applicable glossary or business-owner verification
|
|
118
|
+
when context cannot distinguish competing meanings.
|
|
119
|
+
## Verification
|
|
120
|
+
Check that each mapping distinguishes legal taxonomy from
|
|
121
|
+
catalog grouping. Check that health, personal insurance and
|
|
122
|
+
non-life are not collapsed by analogy. Verify an alias is
|
|
123
|
+
recorded with its insurer and applicable product/version. Keep
|
|
124
|
+
source-backed wording separate from proposed operator-facing
|
|
125
|
+
wording. Check every asserted API identifier against the
|
|
126
|
+
contract; every insurer alias against its scoped source. Check
|
|
127
|
+
translations preserve the distinctions in the relevant concepts
|
|
128
|
+
reference.
|
|
129
|
+
## Anti-patterns
|
|
130
|
+
Guessing a gói from planCode, rewriting API enums into
|
|
131
|
+
Vietnamese, or treating an insurer sample as an industry
|
|
132
|
+
standard.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Relationships and taxonomy
|
|
2
|
+
|
|
3
|
+
This is a conceptual checklist, not a prescribed database schema or cardinality.
|
|
4
|
+
|
|
5
|
+
## Product structure
|
|
6
|
+
|
|
7
|
+
Keep statutory insurance type, insurer LOB/sub-LOB, product, product version, plan/package, coverage/benefit and risk object separate. An insurer catalog may group health, accident or travel differently from legal categories. “Con người” is a broad business grouping, not proof of a single statutory type. Motor, health, accident, travel, property, cargo, engineering and liability are examples, not a closed enum or mandated hierarchy.
|
|
8
|
+
|
|
9
|
+
Resolve membership, cardinality and identifiers from supplied taxonomy. One product can combine risks/benefits; a plan can select or configure coverage; each relation is a hypothesis until established by product/schema sources. Product publication does not establish that a particular risk is eligible.
|
|
10
|
+
|
|
11
|
+
## Contract structure
|
|
12
|
+
|
|
13
|
+
Distinguish buyer, insured, beneficiary, payer, intermediary and insurer. They can coincide in particular cases but must not be merged by default. Identify insured objects, coverage selections, limits, exclusions, deductible mechanisms, effective period, territory and conditions. Keep quote, application/proposal, underwriting decision, contract, issued documents and payments conceptually separate even if the implementation combines them.
|
|
14
|
+
|
|
15
|
+
## Money and risk
|
|
16
|
+
|
|
17
|
+
Eligibility answers whether participation criteria are met; underwriting assesses acceptance and terms. Sum insured, insured value, liability/benefit limit and sub-limit are different concepts. A monetary limit needs currency, unit, insured subject, coverage, event/claim/period basis and aggregation/reset rules where applicable. Deductible may have fixed/percentage/minimum and per-event bases; do not invent their combination. Benefit products need not use an actual-loss indemnity calculation.
|
|
18
|
+
|
|
19
|
+
## Version and status
|
|
20
|
+
|
|
21
|
+
Separate product availability/publication, rate-table validity, quote status, application status, underwriting status, policy lifecycle, payment status, document generation and claim status. Preserve actual enum mappings. Never equate `ISSUED` with paid, in force or document delivered without source.
|
|
22
|
+
|
|
23
|
+
Use product/rate/wording/API versions and applicable dates when tracing historical contracts. Determine whether a transaction snapshots terms or resolves them dynamically; neither is prescribed here. Renewal and endorsement may select different versions only under documented rules. Concurrent configuration changes require an explicit interpretation and test oracle.
|