@execuro-sw-ecosystem/sw-ecosystem-agentic-harness 0.1.11 → 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.
- package/CHANGELOG.md +22 -0
- package/agents/sw-product-manager.md +9 -3
- package/agents/sw-shopware-architect.md +5 -1
- package/agents/sw-tender-editor.md +34 -19
- package/codex/agents/sw-product-manager.toml +9 -3
- package/codex/agents/sw-shopware-architect.toml +6 -2
- package/codex/agents/sw-tender-editor.toml +34 -19
- package/content/AGENTS.md +3 -3
- package/copilot/agents/sw-product-manager.agent.md +9 -3
- package/copilot/agents/sw-shopware-architect.agent.md +6 -2
- package/copilot/agents/sw-tender-editor.agent.md +35 -20
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/sw-discover-tender/SKILL.md +39 -43
- package/skills/sw-discover-tender/reference/agent-briefs.md +65 -110
- package/skills/sw-discover-tender/reference/analysis-template.md +41 -208
- package/skills/sw-discover-tender/reference/assumption-catalogue.md +69 -104
- package/skills/sw-discover-tender/reference/client-question-rules.md +16 -35
- package/skills/sw-discover-tender/reference/context-parameters.md +14 -107
- package/skills/sw-discover-tender/reference/coverage-mapping.md +33 -56
- package/skills/sw-discover-tender/reference/editor-session.md +32 -73
- package/skills/sw-discover-tender/reference/estimation-model.md +43 -79
- package/skills/sw-discover-tender/reference/procedure.md +36 -72
- package/skills/sw-discover-tender/reference/project-information.md +31 -0
- package/skills/sw-discover-tender/reference/response-rules.md +11 -10
- package/skills/sw-discover-tender/reference/confidence-rubric.md +0 -80
- package/skills/sw-discover-tender/reference/editor-mode.md +0 -11
|
@@ -1,224 +1,57 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Working document grammar
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
+
## Section 4 header, exact
|
|
34
25
|
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
@@ -1,104 +1,69 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
Starting points, not answers.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## PLAT — platform and edition
|
|
8
|
-
|
|
9
|
-
| Key | Statement |
|
|
10
|
-
| --- | --- | --- | --- |
|
|
11
|
-
|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
| Key | Statement |
|
|
40
|
-
| --- | --- | --- | --- |
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
|
67
|
-
|
|
68
|
-
|
|
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 | — |
|
|
1
|
+
# Assumption catalogue
|
|
2
|
+
|
|
3
|
+
Starting points, not answers. Every Configuration, Extension, ISV or Custom item gets 1-3 proposals in the architect's report, catalogue keys first, each rewritten for the tender at hand as one client-agreeable, scope-locking sentence, in its report JSON's `proposals` (per item) or `globalProposals` (section 3) array — schema in `agent-briefs.md` — each with the `pdSaved` it would save against the item's un-assumed estimate, greater than 0 and no greater than the item's own effort. `noProposal` is for an item only when its already-accepted assumptions already cover it. The runtime's proposal store (`specs/.rfp/<slug>/proposals.json`) is the only place a proposal lives until the operator accepts it (AQ-2); a rejected proposal is never proposed again for the same item (AQ-4), matched by its normalised statement.
|
|
4
|
+
|
|
5
|
+
Keys below use the `AS-` prefix so they never collide with a scope item id, a `CQ-n`/`Q-n`, a proposal `P-n` or a log entry — none of those families ever starts with `AS-`. `pdSaved` is a typical figure for a mid-size B2B project; the architect states the real figure for the tender at hand. A statement the client's own document already makes is a section 3 Exclusion, not an assumption.
|
|
6
|
+
|
|
7
|
+
## AS-PLAT — platform and edition
|
|
8
|
+
|
|
9
|
+
| Key | Statement | pdSaved | Not when |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| AS-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) | the client pins an older version |
|
|
12
|
+
| AS-PLAT-02 | One sales channel per country/language pair the client lists, one currency; further channels, languages or currencies are separately scoped. | 5 | — |
|
|
13
|
+
| AS-PLAT-03 | Commercial-plan features are used as shipped; changes to their UI or flows are separately scoped. | 15 | an acceptance criterion contradicts stock behaviour |
|
|
14
|
+
|
|
15
|
+
## AS-ERP — integration
|
|
16
|
+
|
|
17
|
+
| Key | Statement | pdSaved | Not when |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| AS-ERP-01 | The counterpart implements the far-side endpoints from an interface specification we write; we build the shop side only. | 15 | the item asks for both sides |
|
|
20
|
+
| AS-ERP-02 | One synchronisation pattern for all objects: queue consumers, idempotent upserts keyed by external id; no middleware or iPaaS. | 8 | the client requires an iPaaS |
|
|
21
|
+
| AS-ERP-03 | Customer-specific and tier pricing is imported asynchronously (full, delta or webhook as stated); no live call per page view. | 10 | the client demands a per-request live lookup |
|
|
22
|
+
|
|
23
|
+
## AS-DSGN — design and theme
|
|
24
|
+
|
|
25
|
+
| Key | Statement | pdSaved | Not when |
|
|
26
|
+
| --- | --- | --- | --- |
|
|
27
|
+
| AS-DSGN-01 | The client's own designs are delivered per page type before the sprint that builds it; one revision round included. | 10 | we own design |
|
|
28
|
+
| AS-DSGN-02 | The theme extends the default Storefront theme; stock components are restyled, not rebuilt. | 6 | — |
|
|
29
|
+
|
|
30
|
+
## AS-MIG — content and data migration
|
|
31
|
+
|
|
32
|
+
| Key | Statement | pdSaved | Not when |
|
|
33
|
+
| --- | --- | --- | --- |
|
|
34
|
+
| AS-MIG-01 | Content, blog and landing pages are rebuilt by the client's own team after training; we deliver example layouts only. | 10 | the client requires a full 1:1 migration |
|
|
35
|
+
| AS-MIG-02 | Historical orders are migrated read-only for display; no reorder from migrated lines. | 6 | reorder from migrated orders is a stated requirement |
|
|
36
|
+
|
|
37
|
+
## AS-B2B — accounts, approval, quotes
|
|
38
|
+
|
|
39
|
+
| Key | Statement | pdSaved | Not when |
|
|
40
|
+
| --- | --- | --- | --- |
|
|
41
|
+
| AS-B2B-01 | Employee roles and order-approval thresholds use B2B Components as shipped; one threshold type per company. | 20 | the plan has no B2B Components |
|
|
42
|
+
| AS-B2B-02 | Quotes use stock quote management; one counter-offer cycle, no negotiation thread. | 6 | the plan has no B2B Components |
|
|
43
|
+
|
|
44
|
+
## AS-SRCH — search
|
|
45
|
+
|
|
46
|
+
| Key | Statement | pdSaved | Not when |
|
|
47
|
+
| --- | --- | --- | --- |
|
|
48
|
+
| AS-SRCH-01 | Search is the stock OpenSearch/Elasticsearch integration with field boosting on the identifiers named; no machine-learned ranking, no personalisation. | 12 | — |
|
|
49
|
+
|
|
50
|
+
## AS-OPS — hosting, operations, security
|
|
51
|
+
|
|
52
|
+
| Key | Statement | pdSaved | Not when |
|
|
53
|
+
| --- | --- | --- | --- |
|
|
54
|
+
| AS-OPS-01 | Managed Shopware hosting per the profile's preferred provider; availability, backup and restore per the provider's SLA. | 6 | the client requires self-operated infrastructure |
|
|
55
|
+
| AS-OPS-02 | Monitoring and alerting use the provider's stack plus Shopware admin notifications; no custom dashboards. | 4 | — |
|
|
56
|
+
|
|
57
|
+
## AS-CMPL — compliance and accessibility
|
|
58
|
+
|
|
59
|
+
| Key | Statement | pdSaved | Not when |
|
|
60
|
+
| --- | --- | --- | --- |
|
|
61
|
+
| AS-CMPL-01 | Accessibility conformance covers templates and components we build; client-authored content and third-party widgets are excluded. | 6 | — |
|
|
62
|
+
| AS-CMPL-02 | Invoices, credit notes and e-invoices are produced by the counterpart system; the shop displays and links them. | 10 | the requirement is shop-generated fiscal documents |
|
|
63
|
+
|
|
64
|
+
## AS-PAY — payment and shipping
|
|
65
|
+
|
|
66
|
+
| Key | Statement | pdSaved | Not when |
|
|
67
|
+
| --- | --- | --- | --- |
|
|
68
|
+
| AS-PAY-01 | Cards and wallets via the official ISV plugin of the profile's preferred provider, hosted payment page; no custom PSP integration. | 5 | the client names a provider with no official plugin |
|
|
69
|
+
| AS-PAY-02 | Shipping methods and their pricing via stock methods and rules; no carrier API, no label printing in the shop. | 6 | labels from the shop are a stated requirement |
|
|
@@ -1,47 +1,28 @@
|
|
|
1
1
|
# Client question rules
|
|
2
2
|
|
|
3
|
-
A client question (`CQ-n`) is the written question the
|
|
3
|
+
A client question (`CQ-n`) is the written question the operator takes to the client's Q&A round; the tool writes no question document (AQ-7). It is the correct answer to a requirement too vague to assess — a silent guess is a defect.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## AQ-5 — when a requirement gets a CQ
|
|
6
6
|
|
|
7
|
-
|
|
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.
|
|
7
|
+
A requirement too vague to assess gets a `CQ-n` in section 5: options, the scope effect of each, and a fallback. The scope item's Status becomes `blocked CQ-n` and it is estimated on the fallback option (E-4). Vague means: comparative or totality phrasing ("as good as", "everything that works today", "all"); an undefined reference ("to be defined", "some", "etc."); an external counterpart named without an interface or an owner; or a Shopware-stock contradiction the Dev Knowledge Base cannot resolve.
|
|
24
8
|
|
|
25
9
|
## Wording
|
|
26
10
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
- Neutral: never lead with
|
|
30
|
-
-
|
|
31
|
-
- Quote the
|
|
11
|
+
- Client's own language. One decision per question. Item ids in the block heading (`analysis-template.md` section 5 grammar).
|
|
12
|
+
- At least two options (`A`, `B`, ...), each with its scope effect in plain words after `— effect:`.
|
|
13
|
+
- Neutral: never lead with a preferred option, never argue for one.
|
|
14
|
+
- Name a `Fallback:` key — the option the estimate assumes until the client answers.
|
|
15
|
+
- Quote the client's own sentence when the ambiguity is internal to their document; cite the Knowledge Base page when it is a stock contradiction, never a claim from memory.
|
|
32
16
|
|
|
33
|
-
##
|
|
17
|
+
## AQ-6 — answering
|
|
34
18
|
|
|
35
|
-
|
|
19
|
+
The operator records the client's chosen option on the page or with `answer <doc> <CQ-n> <key>`. The runtime marks every scope item the question names for re-estimate; a confirmed item among them reopens only when the next `apply` actually changes its Requirement Coverage, Estimation or Client Response (L-3), with the cause in References.
|
|
36
20
|
|
|
37
|
-
|
|
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`.
|
|
21
|
+
## Never ask
|
|
44
22
|
|
|
45
|
-
|
|
23
|
+
- What the client's own document already answers, even if it is on another sheet.
|
|
24
|
+
- What the operator can decide alone (profile inputs, preferred ISVs, phasing) — write a `Q-n` (an operator question, same shape) or resolve it directly.
|
|
25
|
+
- Wording, formatting, or which column to use.
|
|
26
|
+
- Anything the client cannot judge from a technical standpoint (an implementation choice with no client-visible effect).
|
|
46
27
|
|
|
47
|
-
|
|
28
|
+
Test: if answered either way, would a Requirement Coverage value, an Estimation figure or the Client Response text differ? No — no question.
|