@execuro-sw-ecosystem/sw-ecosystem-agentic-harness 0.1.10 → 0.1.12

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/agents/sw-product-manager.md +9 -3
  3. package/agents/sw-shopware-architect.md +5 -1
  4. package/agents/sw-tender-editor.md +34 -19
  5. package/codex/agents/sw-product-manager.toml +9 -3
  6. package/codex/agents/sw-shopware-architect.toml +6 -2
  7. package/codex/agents/sw-tender-editor.toml +34 -19
  8. package/content/AGENTS.md +3 -3
  9. package/copilot/agents/sw-product-manager.agent.md +9 -3
  10. package/copilot/agents/sw-shopware-architect.agent.md +6 -2
  11. package/copilot/agents/sw-tender-editor.agent.md +35 -20
  12. package/package.json +1 -1
  13. package/plugin.json +1 -1
  14. package/skills/sw-design-requirements/SKILL.md +6 -4
  15. package/skills/sw-design-requirements/reference/clarification-loop.md +2 -2
  16. package/skills/sw-design-requirements/reference/consistency-probes.md +15 -1
  17. package/skills/sw-design-requirements/reference/editor-mode.md +4 -2
  18. package/skills/sw-design-solution/SKILL.md +3 -3
  19. package/skills/sw-design-solution/reference/clarification-loop.md +2 -0
  20. package/skills/sw-design-solution/reference/editor-mode.md +7 -5
  21. package/skills/sw-design-solution/reference/pre-check-and-target.md +25 -12
  22. package/skills/sw-design-solution/reference/research-and-evidence.md +1 -1
  23. package/skills/sw-design-solution/reference/tech-spec-template.md +2 -2
  24. package/skills/sw-discover-tender/SKILL.md +39 -43
  25. package/skills/sw-discover-tender/reference/agent-briefs.md +65 -110
  26. package/skills/sw-discover-tender/reference/analysis-template.md +41 -208
  27. package/skills/sw-discover-tender/reference/assumption-catalogue.md +69 -104
  28. package/skills/sw-discover-tender/reference/client-question-rules.md +16 -35
  29. package/skills/sw-discover-tender/reference/context-parameters.md +14 -107
  30. package/skills/sw-discover-tender/reference/coverage-mapping.md +33 -56
  31. package/skills/sw-discover-tender/reference/editor-session.md +32 -73
  32. package/skills/sw-discover-tender/reference/estimation-model.md +43 -79
  33. package/skills/sw-discover-tender/reference/procedure.md +36 -72
  34. package/skills/sw-discover-tender/reference/project-information.md +31 -0
  35. package/skills/sw-discover-tender/reference/response-rules.md +11 -10
  36. package/skills/sw-implement-feature/SKILL.md +11 -2
  37. package/skills/sw-setup/SKILL.md +10 -5
  38. package/skills/sw-discover-tender/reference/confidence-rubric.md +0 -80
  39. package/skills/sw-discover-tender/reference/editor-mode.md +0 -11
@@ -1,135 +1,90 @@
1
1
  # Agent briefs
2
2
 
3
- `<work>` = `specs/.rfp/<slug>/`. `<analysis>` = the analysis file.
3
+ Three agents: `sw-tender-editor`, `sw-product-manager`, `sw-shopware-architect`. Every task below is one the named agent's own tools can perform; an agent that never writes files in tender work returns its report as its final message, and the skill saves it. `<doc>` = the working document path. `<work>` = `specs/.rfp/<slug>/`.
4
4
 
5
- ## Parallelism, caps, delivery
5
+ Every spawn of `sw-product-manager` or `sw-shopware-architect` receives the detected Shopware version, edition and plan (`context-parameters.md`, Dev Knowledge Base only), section 1's Project information table (the 18 volumes and facts feed the size-up drivers in `estimation-model.md`), and, per scope item, that item's Internal note (read-only) and its rejected proposals, with an instruction never to re-propose them. In tender work neither agent scans `vendor/`, `custom/plugins` or `composer.lock`, and neither re-detects the version from the codebase — project facts come from the Dev Knowledge Base only (`context-parameters.md`); a brief that supplies the version with its Dev Knowledge Base evidence is used as verified, never re-derived.
6
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`).
7
+ ## `sw-tender-editor`
18
8
 
19
- ## §EXTRACT — `sw-tender-editor`, per source file or table (step 3, before any spawn wave)
9
+ Tools: Read, Write, Edit — no Glob or Grep. Never asked to search; every brief names the exact file(s) to read. Never judges Requirement Coverage or Estimation. Exactly two jobs, one per spawn.
20
10
 
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.
11
+ **`extract`** (procedure step 1) — input is the one named tender file — the runtime's `import-digest.md` (xlsx/csv source) or the PDF itself — plus `reference/project-information.md` for the 18 `PROJECT_INFO` keys:
32
12
 
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.
13
+ > Sort the requirements at `<file>` into the tool's own tabs. Read the whole file. The row's own content decides the tab, never its topic: `TABS = Functional, Non-functional, Project & services`. Functional is anything the shop, admin or an interface must do, including a feature required by law or compliance (hazard labelling, VAT-ID validation, newsletter double opt-in, a payment method), an integration, migration or content. Non-functional is a quality attribute or operating constraint — performance, availability, scalability, security posture/access policy, accessibility conformance level, data-protection process, hosting, operations, monitoring, code quality. Project & services is how the project is delivered and supported — method, timeline, team, documentation, training, testing/acceptance, hypercare, warranty/maintenance, handover, references, commercial structure (scope and effort only). A bidder questionnaire sheet (e.g. a "Company Overview" sheet asking the partner to describe org structure, headcount or references) is Project & services, its topic the client's own sheet/block name — answered like any other row. A client "Type" column is a hint, never the decider. `topic` is the most specific grouping the client gives for that row — its own Area/Category column when present, else the block heading, else the sheet name (PDF: the section heading) — strip a leading chapter number ("1. ", "3.3 - ") and use the rest verbatim; never invented, never the tab name. Confirm, correct, or add to the digest's proposed table structure and answer columns (xlsx/csv only) — a sheet the digest called context whose cells are in fact a requirement or vendor-answer table gets its own table the digest never proposed. A row inside a declared table's range that is a heading, a note or a total, not a requirement, goes to `skip`; a row outside every declared range is never listed anywhere. Fill `projectInfo` from the tender's own context sheets or prose for the 18 keys in `project-information.md`; `source` may join several locations with "; "; state what the source gives, qualified when it is not exactly what the key asks; a key the source does not state is simply omitted. A `value` is the client's own fact, kept verbatim, a figure included (EUR 380, €120k, 160,000 EUR) — this table is the one place the money rule does not apply. A numeric compliance-legend rating column (e.g. 0-4) is not yours to fill or change — the runtime writes it at export. Return this JSON as your final message, nothing else:
41
14
  >
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_`.
15
+ > ```json
16
+ > {
17
+ > "tables": [{ "sheet": "<real sheet name>", "headerRow": 1, "firstDataRow": 2, "lastDataRow": 92,
18
+ > "tab": "Functional", "topic": null,
19
+ > "columns": { "id": "A", "priority": "F", "requirement": "E", "topic": "B",
20
+ > "compliance": "J", "comment": "K", "effort": "L", "assumptions": null } }],
21
+ > "overrides": [{ "sheet": "<sheet>", "row": 6, "tab": "Non-functional" }],
22
+ > "skip": [{ "sheet": "<sheet>", "row": 40, "why": "sub-heading, not a requirement" }],
23
+ > "items": [{ "tab": "Functional", "topic": "<PDF section heading>", "prio": "Must", "text": "<verbatim>", "id": null }],
24
+ > "projectInfo": [{ "key": "products", "value": "<value>", "source": "<sheet> r<row>" }]
25
+ > }
26
+ > ```
48
27
  >
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.
28
+ > XLSX/CSV: use `tables`, `overrides`, `skip` and `projectInfo`; `items` is empty. A multi-block sheet gets one `tables` entry per block, `topic` = that block's heading. An `overrides` entry sets `topic` only when this row's own grouping differs from its table's `topic` — never restate the table's topic as an override. PDF: use `items` and `projectInfo`; `tables`, `overrides` and `skip` are each an empty array. For each PDF item, `text` is verbatim — never invent one the prose does not state, never merge two into one entry, never split one into two; a descriptive paragraph that states no requirement is not an item, though it may feed `projectInfo`. `prio`: infer from the prose — "must"/"shall"/"required" → Must, "should" → Should, "nice to have"/"could"/"optional" → Nice to have, empty only when the prose gives no such signal; use the document's own word for that level, its first letter capitalised, dropping a trailing qualifier such as ", if time allows". A bullet list under a lead-in sentence that states the priority: every bullet inherits the lead-in's `prio`, but its `text` is the bullet's own wording, never the lead-in's. `topic` is the PDF's section heading (strip a leading chapter number), never empty; `id` is optional (a client id stated in the prose). Do not write a file.
51
29
 
52
- ## §PM — `sw-product-manager`, per cluster (wave 1)
30
+ **`context`** (after intake, and again whenever the architect's report or an operator answer changes them):
53
31
 
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.
32
+ > Detected Shopware `<version>` `<edition>` plan `<plan>`, per `<evidence>`. Write into `<doc>`: section 1's meta prose (not the Project information or Not taken tables — the runtime writes those), the detected version/edition/plan above; section 3's `### Exclusions` bullets, one per exclusion the client's own document states; section 6 Integrations the tender names, from the source document and the PM's markdown reports; section 7 Glossary of the client's terms. There is no Approach section — a platform, hosting, PSP or CMP decision belongs in a scope item's Client Response, never here. Never touch section 2, a section 4 row, a section 5 block, section 8 Log, section 1's Project information or Not taken tables, or section 3's `### Assumptions` bullets — the runtime writes all of those (section 8 is appended by the runtime's `report` command). Never invent a term, an integration or an exclusion the source does not state; when a section has no material, leave it as the heading alone — write nothing under it. End your turn with one line: which sections you wrote.
63
33
 
64
- `unverified` is not a verdict.
34
+ ## `sw-product-manager`
65
35
 
66
- ## §ARCH — `sw-shopware-architect`, per cluster (as that cluster's PM report lands)
36
+ A shared agent (also used outside tenders); its tools include the Dev Knowledge Base MCP (`kb_status`, `list_docs`, `grep_docs`, `read_doc`), `WebFetch`, `Read`, `Grep` and read-only `Bash`. Never writes the working document, and never writes any file in tender work.
67
37
 
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.
38
+ > Check scope item(s) `<ids>` against the Dev Knowledge Base MCP (platform and project). Installed Shopware `<version>` `<edition>` plan `<plan>`, per `<evidence>` (`context-parameters.md`). Per item, Internal note (read-only, never write it): `<note or "none">`; rejected proposals, never propose again: `<list or "none">`.
70
39
  >
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>`.
40
+ > For each item: report the stock feature that covers it, or state plainly that nothing in the platform or the project covers it; cite the Knowledge Base page or the project's own implementation. Flag an item too vague to assess and draft one client question for it (question text, 2-4 options with their scope effect, a fallback) — the architect turns this into the section 5 block. Never estimate effort, never set Requirement Coverage — the architect decides the final value; where the architect's own check disagrees with this report, that is expected and the architect records it, not this agent.
72
41
  >
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 `_`.
42
+ > Never ask the user a question with a structured question tool (Claude Code: `AskUserQuestion`; Codex: `request_user_input`). Return your report as free-form markdown, your final message.
74
43
 
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`.
44
+ ## `sw-shopware-architect`
76
45
 
77
- ## §QA — `sw-qa-engineer`, once (in message 1, with the PM spawns)
46
+ A shared agent (also used outside tenders); its tools include the Dev Knowledge Base MCP, `Read`, `Grep`, `Glob`, read-only `Bash`, and `WebFetch`/`WebSearch` for ISV research. Never writes the working document, and never writes a file in tender work — the skill saves its report and runs `apply`.
78
47
 
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.
48
+ > Assess and estimate scope item(s) `<ids>` of `<doc>`. Installed Shopware `<version>` `<edition>` plan `<plan>`, per `<evidence>`. Regime: `<profile|T-shirt>`. PM report: `<pm-report.md>` — input, not truth: you decide the final Requirement Coverage. Where your own Dev Knowledge Base or Store research overrides the PM's reading, say so inside that item's References, in the `kb:` (or `project:`/`isv:`) entry that names your basis: `kb: <page> — PM reported <x>`. Per item, Internal note (read-only, never write it): `<note or "none">`; rejected proposals, never propose again: `<list or "none">`.
89
49
  >
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.
50
+ > **Re-estimate of a confirmed or reopened item** (the item is already `confirmed`/`reopened`; this run was triggered by an answered question, an accepted assumption or a profile change, not a first assessment): current values — coverage `<current coverage>`, effort `<current size|pd>`, Client Response `<current text>`. Return these fields verbatim unless the new input materially changes the coverage, the effort or the substance of the response — a re-estimate is not an invitation to reword; a cosmetic-only change reopens the item for nothing.
97
51
  >
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.
52
+ > For each item set: Requirement Coverage (`coverage-mapping.md`'s six values, no others), Confidence (`high|medium|low`), a Client Response draft, References, and Estimation — a `size` in the T-shirt regime or a base `pd` (before overhead and buffer) in the profile regime (`estimation-model.md`), under the report's `effort` key. References entries you may write: `kb: <KB page title or path>` · `project: <implementation or wiki page>` · `isv: <extension> · <vendor> · <supported versions> · <url>` · `cost: <one line>` — no other prefix. `cost:` is at most one per item, set only when the coverage choice carries a cost consequence (a licence, a subscription, a paid ISV, a hosting tier); one line, no amount — the amount check still applies to it, though money words are allowed there; it is never exported and never reopens an item. ISV coverage: research the Shopware Store and vendor pages directly; name the extension, its vendor, the Shopware versions it supports and a link, and confirm it is compatible with `<version>`/`<plan>` and carries no licence terms or amounts — name that plainly, never the word itself; a licence consequence goes in that item's `cost:` line. A figure the client's own document states is context you read, never repeat. Propose 1-3 scope-locking assumptions per item (`assumption-catalogue.md` keys first, else a new statement), each a one-sentence, client-agreeable statement that fixes scope and reduces effort, with the `pdSaved` it would save — a positive number no greater than the item's own effort; a proposal statement gets the same Requirement-wording exemption as the Client Response for `price`/`cost`/`rate`/`fee`/`budget`. Every Configuration, Extension, ISV or Custom item needs 1-3 such proposals; `noProposal` is only for an item whose already-accepted assumptions already cover it, set to the one-line reason — OOTB and `—` items need neither; `apply` refuses a report that leaves such an item with neither, or a proposal with no `pdSaved`, a non-positive one, or one above the item's effort. Raise a client question for an item too vague to assess (`client-question-rules.md`), with a fallback. Money rule (`estimation-model.md`): never an amount or a currency symbol/code, ever. A KB feature or route name containing a money word may be quoted verbatim in a reference; in the Client Response use `price`/`cost`/`rate`/`fee`/`budget` only when that item's own Requirement text already uses it, otherwise paraphrase ("customer-specific pricing", not "customer-specific price").
101
53
  >
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.
54
+ > Return this JSON as your final message, nothing else — no prose, no file writes:
109
55
  >
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`.
56
+ > ```json
57
+ > {
58
+ > "cause": "<why this run happened, e.g. 'analyze group 1' or 'CQ-3 answered B'>",
59
+ > "items": [
60
+ > {
61
+ > "id": "<item id>",
62
+ > "coverage": "OOTB | Configuration | Extension | ISV | Custom | —",
63
+ > "confidence": "high | medium | low",
64
+ > "size": "—|XS|S|M|L|XL|XXL", // T-shirt regime only; "—" for OOTB
65
+ > "pd": 9.5, // profile regime only — base PD before overhead/buffer; 0 for OOTB
66
+ > "clientResponse": "<text>",
67
+ > "references": ["kb: ...", "project: ...", "isv: <ext> · <vendor> · <versions> · <url>", "cost: <one line, no amount>"],
68
+ > "proposals": [ { "statement": "<text>", "pdSaved": 4 } ],
69
+ > "noProposal": null | "<reason>", // only when accepted assumptions already cover the item; required when "proposals" is empty and coverage is not OOTB or "—"
70
+ > "blockedBy": "CQ-3" | "new:0" | null, // "new:<i>" = index into this report's own "questions" array
71
+ > "failed": null | "<reason>"
72
+ > }
73
+ > ],
74
+ > "globalProposals": [ { "statement": "<text>", "pdSaved": 6 } ],
75
+ > "questions": [
76
+ > {
77
+ > "items": ["<item id>"],
78
+ > "question": "<text>",
79
+ > "options": [ { "key": "A", "text": "<text>", "effect": "<scope effect>" } ],
80
+ > "fallback": "A"
81
+ > }
82
+ > ]
83
+ > }
84
+ > ```
117
85
 
118
- ## §RESP — general-purpose agent, per cluster (export)
86
+ ## Delivery rules
119
87
 
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.
88
+ - Cap 10 spawns in one message; a failed or empty spawn leaves the item `failed` with a `failed: <reason>` reference, never filled from memory.
89
+ - `sw-product-manager` and `sw-shopware-architect` never write a file in tender work; the skill is the only writer of the working document, and only through `apply`, `check --write`, and `sw-tender-editor`'s `context` job.
90
+ - Codex and Copilot adapters mirror each agent one-to-one — see the plugin's `agents/` generation.
@@ -1,224 +1,57 @@
1
- # Analysis template
1
+ # Working document grammar
2
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 `[ ]`.
3
+ `specs/rfp-NNNN-slug-analysis.md`. The runtime (`lib/parse.mjs`, `lib/check.mjs`, `lib/apply.mjs`) owns this grammar; this file is what an agent or the skill reads to write prose sections and to recognise a well-formed document. Never hand-write section 2 or a section 4 row — `intake` and `check --write` do that.
4
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.
5
+ ## Frontmatter (YAML)
6
6
 
7
- ---
7
+ `state: In progress | Ready` — `intake: review | confirmed` (absent means `confirmed`; any other value is a parse error) — `regime: profile | T-shirt` — `source-sha256: { <file>: <hex> }` — `slug`, `client`, `tender-type` free text.
8
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
- ---
9
+ ## Sections, fixed order
28
10
 
29
- # RFP-NNNN — <Client> — <Project>
11
+ 8 sections, headings exactly: `## 1. Context` — `## 2. Totals` — `## 3. Global assumptions and exclusions` — `## 4. Scope items` — `## 5. Questions` — `## 6. Integrations` — `## 7. Glossary` — `## 8. Log`. An empty section stays as the heading alone. Nothing is dropped for being empty. There is no Approach section: a platform, hosting, PSP or CMP recommendation lives in its scope item's Client Response, and the Shopware target lives in section 1's Project information table.
30
12
 
31
- ## 1. Context
13
+ - Section 1 holds free prose meta first (source files, hashes, detected Shopware version/edition/plan with its evidence — `context-parameters.md`), then two subsections, always present in this order, each may have no rows:
14
+ - `### Project information` — table `| Parameter | Value | Source |`, the 18 `PROJECT_INFO` rows in fixed order (`project-information.md`). Written by `intake` and edited by the operator (`info`); `sw-tender-editor` never writes this table.
15
+ - `### Not taken from the source` — table `| Source | Text | Why |`, one row per skipped or removed row. Written by `intake`/`skip`/`restore`; `sw-tender-editor` never writes this table.
16
+ - Section 2 is runtime-generated between `<!-- totals:begin -->` and `<!-- totals:end -->` (`check --write`): a `Regime:` line, a table `By priority` and a table `By tab` (one row per `TABS` entry in order, rows with 0 items omitted), a total row, and a status line with the confirmed/reopened/failed/open-question/low-confidence/waiting-proposal counts.
17
+ - Section 3 has `### Assumptions` then `- <statement>` bullets, and `### Exclusions` then `- <statement>` bullets the client's document states. `sw-tender-editor` writes exclusions from the source; accepted global proposals land under Assumptions via `accept`/`assume`.
18
+ - Section 4 holds the scope items — see below.
19
+ - Section 5 holds client questions `CQ-n` and operator questions `Q-n` — see below.
20
+ - Section 6 holds the integrations the tender names. Written by `sw-tender-editor`'s `context` job.
21
+ - Section 7 is the Glossary: the client's terms. Written by `sw-tender-editor`'s `context` job.
22
+ - Section 8 is the run log: one line per run (cause, what changed), and any conflict between agent reports the architect resolved. Appended by `report` alone.
32
23
 
33
- ### 1.1 Meta
24
+ ## Section 4 header, exact
34
25
 
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).
26
+ `| ID | Prio | Requirement | Requirement Coverage | Confidence | Estimation | Client Response | Assumptions | Internal note | References | Status |` — client inputs first (ID, Prio, Requirement), then the working fields. An older document headed `Effort`, or with Requirement after the working fields, is read the same way (columns are matched by header name, not position) and rewritten in this order and heading on its next write.
36
27
 
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 --> | |
28
+ One row per scope item, client order. A `|` inside a cell is escaped as `\|`. A cell list (Assumptions, References) is `- ` bullets joined by `<br>`. Every table sits under a `### <Tab> · <Topic>` heading (separator ` · `, U+00B7 with spaces) — one table per topic, same header. `Tab` is one of `TABS = Functional, Non-functional, Project & services`; `Topic` is the client's own grouping verbatim. Canonical render order: tabs in `TABS` order; within a tab, topics in client first-seen order; items in client order. A heading without ` · `, a Tab not in `TABS`, an empty Topic, or a duplicate item id anywhere in section 4 is a parse error.
61
29
 
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 |
30
+ | Column | Grammar |
104
31
  | --- | --- |
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:
32
+ | ID | Client id verbatim, any format. No id column: `<prefix>-<n>` — `prefix = sheetPrefix(topic)` (initials of the topic's words, ignoring `&`, `and`, `und`, `/`, punctuation; a word with digits contributes its first letter, uppercase, max 4 letters; a single-word topic uses its first 3 letters uppercase; a prefix collision elsewhere in the document appends `2`, `3`...). `n` counts from 1 in source order within that topic over every source row of the declared tables, skipped rows included, so a skip, a restore or a re-intake never renumbers; a restored item gets its old id back and its client-order position. Moving an item to another tab or topic never changes its id; the id is stable across intakes of the same file, never written into the client's file. |
33
+ | Requirement | The client's text, verbatim, never overwritten. |
34
+ | Requirement Coverage | One of `OOTB · Configuration · Extension · ISV · Custom · —`, or empty when not yet assessed. |
35
+ | Confidence | `high \| medium \| low`, or empty. |
36
+ | Estimation | T-shirt: `<SIZE> (<n> PD)`, `SIZE` in `XS S M L XL XXL`, OOTB is `— (0 PD)`. Profile: `<n> PD` rounded to 0.25, OOTB `0 PD`. Empty when not estimated. The report JSON key stays `effort`. |
37
+ | Client Response | Architect drafts, operator edits. |
38
+ | Assumptions | Accepted assumptions for this item, as bullets. |
39
+ | Internal note | Operator-written only; agents read it, never write it. |
40
+ | References | Agent-written: `kb: <KB page title or path>` — `project: <implementation or wiki page>` — `isv: <extension> · <vendor> · <supported versions> · <url>` — `cost: <one line, no amount>`. Runtime-written: `rejected: <statement>` — `failed: <reason>` — `reopened YYYY-MM-DD: <cause>` — `draft: <text>` (the architect's Client Response draft when it differs from a confirmed/reopened item's kept text). Never exported. |
41
+ | Status | `queued · analysing · estimated · blocked CQ-<n> · failed · confirmed YYYY-MM-DD · reopened`. |
42
+
43
+ ## Section 5 blocks
214
44
 
215
45
  ```
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)
46
+ ### CQ-<n> · <item id>, <item id>
47
+ <question text>
48
+ - [ ] A — <option text> — effect: <scope effect>
49
+ - [ ] B — <option text> — effect: <scope effect>
50
+ Fallback: A
220
51
  ```
221
52
 
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.
53
+ Answered: the chosen box is `[x]` and a line `Answered YYYY-MM-DD: <key>` follows `Fallback:`. Operator questions use `### Q-<n> · <item ids>`, same shape, options optional. A `CQ-n` needs at least two options.
54
+
55
+ ## Side files
223
56
 
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.
57
+ Not part of the working document; written under `specs/.rfp/<slug>/` or `specs/`. Grammar: `context-parameters.md` (version/edition/plan), `project-information.md` (the 18 keys), `assumption-catalogue.md` (proposal starting points), `estimation-model.md` (regimes, scale, profile file), `response-rules.md` (export), `client-question-rules.md` (CQ/Q wording). The runtime's own side files (`proposals.json`, `reestimate.json`, `last-run.json`, `import-map.json`) are documented with the runtime, not here.