@execuro-sw-ecosystem/sw-ecosystem-agentic-harness 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mcp.json +8 -0
- package/CHANGELOG.md +78 -0
- package/CONTRIBUTING.md +54 -0
- package/LICENSE +21 -0
- package/README.md +304 -0
- package/SECURITY.md +50 -0
- package/agents/sw-admin-frontend-developer.md +52 -0
- package/agents/sw-php-backend-developer.md +63 -0
- package/agents/sw-product-manager.md +62 -0
- package/agents/sw-qa-engineer.md +160 -0
- package/agents/sw-shopware-architect.md +79 -0
- package/agents/sw-storefront-developer.md +93 -0
- package/agents/sw-tender-editor.md +43 -0
- package/bin/cli.mjs +73 -0
- package/codex/agents/sw-admin-frontend-developer.toml +54 -0
- package/codex/agents/sw-php-backend-developer.toml +65 -0
- package/codex/agents/sw-product-manager.toml +66 -0
- package/codex/agents/sw-qa-engineer.toml +161 -0
- package/codex/agents/sw-shopware-architect.toml +81 -0
- package/codex/agents/sw-storefront-developer.toml +96 -0
- package/codex/agents/sw-tender-editor.toml +50 -0
- package/content/AGENTS.md +63 -0
- package/content/claude-settings.json +31 -0
- package/content/mcp-servers.json +18 -0
- package/copilot/agents/sw-admin-frontend-developer.agent.md +53 -0
- package/copilot/agents/sw-php-backend-developer.agent.md +64 -0
- package/copilot/agents/sw-product-manager.agent.md +65 -0
- package/copilot/agents/sw-qa-engineer.agent.md +160 -0
- package/copilot/agents/sw-shopware-architect.agent.md +80 -0
- package/copilot/agents/sw-storefront-developer.agent.md +94 -0
- package/copilot/agents/sw-tender-editor.agent.md +46 -0
- package/lib/actions.mjs +449 -0
- package/lib/commands.mjs +446 -0
- package/lib/companions.mjs +117 -0
- package/lib/content.mjs +101 -0
- package/lib/fsx.mjs +188 -0
- package/lib/guide.mjs +98 -0
- package/lib/hosts.mjs +283 -0
- package/lib/lock.mjs +158 -0
- package/lib/merge.mjs +338 -0
- package/lib/out.mjs +74 -0
- package/mcp.json +10 -0
- package/package.json +58 -0
- package/plugin.json +19 -0
- package/skills/sw-design-requirements/SKILL.md +102 -0
- package/skills/sw-design-requirements/reference/clarification-loop.md +20 -0
- package/skills/sw-design-requirements/reference/confidence-rubric.md +82 -0
- package/skills/sw-design-requirements/reference/consistency-probes.md +65 -0
- package/skills/sw-design-requirements/reference/editor-gate.md +15 -0
- package/skills/sw-design-requirements/reference/editor-mode.md +15 -0
- package/skills/sw-design-requirements/reference/prd-confidence-checklist.md +95 -0
- package/skills/sw-design-requirements/reference/prd-template.md +153 -0
- package/skills/sw-design-requirements/reference/readiness-and-report.md +21 -0
- package/skills/sw-design-requirements/reference/splitting-guidelines.md +69 -0
- package/skills/sw-design-solution/SKILL.md +48 -0
- package/skills/sw-design-solution/reference/adr-flow.md +13 -0
- package/skills/sw-design-solution/reference/adr-template.md +40 -0
- package/skills/sw-design-solution/reference/clarification-loop.md +13 -0
- package/skills/sw-design-solution/reference/draft-and-spawn.md +21 -0
- package/skills/sw-design-solution/reference/editor-mode.md +16 -0
- package/skills/sw-design-solution/reference/pre-check-and-target.md +19 -0
- package/skills/sw-design-solution/reference/readiness-and-report.md +15 -0
- package/skills/sw-design-solution/reference/research-and-evidence.md +25 -0
- package/skills/sw-design-solution/reference/tech-spec-template.md +112 -0
- package/skills/sw-design-solution/reference/toolchain-conformance.md +9 -0
- package/skills/sw-discover-tender/SKILL.md +68 -0
- package/skills/sw-discover-tender/reference/agent-briefs.md +135 -0
- package/skills/sw-discover-tender/reference/analysis-template.md +224 -0
- package/skills/sw-discover-tender/reference/assumption-catalogue.md +104 -0
- package/skills/sw-discover-tender/reference/client-question-rules.md +47 -0
- package/skills/sw-discover-tender/reference/confidence-rubric.md +80 -0
- package/skills/sw-discover-tender/reference/context-parameters.md +116 -0
- package/skills/sw-discover-tender/reference/coverage-mapping.md +62 -0
- package/skills/sw-discover-tender/reference/editor-mode.md +11 -0
- package/skills/sw-discover-tender/reference/editor-session.md +115 -0
- package/skills/sw-discover-tender/reference/estimation-model.md +106 -0
- package/skills/sw-discover-tender/reference/procedure.md +98 -0
- package/skills/sw-discover-tender/reference/response-rules.md +13 -0
- package/skills/sw-document-feature/SKILL.md +64 -0
- package/skills/sw-document-feature/reference/adr-promotion.md +64 -0
- package/skills/sw-document-feature/reference/built-check.md +71 -0
- package/skills/sw-document-feature/reference/domain-guidelines.md +59 -0
- package/skills/sw-document-feature/reference/page-rules.md +129 -0
- package/skills/sw-document-feature/reference/procedure.md +58 -0
- package/skills/sw-document-feature/reference/scaffold/README.md +78 -0
- package/skills/sw-document-feature/reference/scaffold/_config.yml +51 -0
- package/skills/sw-document-feature/reference/scaffold/adr/index.md +44 -0
- package/skills/sw-document-feature/reference/scaffold/baseline/glossary.md +55 -0
- package/skills/sw-document-feature/reference/scaffold/baseline/tech-stack.md +48 -0
- package/skills/sw-document-feature/reference/scaffold/domains/index.md +55 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/configuration.md +54 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/customization-guidelines.md +47 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/debugging.md +55 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/environments-and-deployment.md +49 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/extensions-inventory.md +40 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/index.md +39 -0
- package/skills/sw-document-feature/reference/scaffold/domains/platform/logging.md +46 -0
- package/skills/sw-document-feature/reference/scaffold/guidelines/documentation-guidelines.md +102 -0
- package/skills/sw-document-feature/reference/scaffold/guidelines/index.md +50 -0
- package/skills/sw-document-feature/reference/scaffold/index.md +68 -0
- package/skills/sw-document-feature/reference/scaffold/vanilla/README.md +24 -0
- package/skills/sw-document-feature/reference/scaffold/vanilla/adr/index.md +36 -0
- package/skills/sw-document-feature/reference/scaffold/vanilla/index.md +68 -0
- package/skills/sw-document-feature/reference/setup-wiki.md +142 -0
- package/skills/sw-document-feature/reference/source-mapping.md +71 -0
- package/skills/sw-document-feature/reference/templates/adr.md +26 -0
- package/skills/sw-document-feature/reference/templates/domain-index.md +36 -0
- package/skills/sw-document-feature/reference/templates/feature-page.md +64 -0
- package/skills/sw-document-feature/reference/templates/guideline.md +42 -0
- package/skills/sw-implement-feature/SKILL.md +52 -0
- package/skills/sw-implement-feature/reference/ac-loop.md +24 -0
- package/skills/sw-implement-feature/reference/build-order.md +17 -0
- package/skills/sw-implement-feature/reference/delegation.md +18 -0
- package/skills/sw-setup/SKILL.md +144 -0
- package/skills/sw-setup/reference/rows.md +223 -0
- package/skills/sw-verify-feature/SKILL.md +64 -0
- package/skills/sw-verify-feature/reference/reconcile-and-report.md +42 -0
- package/skills/sw-verify-feature/reference/verification-report-template.md +57 -0
- package/skills/sw-verify-feature-ac-tests/SKILL.md +76 -0
- package/skills/sw-verify-feature-ac-tests/reference/audit-execute-score.md +40 -0
- package/skills/sw-verify-feature-architecture/SKILL.md +66 -0
- package/skills/sw-verify-feature-architecture/reference/guidelines-and-twig.md +27 -0
- package/skills/sw-verify-feature-code-quality/SKILL.md +73 -0
- package/skills/sw-verify-feature-code-quality/reference/gates.md +22 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Agent briefs
|
|
2
|
+
|
|
3
|
+
`<work>` = `specs/.rfp/<slug>/`. `<analysis>` = the analysis file.
|
|
4
|
+
|
|
5
|
+
## Parallelism, caps, delivery
|
|
6
|
+
|
|
7
|
+
- Pipeline, not two barriers. Message 1 carries every `sw-product-manager` spawn, PLUS the single `sw-qa-engineer` spawn (it reads no PM report), PLUS the `sw-shopware-architect` spawns for clusters that skip wave 1 entirely (Rows typed *Project*, hosting/operations NFRs, pure contract rows).
|
|
8
|
+
- Each remaining `sw-shopware-architect` is spawned as soon as its OWN cluster's PM report lands — whatever is ready together goes in one message; never wait for the whole PM set to finish before spawning any architect.
|
|
9
|
+
- One estimate group per run: whole clusters totalling at most `<batch>` rows (SKILL.md *Batch size*, default 50; `all` = every row in one run). The spawns below cover that group only.
|
|
10
|
+
- Cap 10 spawns per message. Over the cap: raise rows per cluster to 20.
|
|
11
|
+
- A failed or empty spawn is `not consulted — <reason>` in §1; its rows stay `_TBD_`. Never fill them from memory. A failed response or `sw-tender-editor` spawn stops the export.
|
|
12
|
+
- Every brief carries the detected Shopware and PHP version **with evidence**, the edition, and the hidden-sheet prohibition.
|
|
13
|
+
- **Delivery rule, in every brief.** Agents with a Write tool (`sw-shopware-architect`, `sw-qa-engineer`, the response agents, `sw-tender-editor`) write their report to the file(s) named in the brief and end their turn with one line (path + sum); those files are the only ones they may write. `sw-product-manager` has no Write tool: it delivers its report as its final message, in numbered parts under 7,000 characters each. A cut report is not a result: ask for the parts again.
|
|
14
|
+
- `sw-tender-editor` delivery: one line back, listing only the file(s) its brief named — never the file's content, never a file it wasn't asked to write.
|
|
15
|
+
- Save every PM report as received to `<work>/pm-C<n>.md`. Architect, QA and `§ROWS` briefs read files, never chat.
|
|
16
|
+
- Shared material (baseline with evidence, plan variants, estimation-model excerpt, class definitions, report format, prohibitions) goes once into `<work>/arch-common.md`; each architect brief points at it plus its cluster file and PM report.
|
|
17
|
+
- Rows are passed by file: `<work>/C<n>.md`, one line each: `<id> | <title> | <requirement> | <acceptance or —> | <priority> | <type> | <reference or —>`. Client context: `<work>/context.md`, `meta.md`, `params.md`, `migration.md`, `integrations.md`, `glossary.md` (`§CONTEXT`, spawned alongside `§EXTRACT`).
|
|
18
|
+
|
|
19
|
+
## §EXTRACT — `sw-tender-editor`, per source file or table (step 3, before any spawn wave)
|
|
20
|
+
|
|
21
|
+
> Extract requirement rows from tender source. Source `<file>`, table `<t>` (`<sheet or section name>`), `<client>`, RFP language `<en|de>`.
|
|
22
|
+
>
|
|
23
|
+
> Read only `<file>` (this table). Never open a hidden sheet, or any sheet, table or file whose name starts with `_` — for an xlsx tender they were never written to a CSV at all. When the tender has an `import-map.json` (an xlsx the user steered), that mapping is **authoritative**: it names this table's id column, its requirement and answer columns and the client's allowed tokens, all confirmed by a human — do not re-derive them. Without a mapping (csv, markdown, pdf), fall back to the heuristic: a requirement table has an id-like column (`ID`, `#`, `Nr.`, values like `GEN-01`) and vendor columns (headers starting *Vendor*, *Bidder*, *Supplier*, *Anbieter*, *Antwort*, or *Compliance / Comment / Effort*). Prose sources (pdf, docx text): mint `R-<n>` with page or paragraph.
|
|
24
|
+
>
|
|
25
|
+
> Write, disjoint from every other `§EXTRACT` spawn:
|
|
26
|
+
> - `<work>/C<n>.md` per cluster (10–20 rows by area, never spanning a table, source order): one line each `<id> | <title> | <requirement> | <acceptance or —> | <priority> | <type> | <reference or —>`.
|
|
27
|
+
> - `<work>/map-<t>.md`: this table's §1 Source-map row — number, sheet or section name, rows, id column, vendor columns verbatim, allowed tokens as the RFP states them, effort unit, locator — plus minted `R-<n>` ids, cells the client prefilled (kept, noted `prefilled`), hidden or `_`-prefixed sheets ignored by name, warnings (missing attachments, truncated text), and, for a non-requirement table, where its content went (`context → §1.1` / `§1.2` / `§8` / `§9` / `unused — <reason>`).
|
|
28
|
+
> - `<work>/context-<t>.md`: context material this spawn happens to see in its own table (cover, profile, constraints, instructions, weights, glossary), or "none". Do **not** write `meta.md`, `params.md`, `migration.md`, `integrations.md` or `glossary.md` — `§CONTEXT` is their only writer, and a second writer loses rows. `§CONTEXT` reads these dumps.
|
|
29
|
+
>
|
|
30
|
+
> Never invent a row, an id or a token that is not in the source; a cell the source leaves blank stays blank, never `_TBD_` at this stage — that marking is the estimating agents' job.
|
|
31
|
+
> Delivery: these files are the only ones this spawn may write. End the turn with one line: table #, row count, cluster files written, id column.
|
|
32
|
+
|
|
33
|
+
## §CONTEXT — `sw-tender-editor`, once for every non-requirement table (step 3, same message as `§EXTRACT`)
|
|
34
|
+
|
|
35
|
+
One spawn, not one per table. The context tables are small (a cover sheet, a profile, a register), and a single key parameter is often stated on two of them — the catalog size on the company sheet, the go-live date on the cover — so one agent has to see them all to fill `params.md` once. It is also the only way the five files have exactly one writer: parallel spawns appending to the same file race and lose rows.
|
|
36
|
+
|
|
37
|
+
> Extract client context from tender source. Source files `<list>`, tables `<t1 …>` (`<sheet or section names>`), `<client>`, RFP language `<en|de>`.
|
|
38
|
+
> Installed Shopware `<version>` (per `<evidence>`), PHP `<version>` (per `<evidence>`).
|
|
39
|
+
>
|
|
40
|
+
> Read only the tables named above (cover, company & context, integrations, migration inventory, glossary, response instructions; a prose tender: the whole document), plus any `<work>/context-<t>.md` dump that already exists — those spawns run beside this one, so read whatever is there and never wait for one. Every value you write comes from the source tables themselves; the dumps only save a second look. Never open a hidden sheet, or any sheet, table or file whose name starts with `_`. Do not read the requirement tables — `§EXTRACT` owns those — except to pick up an interface or a term they name.
|
|
41
|
+
>
|
|
42
|
+
> Write, and these five are the only files you may write, under `<work>`:
|
|
43
|
+
> - `meta.md` — the §1.1 Meta field list (`analysis-template.md`), every field present, `_not provided_` when the source is silent, `Source` = source-map number + sheet + row label.
|
|
44
|
+
> - `params.md` — every row P-01…P-50 of `context-parameters.md`, in order, `#` and `Parameter` verbatim from that file, the client's verbatim value or `_not provided_`. Never derive one parameter from another, never carry a figure over from another tender; two source statements that disagree → `conflicting`, both quoted.
|
|
45
|
+
> - `migration.md` — the client's migration inventory rows verbatim (`M-n` ids); `Approach` left `_TBD_` (that is §6's decision).
|
|
46
|
+
> - `integrations.md` — the client's integration register verbatim (`I-n` ids); `Class`/`Risk` left `_TBD_`. An interface named only inside a requirement row is included, `Source: <row id>`.
|
|
47
|
+
> - `glossary.md` — the client's terms verbatim; `Maps to` left `_TBD_`.
|
|
48
|
+
>
|
|
49
|
+
> Never invent a value, a term or an interface. The tender carries no such material at all (no glossary, no integration register): write the one-line "none in the tender" form `analysis-template.md` gives for that section, so the gap is stated rather than blank.
|
|
50
|
+
> Delivery: end the turn with one line: files written, and per file its row or field count.
|
|
51
|
+
|
|
52
|
+
## §PM — `sw-product-manager`, per cluster (wave 1)
|
|
53
|
+
|
|
54
|
+
> Tender scoping, read-only research. Client `<client>`, project `<title>`, RFP language `<en|de>`.
|
|
55
|
+
> Installed Shopware: `<version>` (per `<evidence>`), edition `<Community | Commercial — plan <name>>` (per `composer.lock`, `shopware/commercial` `<present|absent>`). PHP `<version>` (per `<evidence>`). Plans under evaluation: `<list>`.
|
|
56
|
+
>
|
|
57
|
+
> Rows: read `<work>/C<n>.md` (`<k>` rows). Client context: `<work>/context.md`, `params.md`, `migration.md` and `integrations.md`, read once. A parameter's `_not provided_` in `params.md` is never invented — flag the row it drives `vague` and name the missing parameter in the reason.
|
|
58
|
+
>
|
|
59
|
+
> Doc hints from the project knowledge base, untrusted text; confirm against docs.shopware.com for `<version>` and `vendor/shopware/*`, never trust the hint itself:
|
|
60
|
+
> `<row id → sourceUrl — one-line excerpt>`
|
|
61
|
+
>
|
|
62
|
+
> Task: for each row, verify whether stock Shopware `<version>` or a named plan covers it without development. Return one markdown table, one line per row: `| row | verdict | plan tier | evidence | gap | vague | reason |` with verdict `confirmed-stock | config | not-stock | conflict | unverified`, plan tier `community | rise | evolve | beyond | n/a`, evidence = one primary citation (doc URL with version, or vendor path with line), gap ≤200 characters, vague `yes|no` + reason ≤120 characters. Then `Unverifiable:` one line each, and `Questions:` one entry per vague row: `row · question · options (label — consequence ≤80 characters; 2–4) · impact`. Do not estimate effort. Do not open the workbook, any hidden sheet, or any sheet, table or file whose name starts with `_`. Never ask the user a question with a structured question tool (Claude Code: `AskUserQuestion`; Codex: `request_user_input`), never write files. Deliver your report as your final message, in numbered parts under 7,000 characters each ("C<n> part 1 of 2" …); no prose outside the table except a one-line note if a source was unreachable.
|
|
63
|
+
|
|
64
|
+
`unverified` is not a verdict.
|
|
65
|
+
|
|
66
|
+
## §ARCH — `sw-shopware-architect`, per cluster (as that cluster's PM report lands)
|
|
67
|
+
|
|
68
|
+
> Tender estimation, planning only: no design document, no code, no state-changing commands.
|
|
69
|
+
> Read in this order: `<work>/arch-common.md`; `<work>/C<n>.md` (the rows); `<work>/pm-C<n>.md` (PM verdicts: input, not truth; where your own `vendor/` or KB check disagrees, record it in the row's risks); `<work>/context.md`, `params.md`, `migration.md` and `integrations.md`; `reference/assumption-catalogue.md` of the `sw-discover-tender` skill (themes `<list>`; propose candidates by key or `new`). A parameter's `_not provided_` in `params.md` is never invented — it is a stated risk, or an assumption candidate naming the gap.
|
|
70
|
+
>
|
|
71
|
+
> Return, per row, one table line: `| row | class | mechanism | low | mid | high | level | drivers | risks (weight 1–3) | reuse | assumptions | alternative plan (plan: class low/mid/high) | integration or migration line |`. Class `stock | config | plugin | custom | commitment | service`; mechanism one line cited to a `vendor/` path or KB page for `<version>`, verified with Grep or the KB, never from memory; level `detailed | medium | vague`. Rows with no defensible estimate: `low/mid/high` = `blocked`. Assumptions: one entry per candidate, `<row id | global>: <statement> — PD saved <n> (global: per row) — excludes <what> — risk to <who>, weight 1–3 — class if accepted`. Then `Foundation:` name — PD — attach to row (one line each), and `Open questions:` only what the client or the partner can answer. Do not fold overhead or buffer into your numbers. PD only, never a currency amount. Do not double count with other clusters: `<named overlaps>`.
|
|
72
|
+
>
|
|
73
|
+
> Delivery: WRITE the report to `<work>/arch-C<n>.md` (the only file you may write), under 12,000 characters. End your turn with one line: the path and the sum of mid PD. Do not paste the report into your final message. Do not open the workbook, any hidden sheet, or any sheet, table or file whose name starts with `_`.
|
|
74
|
+
|
|
75
|
+
Re-estimate after a clarification or a source change: same brief, `<work>/C<n>.md` replaced by the affected rows and their `.c` lines, report to `<work>/arch-C<n>-r<k>.md`.
|
|
76
|
+
|
|
77
|
+
## §QA — `sw-qa-engineer`, once (in message 1, with the PM spawns)
|
|
78
|
+
|
|
79
|
+
> Planning only: no commands, no tests written, no files except the one named below.
|
|
80
|
+
> Installed Shopware `<version>` (per `<evidence>`), PHP `<version>` (per `<evidence>`). Read `<work>/arch-common.md` and `<work>/context.md`, then these rows from the cluster files: `<quality, test concept, load and performance testing, security testing, accessibility testing rows>`. Partner QA overhead in the profile: `<n>%`.
|
|
81
|
+
> Return: a test-concept outline in ≤15 lines; per row one table line `| row | class (service | commitment | custom) | mechanism (tooling) | low | mid | high | drivers |`; one line stating whether `<n>%` QA overhead is plausible for `<total dev PD>` and why; `Risks:` with weight 1–3. PD only, never a currency amount.
|
|
82
|
+
> Delivery: WRITE to `<work>/qa.md` (the only file you may write), under 6,000 characters; end your turn with one line (path + mid-PD sum). Do not open any hidden sheet, or any sheet, table or file whose name starts with `_`.
|
|
83
|
+
|
|
84
|
+
## §ROWS — `sw-tender-editor`, per cluster (as that cluster's architect report lands, parallel)
|
|
85
|
+
|
|
86
|
+
> Join cluster C<n> into finished §4 row blocks. `<analysis>` grammar: `analysis-template.md`.
|
|
87
|
+
>
|
|
88
|
+
> Read only: `<work>/C<n>.md`, `<work>/pm-C<n>.md`, `<work>/arch-C<n>.md`, `<work>/qa.md` (only when it holds rows of this cluster), `reference/estimation-model.md` and `reference/assumption-catalogue.md`, both in this skill's directory.
|
|
89
|
+
>
|
|
90
|
+
> Join rules (same rules as the former §MERGE, now executed here):
|
|
91
|
+
> - Join by row id. Class from the PM verdict unless the architect cites a concrete gap with a mechanism; PD from the architect (QA for its rows). Foundation PD is added to the row it attaches to, on low, mid and high alike, and named in that row's Text.
|
|
92
|
+
> - `vague` = PM vague OR architect level `vague`.
|
|
93
|
+
> - `unverified` → evidence `unverified`; class from the architect's mechanism.
|
|
94
|
+
> - PM stock/config vs architect custom (or the reverse) → `K-n` with the resolution; a swing above 2× on a Must row → `Q-n`. Plugin vs config is not a conflict.
|
|
95
|
+
> - Architect open questions only the client can answer → `CQ-n` candidates; only the partner → `Q-n` candidates; anything else is dropped.
|
|
96
|
+
> - Assumption candidates: de-duplicate by statement; a candidate naming one row becomes `<ROW>.a<n>` under that row; a candidate naming several rows or `global` becomes `A-n` with PD saved per row. Every line is written as `[ ]` with its PD saved, risk to and class-if-accepted. Nothing is applied.
|
|
97
|
+
>
|
|
98
|
+
> Write, in analysis-template grammar exactly:
|
|
99
|
+
> - `<work>/rows-C<n>.md`: the finished §4 lines for this cluster's rows — each `req` line plus its `.a` lines, ready to splice verbatim.
|
|
100
|
+
> - `<work>/tail-C<n>.md`: at most 25 lines — PD by area and by priority for this cluster, `A-n` candidates, `K-n` conflicts, CQ/Q candidates. The orchestrator reads only this file, never `pm-C<n>.md` or `arch-C<n>.md` directly, so keep it complete.
|
|
101
|
+
>
|
|
102
|
+
> Delivery: these two files are the only ones this spawn may write. End the turn with one line: both paths, row count, mid-PD sum.
|
|
103
|
+
|
|
104
|
+
## §SPLICE — `sw-tender-editor`, per cluster (sequential)
|
|
105
|
+
|
|
106
|
+
> Splice cluster C<n>'s finished rows into `<analysis>` §4. Run these spawns one at a time — only one writer may touch the analysis file at once; the page watcher re-renders on every write.
|
|
107
|
+
>
|
|
108
|
+
> Read `<work>/rows-C<n>.md` and the current `<analysis>`. By Edit, replace this cluster's rows in §4 — the lines whose status is `queued` or `analysing` for the ids listed — with the content of `<work>/rows-C<n>.md`, in place.
|
|
109
|
+
>
|
|
110
|
+
> Never touch: any other cluster's rows, any other section, the frontmatter, a frozen `accepted`/`rejected` line, a `[x]`/`[-]` a human wrote, or a `[ ]` line marked `partner`. §1.1, §1.2, §8 and §9 are never touched by this brief and must survive byte-identical. After the write, all nine sections of the analysis file must remain present and parseable.
|
|
111
|
+
>
|
|
112
|
+
> Delivery: `<analysis>` is the only file this spawn may write. End the turn with one line: rows spliced.
|
|
113
|
+
|
|
114
|
+
## §MERGE
|
|
115
|
+
|
|
116
|
+
Retired — the join rules formerly here are now executed by `§ROWS`, one spawn per cluster, writing directly to `<work>/rows-C<n>.md` and `<work>/tail-C<n>.md`.
|
|
117
|
+
|
|
118
|
+
## §RESP — general-purpose agent, per cluster (export)
|
|
119
|
+
|
|
120
|
+
> Response CSV for cluster C<n> of `<rfp>`. Read `reference/response-rules.md` of the `sw-discover-tender` skill first, then `<work>/resp-common.md` (client header row verbatim, delimiter, quoting, BOM, allowed compliance tokens, RFP language, overhead and buffer as applied), `<work>/C<n>.md` (source rows in order), and in `<analysis>` the §4 lines of those rows and the §3 lines naming them. §1.1, §1.2, §8 and §9 are analysis context, never a response table — do not read them for this file. Context cells come from the source export `<source path>` (the file the analysis read, never the workbook), copied unchanged.
|
|
121
|
+
> Write `<work>/resp-C<n>.csv`: no header, one line per source row in source order, every client column; context cells unchanged; compliance, comment and effort per the rules; every other vendor cell empty. Only `accepted` assumption lines and `.c` / `RC-n` clarifications may appear in a comment, in plain words, no ids. Never open the workbook, a hidden sheet or a `_`-prefixed file; never invent a token or a figure; never a currency amount.
|
|
122
|
+
> Delivery: that file is the only one you may write. End your turn with one line: path + row count.
|
|
123
|
+
|
|
124
|
+
## §ASSEMBLE — `sw-tender-editor`, per client table (export, after §RESP)
|
|
125
|
+
|
|
126
|
+
> Assemble and check the final response CSV for table `<n>` (`<table-slug>`) of `<rfp>`. Run after every `§RESP` spawn for this table's clusters has returned.
|
|
127
|
+
>
|
|
128
|
+
> Read `<work>/resp-common.md` (client header row verbatim, delimiter, quoting, BOM, allowed compliance tokens) and each `<work>/resp-C<n>.csv` for this table, in source order.
|
|
129
|
+
>
|
|
130
|
+
> Write `<source basename>-response-<n>-<table-slug>.csv`: the client's header row verbatim, then this table's cluster CSVs concatenated in source order, no blank lines, no totals row.
|
|
131
|
+
>
|
|
132
|
+
> Then check the file just written: row count and id sequence equal the source table; header equals the client's; every compliance value in the allowed list; every effort cell numeric or empty with the blocked comment; no `A-`, `CQ-`, `Q-`, `RC-`, `.a`, `.c`, `PD saved`, `EUR`, `€`; no proposed or rejected assumption text; constant column count across every row; no §1.1, §1.2, §8 or §9 content — they are analysis context, never a response table. (The effort-sums-equal-§2 check stays with the orchestrator, which holds §2.)
|
|
133
|
+
>
|
|
134
|
+
> Any check failing → delete the file, do not leave a partial one.
|
|
135
|
+
> Delivery: that file is the only one you may write (and delete, on a failed check). End your turn with one line: path · rows · effort sum per priority (Must / Should / Could) · pass — or, on failure, the single failing check.
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Analysis template
|
|
2
|
+
|
|
3
|
+
Copy verbatim, fill, delete every `<!-- -->` hint. The document is written in stages (SKILL.md *Staged writes*): the first write carries §1 complete — including §1.1 Meta, §1.2 Company & context, §8 Integrations and §9 Glossary, which need no estimate — plus every source row as a `queued` `req` line, with §2/§3/§5/§6/§7 `_TBD_`. Every later write must leave all nine sections and the four §1 subsections in place and parseable — a live page re-renders on each one. Section numbers, subsection numbers and titles are fixed; the rubric, reconciliation, the editor's tabs and the export key off them. Unknown content stays `_TBD_`; a parameter the tender does not state is `_not provided_`; an empty section is a signal, an invented one is a defect. Every assumption line is written as `[ ]`.
|
|
4
|
+
|
|
5
|
+
The nine sections mirror the client's own document where it has one: §1.1 Meta and §1.2 Company & context, §4 grouped by source table, §8 Integrations and §9 Glossary are the tender's material; §2, §3, §5, §6 and §7 are ours.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
---
|
|
11
|
+
rfp: RFP-NNNN
|
|
12
|
+
kind: rfp # rfp | rfi | rfq
|
|
13
|
+
client: <name>
|
|
14
|
+
source:
|
|
15
|
+
- {file: <name as given>, size: <bytes>, sha256: <hex>}
|
|
16
|
+
shopware: <version> <edition> (<evidence>); PHP <version> (<evidence>)
|
|
17
|
+
status: Draft # Draft | Review | Ready to submit
|
|
18
|
+
batch: 50 # requirement rows per estimate run; all = one run for the whole document
|
|
19
|
+
confidence: 0
|
|
20
|
+
updated: YYYY-MM-DD
|
|
21
|
+
counts:
|
|
22
|
+
rows: 0
|
|
23
|
+
assumptions: {proposed: 0, accepted: 0, rejected: 0, suspect: 0}
|
|
24
|
+
questions: {client: 0, blocking: 0, partner: 0, high: 0}
|
|
25
|
+
clarifications: 0
|
|
26
|
+
export: {date: null, files: [], source_sha256: null, stale: false}
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# RFP-NNNN — <Client> — <Project>
|
|
30
|
+
|
|
31
|
+
## 1. Context
|
|
32
|
+
|
|
33
|
+
### 1.1 Meta
|
|
34
|
+
|
|
35
|
+
Every field below is present. The tender is silent: `_not provided_`. Values are the client's words, dates as the client wrote them (their time zone kept).
|
|
36
|
+
|
|
37
|
+
| Field | Value | Source |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| RFP reference | <!-- HIB-RFP-2026-03 --> | <!-- 1 Cover · RFP reference --> |
|
|
40
|
+
| Kind | <!-- rfp / rfi / rfq, as the document calls itself --> | |
|
|
41
|
+
| Issuing company | | |
|
|
42
|
+
| Address | | |
|
|
43
|
+
| Contact | <!-- name, role, address as given --> | |
|
|
44
|
+
| Technical contact | | |
|
|
45
|
+
| Date of issue | | |
|
|
46
|
+
| Questions until | <!-- with the answer-distribution rule if stated --> | |
|
|
47
|
+
| Proposal due | | |
|
|
48
|
+
| Vendor presentations | | |
|
|
49
|
+
| Contract award | | |
|
|
50
|
+
| Kickoff | | |
|
|
51
|
+
| Go-live | <!-- and whether it is fixed or a target, if stated --> | |
|
|
52
|
+
| Response instructions | <!-- which columns to fill, which documents to submit, page limits --> | |
|
|
53
|
+
| Compliance tokens | <!-- the client's own token list verbatim, or "none stated; scale: …" --> | |
|
|
54
|
+
| Effort unit | <!-- PD / hours / none stated --> | |
|
|
55
|
+
| Evaluation weights | | |
|
|
56
|
+
| Deliverables | | |
|
|
57
|
+
| Confidentiality | | |
|
|
58
|
+
| Attachments | <!-- listed by name; note which are referenced but not supplied --> | |
|
|
59
|
+
| Out of scope per RFP | <!-- the client's own exclusions; each also an X-n in §3 --> | |
|
|
60
|
+
| Budget as stated | <!-- verbatim, or "none stated". Context only: never compared, never priced --> | |
|
|
61
|
+
|
|
62
|
+
### 1.2 Company & context
|
|
63
|
+
|
|
64
|
+
**Profile.** <!-- business, customers, markets, sales organisation — the client's own summary in two or three lines -->
|
|
65
|
+
|
|
66
|
+
**Current landscape.** <!-- shop platform and version, ERP, other systems, today's integration — one line each -->
|
|
67
|
+
|
|
68
|
+
**Pain points and goals.** <!-- what the client says is broken, and the goals/KPIs they state -->
|
|
69
|
+
|
|
70
|
+
**Constraints.** <!-- what the client fixes: leading system, who designs, cutover model, out of scope. Budget stays in §1.1 -->
|
|
71
|
+
|
|
72
|
+
**Key parameters.** The fixed template is `reference/context-parameters.md` in this skill's directory: every row P-01…P-50 is present, in order, whether or not the tender states it. Never derived from another row, never carried over from another tender.
|
|
73
|
+
|
|
74
|
+
| # | Parameter | Value | Source | Drives | Status |
|
|
75
|
+
| --- | --- | --- | --- | --- | --- |
|
|
76
|
+
| P-01 | Sellable SKUs / variants | <!-- 25,000 --> | <!-- 2 Company & Context · Volumes/Products --> | import, indexing, migration, search | stated |
|
|
77
|
+
| P-12 | Customer-specific price rows | _not provided_ | — | price sync volume, performance | _not provided_ ⚠ CQ-7 |
|
|
78
|
+
|
|
79
|
+
**Migration inventory.** The client's own inventory, verbatim; the approach column is ours. Volumes live here and are cited, never restated, by §6.
|
|
80
|
+
|
|
81
|
+
| # | Object | Source | Volume | Must migrate | Approach | Rows | Notes |
|
|
82
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
83
|
+
| M-1 | <!-- products and variants --> | <!-- SW5 database + ERP --> | <!-- 25,000 SKUs / 6,000 parents --> | <!-- Yes / No / Partly / Should, client's word --> | <!-- ours, one line; "_TBD_" until §6 decides --> | <!-- MIG-01, INT-01 --> | |
|
|
84
|
+
|
|
85
|
+
No inventory in the tender: one line `No migration inventory in the tender` and, when the tender asks for a migration at all, a `CQ-n` per P-44.
|
|
86
|
+
|
|
87
|
+
### 1.3 Source map
|
|
88
|
+
|
|
89
|
+
| # | Table (sheet / section) | Rows | Id column | Vendor columns (client's words) | Tokens | Effort unit | Locator |
|
|
90
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
91
|
+
| 2 | <!-- 2 Requirements --> | <!-- 91 --> | ID | <!-- every vendor column verbatim; cost columns listed, never filled --> | <!-- Stock, Config, Plugin, Custom, Not offered — or "none stated; scale: …" --> | PD | <!-- rows 2–92 / page 4–9 --> |
|
|
92
|
+
|
|
93
|
+
Every table in the source appears here exactly once, including the ones that carry no requirement row: its `Rows` count stands, its Id column is `—`, and its Vendor columns cell says where its content went — `context → §1.1`, `context → §1.2`, `context → §8`, `context → §9`, or `unused — <reason>`. A table is never silently dropped.
|
|
94
|
+
|
|
95
|
+
Minted IDs: <!-- R-1..R-n for prose sources with page or paragraph, or "none" --> · Prefilled vendor cells: <!-- none | rows … (kept) --> · Ignored: <!-- hidden or _-prefixed sheets by name, or "none" --> · Warnings: <!-- missing attachments, truncated text, or "none" -->
|
|
96
|
+
|
|
97
|
+
### 1.4 Ground truth
|
|
98
|
+
|
|
99
|
+
Shopware <!-- version, edition, evidence --> · Project plugins <!-- name: covers, or "none" --> · Partner assets <!-- from the profile, or "none" --> · Prior analyses reused <!-- rfp-NNNN <ID> → row, or "none" --> · KB pages <!-- one line --> · Agents <!-- PM clusters …; architect clusters …; QA yes|no; not consulted — <reason> -->
|
|
100
|
+
|
|
101
|
+
## 2. Summary
|
|
102
|
+
|
|
103
|
+
| Scope | PD |
|
|
104
|
+
| --- | --- |
|
|
105
|
+
| Must (fixed-price scope) | |
|
|
106
|
+
| Should | |
|
|
107
|
+
| Could | |
|
|
108
|
+
| of which Services | |
|
|
109
|
+
| **Total** | |
|
|
110
|
+
|
|
111
|
+
By area: <!-- area: PD, … — must add up to the priority totals --> · Foundation efforts: <!-- name → row (PD) --> · Overhead / buffer: <!-- n% folded · buffer n% separate · level buffers 0/10/25%, or "_TBD_ — PD stated before overhead and buffer" --> · Plan variants: <!-- Evolve: Must n · Community: Must n, or "single variant" --> · Blocking rows: <!-- ids, or "none" -->
|
|
112
|
+
|
|
113
|
+
| Dimension | Weight | Score | Points |
|
|
114
|
+
| --- | --- | --- | --- |
|
|
115
|
+
| Coverage evidence | 20 | 0 | 0.0 |
|
|
116
|
+
| Estimate basis | 20 | 0 | 0.0 |
|
|
117
|
+
| Scope lock | 20 | 0 | 0.0 |
|
|
118
|
+
| Platform decision | 15 | 0 | 0.0 |
|
|
119
|
+
| Integration & migration | 15 | 0 | 0.0 |
|
|
120
|
+
| Consistency | 10 | 0 | 0.0 |
|
|
121
|
+
| **Total** | **100** | | **0%** |
|
|
122
|
+
|
|
123
|
+
Weakest dimension: <!-- name — what raises it; every status blocker by id -->
|
|
124
|
+
|
|
125
|
+
## 3. Global assumptions
|
|
126
|
+
|
|
127
|
+
Lines no single row owns. Same status grammar as §4.
|
|
128
|
+
|
|
129
|
+
| ID | Kind | Rows | Statement | PD saved | Risk to | Status |
|
|
130
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
131
|
+
| A-1 | assume | <!-- GEN-06, STF-01..STF-10 --> | <!-- rewritten for this tender --> | <!-- per row: STF-01 −5 · STF-03 −3 --> | client | [ ] |
|
|
132
|
+
| X-1 | exclude | <!-- GEN-04 --> | <!-- what the RFP itself excludes, restated --> | | | rfp |
|
|
133
|
+
| RC-1 | clarify | <!-- rows --> | <!-- decision --> | | client, CQ-5 | YYYY-MM-DD |
|
|
134
|
+
|
|
135
|
+
## 4. Requirement analysis
|
|
136
|
+
|
|
137
|
+
| ID | Kind | Prio | Class | L/M/H | Lvl | PD | Text | Evidence / risk | Status |
|
|
138
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
139
|
+
| STF-03 | req | Must | custom | 12/16/22 | vague | 17.5 | <!-- mechanism, one line; "Includes foundation: <name> (n PD)" --> | <!-- pm: not-stock (…); arch: vendor path / KB page; unverified; reuse: rfp-NNNN ID --> | estimated, CQ-3 |
|
|
140
|
+
| STF-03.a1 | assume | | | | | −5 | <!-- statement --> | risk to client | [ ] |
|
|
141
|
+
| STF-03.a2 | assume | | config | | | −2 | <!-- statement --> | risk to client | accepted YYYY-MM-DD |
|
|
142
|
+
| STF-03.c1 | clarify | | | | | | <!-- decision --> | client, CQ-3 | YYYY-MM-DD |
|
|
143
|
+
|
|
144
|
+
Kinds: `req` one per source row · `assume` `<ROW>.a<n>` · `clarify` `<ROW>.c<n>`. Req status: `queued` (extracted, not yet estimated — PD and L/M/H empty) · `analysing` (its agents are running) · `estimated` · `estimated, CQ-n` (estimated, with an open question named; the estimate's condition is a `[ ]` assumption line under the row) · `blocked, CQ-n` or `blocked, Q-n` (PD empty; a partner question blocks the same way) · `prefilled`. There is no `provisional` status: a row is either estimated — under stated assumptions and, where needed, an open question — or blocked. A finished run leaves no `queued` or `analysing` row. Assume status: `[ ]` · `[x]` · `[-]` · `accepted YYYY-MM-DD` · `rejected YYYY-MM-DD` · `[ ] suspect`. Class on an assume line = the class the row takes once accepted. Lvl `detailed | medium | vague`.
|
|
145
|
+
|
|
146
|
+
## 5. Open questions
|
|
147
|
+
|
|
148
|
+
### CQ-1 · <!-- rows --> · blocking: <!-- yes | no -->
|
|
149
|
+
<!-- question, RFP language, one decision -->
|
|
150
|
+
- [ ] A — <!-- option: effect on scope in plain words -->
|
|
151
|
+
- [ ] B — <!-- option -->
|
|
152
|
+
- [ ] Other:
|
|
153
|
+
Until answered we assume <!-- option, or "no effort stated" -->.
|
|
154
|
+
|
|
155
|
+
### Q-1 · <!-- high | medium | low --> · <!-- rows or § -->
|
|
156
|
+
<!-- question the partner can answer -->
|
|
157
|
+
- [ ] A — <!-- option (recommended): consequence in PD -->
|
|
158
|
+
- [ ] B — <!-- option -->
|
|
159
|
+
- [ ] Other:
|
|
160
|
+
Until answered we assume <!-- option -->.
|
|
161
|
+
|
|
162
|
+
Not sent — cap: <!-- row ids, or "none" -->
|
|
163
|
+
|
|
164
|
+
## 6. Approach
|
|
165
|
+
|
|
166
|
+
| Item | Decision | Reason (rows served, source) | Alternative · PD delta |
|
|
167
|
+
| --- | --- | --- | --- |
|
|
168
|
+
| Plan | <!-- Community / Rise / Evolve / Beyond --> | | <!-- Community: +n PD --> |
|
|
169
|
+
| Hosting | | | |
|
|
170
|
+
| PSP | | | |
|
|
171
|
+
| CMP | | | |
|
|
172
|
+
|
|
173
|
+
| Interface | Pattern | Owner split | Risk |
|
|
174
|
+
| --- | --- | --- | --- |
|
|
175
|
+
| <!-- ERP → shop master data --> | <!-- queue consumers, idempotent upserts --> | <!-- bidder: shop side; ERP partner: API pages --> | <!-- one line --> |
|
|
176
|
+
|
|
177
|
+
| Migration object | Approach | Volume | Tool | Reuse |
|
|
178
|
+
| --- | --- | --- | --- | --- |
|
|
179
|
+
| <!-- products --> | | | | |
|
|
180
|
+
|
|
181
|
+
## 7. Log
|
|
182
|
+
|
|
183
|
+
Append-only. Never a transcript.
|
|
184
|
+
|
|
185
|
+
| ID | Date | Topic | Decision |
|
|
186
|
+
| --- | --- | --- | --- |
|
|
187
|
+
| C-1 | YYYY-MM-DD | <!-- accepted / rejected / answered / suspect / exported / partner decision --> | <!-- one line, ids named --> |
|
|
188
|
+
| K-1 | YYYY-MM-DD | <!-- PM vs architect on B2B-03 --> | <!-- resolved: … / → Q-n --> |
|
|
189
|
+
|
|
190
|
+
## 8. Integrations
|
|
191
|
+
|
|
192
|
+
The client's integration register, verbatim; `Class` and `Risk` are ours. One line per interface the tender names, in source order. §6's Interface table decides the pattern and the owner split and cites these numbers instead of repeating them.
|
|
193
|
+
|
|
194
|
+
| # | System | Direction | Objects | Frequency | Protocol | Counterpart owner | Rows | Class | Risk |
|
|
195
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
196
|
+
| I-1 | <!-- Microsoft Dynamics 365 Business Central --> | <!-- ERP → shop, client's arrow kept --> | <!-- products, prices, stock --> | <!-- nightly full, 15-min delta --> | <!-- OData v4 REST --> | <!-- client's ERP partner --> | <!-- INT-01, CAT-01..CAT-10 --> | <!-- stock / config / plugin / custom / service, or _TBD_ before the estimate --> | <!-- one line, or "—" --> |
|
|
197
|
+
|
|
198
|
+
No integration table in the tender: one line `No integration register in the tender`, and every interface named inside a requirement row still gets a line here, `Source: <row id>` in Notes-position of the `#` cell. This section is never exported; it is not a response table.
|
|
199
|
+
|
|
200
|
+
## 9. Glossary
|
|
201
|
+
|
|
202
|
+
The client's terms, verbatim, in the client's order. `Maps to` is ours: the Shopware or partner vocabulary the term corresponds to, and the row ids that use it — this is the mapping the Tender Discovery Tool shows on the requirement rows.
|
|
203
|
+
|
|
204
|
+
| Term | Meaning | Maps to |
|
|
205
|
+
| --- | --- | --- |
|
|
206
|
+
| <!-- PU / Packaging unit --> | <!-- the client's definition, verbatim --> | <!-- purchase unit / `purchaseUnit`, `referenceUnit` · CAT-07, CHK-02 --> |
|
|
207
|
+
|
|
208
|
+
A term the client defines but nothing in Shopware matches: `Maps to` = `no equivalent — <one line>`. A term we cannot map yet: `_TBD_`. Never invent a definition, never correct the client's. No glossary in the tender: one line `No glossary in the tender`. This section is never exported; it is not a response table.
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
Status grammar:
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
[ ] proposed --human--> [x] | [-] --next run--> accepted YYYY-MM-DD (frozen, PD applied, row recomputed, C-n)
|
|
217
|
+
rejected YYYY-MM-DD (row at full scope, C-n)
|
|
218
|
+
source sha256 changed --next run--> affected accepted lines become [ ] suspect (C-n)
|
|
219
|
+
question option ticked --next run--> .c line under each row named, or RC-n in §3; the block dissolves (C-n)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Every source row has one `req` line; none is dropped to shorten the file. A `_TBD_` cell is a truthful gap; a guessed one reaches the client as a wrong number. `_not provided_` in §1.2 is the same promise about the tender: it says the client never stated the figure, not that the figure is zero or unknown to us.
|
|
223
|
+
|
|
224
|
+
Export (SKILL.md step 9) reads §1.3, §2 and §4 only. §1.1, §1.2, §8 and §9 are analysis context and are never written into a response CSV.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Scope-lock assumption catalogue
|
|
2
|
+
|
|
3
|
+
Starting points, not answers. The architect proposes candidates by key (or `new`), each naming its row id or `global`; the statement is rewritten for the tender at hand and lands as a `[ ]` line: `<ROW>.a<n>` under its row, or `A-n` in §3 when no single row owns it. A statement that the RFP already makes is an exclusion `X-n` in §3 (0 PD), not an assumption.
|
|
4
|
+
|
|
5
|
+
**PD saved** is the typical reduction against the unassumed mid estimate for a mid-size B2B replatforming; the architect states the real figure per RFP. **Risk shifted to** names who carries the consequence if the assumption fails. **Not when** lists the RFP conditions under which the key must not be proposed.
|
|
6
|
+
|
|
7
|
+
## PLAT — platform and edition
|
|
8
|
+
|
|
9
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
10
|
+
| --- | --- | --- | --- | --- |
|
|
11
|
+
| K-PLAT-01 | Target is the current Shopware 6.x minor at kickoff; no core modifications; all customisation in plugins, apps and the theme. | 0 (creep guard) | none | RFP pins an older version |
|
|
12
|
+
| K-PLAT-02 | "Headless-ready" means Store API discipline in all custom code; no SPA or composable frontend is delivered (`<rows>`). | 20–40 | client | RFP names a headless frontend deliverable |
|
|
13
|
+
| K-PLAT-03 | One sales channel per country/language pair the RFP lists, one currency; further channels, languages or currencies are change requests. | 3–8 | client | — |
|
|
14
|
+
| K-PLAT-04 | Commercial plan features are used as shipped; changes to their UI or flows are out of scope (`<rows>`). | 10–30 | client | an acceptance criterion contradicts stock behaviour |
|
|
15
|
+
| K-PLAT-05 | Minor updates within the project; the first major upgrade belongs to maintenance. | 0 (creep guard) | none | — |
|
|
16
|
+
|
|
17
|
+
## ERP — integration
|
|
18
|
+
|
|
19
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
20
|
+
| --- | --- | --- | --- | --- |
|
|
21
|
+
| K-ERP-01 | The ERP partner implements the ERP-side endpoints from an interface specification the bidder writes; the bidder builds the shop side only (`<rows>`). | 10–20 | ERP partner | bidder is asked to deliver both sides |
|
|
22
|
+
| K-ERP-02 | One synchronisation pattern for all objects: queue consumers, idempotent upserts keyed by external id; no middleware or iPaaS. | 5–15 | none | RFP requires an iPaaS |
|
|
23
|
+
| K-ERP-03 | Sync failures: automatic retry, admin notification, admin list with manual retry; no reconciliation or diff UI. | 5–10 | client ops | — |
|
|
24
|
+
| K-ERP-04 | Customer-specific and tier prices are imported asynchronously (full, delta, webhook as the RFP states); no live ERP price call per page view. | 8–15 | client (staleness inside the sync window) | RFP demands per-request live prices |
|
|
25
|
+
| K-ERP-05 | Real-time checks (credit limit, branch stock) use exactly the timeout and fallback the RFP states; no additional fallback logic. | 0–3 | none | — |
|
|
26
|
+
| K-ERP-06 | Field mapping is fixed in one mapping workshop; fields absent from the ERP partner's API list on that date are change requests. | 3–5 | client | — |
|
|
27
|
+
|
|
28
|
+
## DSGN — design and theme
|
|
29
|
+
|
|
30
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
31
|
+
| --- | --- | --- | --- | --- |
|
|
32
|
+
| K-DSGN-01 | The client's agency delivers final, approved designs per page type before the sprint that builds it; one revision round included; later changes are change requests. | 10–15 | client | bidder owns design |
|
|
33
|
+
| K-DSGN-02 | The theme extends the default Storefront theme; stock components are restyled, not rebuilt; breakpoints as the RFP lists, no pixel-perfect commitment beyond them. | 5–10 | client | — |
|
|
34
|
+
| K-DSGN-03 | Printable product sheet = browser print stylesheet; no server-side PDF generation (`<rows>`). | 3–6 | client | RFP requires a downloadable PDF with branding |
|
|
35
|
+
| K-DSGN-04 | The design feasibility review covers implementability in Shopware, not UX advice; at most `<n>` page templates. | 2–4 | client | — |
|
|
36
|
+
|
|
37
|
+
## MIG — content and data migration
|
|
38
|
+
|
|
39
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
40
|
+
| --- | --- | --- | --- | --- |
|
|
41
|
+
| K-MIG-01 | Content, blog and landing pages are rebuilt by client marketing in Shopping Experiences after training; the bidder delivers `<n>` layouts and migrates `<m>` pages as examples (`<rows>`). | 8–15 | client | RFP demands 1:1 migration with acceptance |
|
|
42
|
+
| K-MIG-02 | The SEO redirect map is generated from the URL export the client provides; the bidder imports it and tests the list the RFP names. | 3–5 | client | — |
|
|
43
|
+
| K-MIG-03 | Historical orders are migrated read-only for display; no reorder from migrated lines, no document regeneration. | 5–10 | client | an acceptance criterion requires reorder from migrated orders |
|
|
44
|
+
| K-MIG-04 | Product documents stay in the ERP or document storage and are linked, not migrated as media (`<rows>`). | 5–10 | ERP partner | — |
|
|
45
|
+
| K-MIG-05 | Passwords are re-hashed on first login through a legacy encoder; no forced reset campaign; accounts inactive for more than `<n>` years are not migrated. | 1–3 | client | — |
|
|
46
|
+
| K-MIG-06 | Objects the RFP marks "not migrated" (reviews, vouchers, newsletter recipients) are exclusions. | 0 | none | — |
|
|
47
|
+
| K-MIG-07 | One migration rehearsal on staging and one production cutover; further rehearsals are change requests. | 3–8 | shared | RFP prescribes more rehearsals |
|
|
48
|
+
|
|
49
|
+
## B2B — accounts, approval, quotes
|
|
50
|
+
|
|
51
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
52
|
+
| --- | --- | --- | --- | --- |
|
|
53
|
+
| K-B2B-01 | Employee roles, order approval and budgets use B2B Components as shipped; one threshold type per company (`<rows>`). | 15–30 | client | Community plan chosen |
|
|
54
|
+
| K-B2B-02 | Quotes use stock quote management; one counter-offer cycle, no negotiation thread. | 5–10 | client | Community plan chosen |
|
|
55
|
+
| K-B2B-03 | Quick order = manual multi-row entry plus paste/CSV `sku;qty`; XLSX upload only if stock supports it. | 3–6 | client | RFP acceptance names XLSX |
|
|
56
|
+
| K-B2B-04 | One company hierarchy level (company → employees); cost centres are a list attribute, not organisational units. | 5–15 | client | RFP names multi-level units |
|
|
57
|
+
| K-B2B-05 | Order on behalf uses the stock imitate-customer capability; audit = order flag plus admin log, no separate report. | 2–5 | client | — |
|
|
58
|
+
| K-B2B-06 | Registration approval happens in the shop admin; the ERP writes back the customer number; approval never happens in the ERP. | 3–6 | client process | RFP requires approval in the ERP |
|
|
59
|
+
|
|
60
|
+
## SRCH — search
|
|
61
|
+
|
|
62
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
63
|
+
| --- | --- | --- | --- | --- |
|
|
64
|
+
| K-SRCH-01 | Search = stock OpenSearch/Elasticsearch integration with field boosting on the identifiers the RFP names; no machine-learned ranking, no personalisation (`<rows>`). | 10–20 | client | — |
|
|
65
|
+
| K-SRCH-02 | Synonyms and stop words are maintained by the client in the admin; the bidder migrates the existing list once. | 2–4 | client | — |
|
|
66
|
+
| K-SRCH-03 | "As good as `<competitor>`" is replaced by measurable acceptance: exact-match identifier search opens the product, prefix suggestions, typo tolerance of one edit. | makes the row estimable | client | client rejects the acceptance in `CQ-n` |
|
|
67
|
+
|
|
68
|
+
## OPS — hosting, operations, security
|
|
69
|
+
|
|
70
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
71
|
+
| --- | --- | --- | --- | --- |
|
|
72
|
+
| K-OPS-01 | Managed Shopware hosting from `<profile.hosting>`; availability, backup and restore per the provider's SLA; the bidder is not liable for infrastructure SLAs (`<rows>`). | 5–10 | provider | RFP requires bidder-operated infrastructure |
|
|
73
|
+
| K-OPS-02 | The penetration test is commissioned and paid by the client; findings are fixed within the warranty as the RFP states; one retest cycle. | 0 | client | — |
|
|
74
|
+
| K-OPS-03 | CI/CD on the client's repository with the bidder's standard pipeline (lint, static analysis, tests, build, deploy); further gates are change requests. | 3–5 | none | — |
|
|
75
|
+
| K-OPS-04 | Monitoring and alerting = provider stack plus Shopware admin notifications; no custom dashboards. | 3–6 | client ops | — |
|
|
76
|
+
| K-OPS-05 | One load test before go-live against the RFP's stated profile; tuning limited to configuration (cache, workers, indexes). | 2–5 | shared | — |
|
|
77
|
+
|
|
78
|
+
## CMPL — compliance and accessibility
|
|
79
|
+
|
|
80
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
81
|
+
| --- | --- | --- | --- | --- |
|
|
82
|
+
| K-CMPL-01 | Accessibility conformance covers templates and components the bidder builds; client-authored content, third-party widgets and manufacturer PDFs are excluded (`<rows>`). | 5–10 | client | — |
|
|
83
|
+
| K-CMPL-02 | Consent management = `<profile.cmp>` stock plugin; no custom consent UI; tag configuration by client marketing. | 2–4 | client | — |
|
|
84
|
+
| K-CMPL-03 | Invoices, credit notes and e-invoices are produced by the ERP; the shop displays and links them and never generates fiscal documents (`<rows>`). | 8–15 | ERP partner | RFP wants shop-generated invoices |
|
|
85
|
+
| K-CMPL-04 | Legal texts are supplied by the client in every language; the bidder places them. | 1–2 | client | — |
|
|
86
|
+
| K-CMPL-05 | Data-subject requests use stock export and anonymisation; no custom workflow UI. | 2–4 | client | — |
|
|
87
|
+
|
|
88
|
+
## PAY / SHP — payment and shipping
|
|
89
|
+
|
|
90
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
91
|
+
| --- | --- | --- | --- | --- |
|
|
92
|
+
| K-PAY-01 | Payment on account = stock payment method with rule-based availability from synced ERP flags; payment terms shown from a synced text field. | 2–4 | none | — |
|
|
93
|
+
| K-PAY-02 | Cards and wallets via the official plugin of `<profile.psp>` with a hosted payment page; no custom PSP integration. | 3–8 | PSP | RFP names a PSP without an official plugin |
|
|
94
|
+
| K-SHP-01 | Shipping methods and prices via stock methods and rules from the client's shipping table; no carrier API, no label printing in the shop. | 5–10 | none | RFP requires labels from the shop |
|
|
95
|
+
| K-SHP-02 | Branch pickup = shipping method plus an availability text from a synced branch-stock field; no reservation or transfer logic in the shop. | 3–6 | client | — |
|
|
96
|
+
|
|
97
|
+
## PROJ — project
|
|
98
|
+
|
|
99
|
+
| Key | Statement | PD saved | Risk → | Not when |
|
|
100
|
+
| --- | --- | --- | --- | --- |
|
|
101
|
+
| K-PROJ-01 | The client names one product owner with decision authority and a two-working-day answer SLA; decisions past the SLA are scheduled at the bidder's discretion. | 0 (schedule) | client | — |
|
|
102
|
+
| K-PROJ-02 | Acceptance per sprint against the RFP's acceptance criteria; anything outside an RFP row or an accepted assumption is a change request outside the fixed-price scope. | 0 (creep guard) | none | — |
|
|
103
|
+
| K-PROJ-03 | Training, documentation and handover as the RFP lists, delivered once and recorded; repeats are billable. | 0 | client | — |
|
|
104
|
+
| K-PROJ-04 | The environments the RFP names; additional environments via the provider at the client's expense. | 1–2 | client | — |
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Client question rules
|
|
2
|
+
|
|
3
|
+
A client question (`CQ-n`) is the written question the partner submits in the tender's Q&A round. It is the only correct answer to a vague row; a silent assumption on a vague row is a defect.
|
|
4
|
+
|
|
5
|
+
## Ask, do not assume, when
|
|
6
|
+
|
|
7
|
+
1. **Comparative or totality phrasing** — "as good as", "comparable to", "modern", "fast", "everything that works today", "all".
|
|
8
|
+
2. **Undefined reference** — "to be defined", "some", "such as", "etc.", a system named without objects or direction.
|
|
9
|
+
3. **External counterpart without interface or owner** — an integration whose API, format or responsible party is not named.
|
|
10
|
+
4. **Wide estimate** — no acceptance criteria and the architect's high is more than 2× its low.
|
|
11
|
+
5. **Stock contradiction** — the PM reports `conflict` between the row and verified stock behaviour, or between tier documentation and the RFP's plan assumption.
|
|
12
|
+
6. **RFP-internal contradiction** — a row conflicts with the constraints sheet, another row, or a stated out-of-scope item.
|
|
13
|
+
7. **Rejected assumption routed to the client** — an assume line was `[-]` rejected and the partner wants the client to decide (its `C-n` says so).
|
|
14
|
+
8. **Missing or conflicting key parameter** — a §1.2 Key parameters row marked **drv** in `context-parameters.md` reads `_not provided_`, or any row reads `conflicting`. Use that file's question stubs; ask for a figure or a bracket, never for a design. One question may cover a whole group.
|
|
15
|
+
|
|
16
|
+
## Never ask
|
|
17
|
+
|
|
18
|
+
- What the RFP already answers, even if buried in another sheet.
|
|
19
|
+
- What the partner can decide (plan preference, own assets, overhead and buffer policy) — that is a `Q-n`.
|
|
20
|
+
- Wording, formatting, or which column to use.
|
|
21
|
+
- Anything technical the client cannot judge ("subscriber or decorator").
|
|
22
|
+
|
|
23
|
+
Test: *if answered both ways, would a class, a PD figure or a statement on that row differ?* No → no question.
|
|
24
|
+
|
|
25
|
+
## Wording
|
|
26
|
+
|
|
27
|
+
- RFP language. One decision per question. Row ids in the block heading.
|
|
28
|
+
- 2–4 options where the answer space is known, each with its effect on scope in plain words, plus `Other:`. No PD figures to the client unless the partner asks for them.
|
|
29
|
+
- Neutral: never lead with the partner's preferred option, never argue.
|
|
30
|
+
- State the assumption the estimate uses: *"Until answered we assume …"* — and write that same assumption under the row as a suggested `[ ]` line, so the partner can accept it without the client.
|
|
31
|
+
- Quote the RFP's own sentence when the contradiction is internal; quote the PM's evidence (doc URL + version) when it is a stock contradiction, never a claim from memory.
|
|
32
|
+
|
|
33
|
+
## Blocking
|
|
34
|
+
|
|
35
|
+
A question is **blocking** when no defensible estimate exists even with a written assumption: unbounded parity rows, integrations with undefined objects, a plan-tier conflict on a Must row. Blocking → row status `blocked, CQ-n`, PD empty, heading `blocking: yes`. Everything else → the row keeps its PD, status `estimated, CQ-n`, with the assumption it rests on written under it as a `[ ]` line.
|
|
36
|
+
|
|
37
|
+
A blocking `CQ-n` on a Must row blocks *Ready to submit* regardless of the confidence total.
|
|
38
|
+
|
|
39
|
+
## Cap and order
|
|
40
|
+
|
|
41
|
+
- At most 25 questions per submission; merge questions on the same topic across rows.
|
|
42
|
+
- Order by PD swing (largest first), then by priority (Must before Should).
|
|
43
|
+
- Beyond the cap, the remaining vague rows keep their `[ ]` assumption line and are listed in §5 as `Not sent — cap`.
|
|
44
|
+
|
|
45
|
+
## Answers
|
|
46
|
+
|
|
47
|
+
The partner records the client's answer by ticking an option or filling `Other:` in the §5 block. The next run's reconciliation turns it into a `.c<n>` line under every row the block names (source `client, CQ-n`, status date), or an `RC-n` in §3 when cross-cutting; the block is deleted; affected rows are re-estimated; one `C-n`. The client's wording never lands in the document, the decision does.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Confidence rubric
|
|
2
|
+
|
|
3
|
+
Score each dimension 0–100 against its bands, multiply by weight, sum, round to a whole percent. `points = score × weight / 100`. Score the document as written; a verdict given in chat does not count.
|
|
4
|
+
|
|
5
|
+
## Coverage evidence — weight 20
|
|
6
|
+
|
|
7
|
+
| Score | Band |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| 100 | Every Must `req` line's class rests on a PM verdict or a mechanism cited to `vendor/` or a KB page; ≤5% of rows `unverified` |
|
|
10
|
+
| 70 | ≤15% `unverified`; Should/Could rows partly evidenced |
|
|
11
|
+
| 40 | The PM wave was partly not consulted, or >15% `unverified` |
|
|
12
|
+
| 0 | Classes set from memory |
|
|
13
|
+
|
|
14
|
+
## Estimate basis — weight 20
|
|
15
|
+
|
|
16
|
+
| Score | Band |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| 100 | Every estimated row has low/mid/high, a level and drivers; foundation efforts attached to named rows |
|
|
19
|
+
| 70 | ≤10% of estimated rows lack a three-point |
|
|
20
|
+
| 40 | The architect was not consulted for at least one cluster |
|
|
21
|
+
| 0 | PD figures without agent input |
|
|
22
|
+
|
|
23
|
+
## Scope lock — weight 20
|
|
24
|
+
|
|
25
|
+
Counts `accepted` lines only. `[ ]`, an unreconciled `[x]`, `rejected` and `suspect` count as nothing.
|
|
26
|
+
|
|
27
|
+
| Score | Band |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| 100 | ≥80% of Must PD sits on rows that are `detailed` or covered by an accepted line; every vague Must row has a `CQ-n` |
|
|
30
|
+
| 70 | 60–80% of Must PD locked; every vague Must row has a `CQ-n` |
|
|
31
|
+
| 40 | <60% locked, or a vague Must row without a `CQ-n` |
|
|
32
|
+
| 0 | No accepted line and no client question |
|
|
33
|
+
|
|
34
|
+
## Platform decision — weight 15
|
|
35
|
+
|
|
36
|
+
| Score | Band |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| 100 | Plan, hosting, PSP and CMP decided in §6, each with a reason naming the rows it serves and a source (profile, PM tier, architect alternative); the plan's PD delta stated |
|
|
39
|
+
| 70 | One §6 platform item `_TBD_` or open in a `Q-n` |
|
|
40
|
+
| 40 | Two or more `_TBD_` or open, or the plan undecided |
|
|
41
|
+
| 0 | Profile missing, or the §6 platform table empty |
|
|
42
|
+
|
|
43
|
+
## Integration & migration — weight 15
|
|
44
|
+
|
|
45
|
+
| Score | Band |
|
|
46
|
+
| --- | --- |
|
|
47
|
+
| 100 | Every interface and migration object the RFP names is in §6 with pattern and owner split; §8 and §1.2 are complete for every estimate-driving parameter and migration volume |
|
|
48
|
+
| 70 | Main interfaces covered; secondary ones or the owner split missing; §8/§1.2 mostly complete |
|
|
49
|
+
| 40 | Approach lines missing for named interfaces, or an estimate-driving §1.2 parameter or a §1.2 migration volume is missing without a `CQ-n` |
|
|
50
|
+
| 0 | §6 interface and migration tables `_TBD_` |
|
|
51
|
+
|
|
52
|
+
## Consistency — weight 10
|
|
53
|
+
|
|
54
|
+
| Score | Band |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| 100 | All probes run (plugins, prior analyses, PRDs, partner assets, RFP-internal); every conflict resolved or logged as `K-n` in §7 |
|
|
57
|
+
| 70 | Probes run; a `K-n` unresolved |
|
|
58
|
+
| 40 | Probes run only partially |
|
|
59
|
+
| 0 | A known conflict unrecorded |
|
|
60
|
+
|
|
61
|
+
## Status
|
|
62
|
+
|
|
63
|
+
| Confidence | Open `high` `Q-n` | Blocking `CQ-n` on a Must row | `suspect` lines | Unreconciled ticks | Status |
|
|
64
|
+
| --- | --- | --- | --- | --- | --- |
|
|
65
|
+
| > 90 | none | none | none | none | **Ready to submit** |
|
|
66
|
+
| > 90 | any of the four present | | | | **Review** |
|
|
67
|
+
| 80–90 | | | | | **Review** |
|
|
68
|
+
| < 80 | | | | | **Draft** |
|
|
69
|
+
|
|
70
|
+
The four conditions override the arithmetic. §2 *Weakest dimension* names every blocker by id.
|
|
71
|
+
|
|
72
|
+
## Honesty rules
|
|
73
|
+
|
|
74
|
+
- Do not round up to cross 80 or 90.
|
|
75
|
+
- Never raise a score because the deadline is close or the user wants the response finished.
|
|
76
|
+
- A row with an open non-blocking question (`estimated, CQ-n`) caps *Scope lock* at 70 for the share of Must PD it carries, unless the assumption its estimate rests on is `accepted`.
|
|
77
|
+
- `_TBD_` anywhere in §6 caps that dimension at 40.
|
|
78
|
+
- `_TBD_` overhead or buffer in the profile caps *Estimate basis* at 70; §2 states that PD is given before both.
|
|
79
|
+
- `reuse: rfp-NNNN <ID>` is evidence only if the source row carried a verdict, not a guess.
|
|
80
|
+
- If the total moved down since the last run, the report says so and names the cause.
|