@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,116 +1,23 @@
|
|
|
1
|
-
# Context parameters —
|
|
1
|
+
# Context parameters — version, edition, plan
|
|
2
2
|
|
|
3
|
-
The
|
|
4
|
-
analysis on the skeleton write, in this order, with its `#` and `Parameter` verbatim
|
|
5
|
-
from this file — a tender that states nothing still produces the full table. The
|
|
6
|
-
`Value` cell is the client's own words, never rounded, never converted, never inferred
|
|
7
|
-
from another parameter. Where the source is silent the cell reads `_not provided_`.
|
|
3
|
+
Project facts (Shopware version, edition, plan, what the project already built) come from the Dev Knowledge Base MCP only. The tool never researches the project itself outside it — no reading `composer.json`, no scanning `custom/plugins`, no asking the operator to guess.
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
sync and migration effort; order and traffic figures drive performance, hosting and load
|
|
11
|
-
testing; customer and role counts drive the B2B model; media volume drives the migration
|
|
12
|
-
window. A number the tender never stated and nobody asked for is the most expensive kind
|
|
13
|
-
of gap, because it surfaces after the fixed price is signed.
|
|
5
|
+
## Detection
|
|
14
6
|
|
|
15
|
-
|
|
7
|
+
Run once per document per session, before any item is assessed, and pass the result to every agent spawned for that run:
|
|
16
8
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
| `Parameter` | verbatim from this file. |
|
|
21
|
-
| `Value` | the client's words, with their own unit and qualifier (`~6,000`, `approx. 850`, `38 GB`), or `_not provided_`. Several source statements: join with ` · `. |
|
|
22
|
-
| `Source` | `<source-map #> <sheet or section> <row or cell label>`, e.g. `2 Company & Context · Volumes/Products`. `—` when `_not provided_`. |
|
|
23
|
-
| `Drives` | copied from this file — what the figure changes in the estimate. |
|
|
24
|
-
| `Status` | `stated` · `_not provided_` · `_not provided_ ⚠ CQ-n` · `conflicting` (two source statements disagree — always also a `CQ-n`). |
|
|
9
|
+
1. `mcp__ShopwareDevKnowledgeBase__kb_status` — confirms the Knowledge Base is indexed for this project; refuse to assess coverage without it and say so in section 1.
|
|
10
|
+
2. `mcp__ShopwareDevKnowledgeBase__read_doc` the project's own overview/index page for the installed version, edition (Community or the named Commercial plan) and any plan tier facts it records.
|
|
11
|
+
3. `mcp__ShopwareDevKnowledgeBase__grep_docs` for what the project already built, per requirement area, before asking whether a scope item needs Extension or Custom — a feature the project already delivered is OOTB (D-12), not a separate value.
|
|
25
12
|
|
|
26
|
-
A
|
|
27
|
-
it MUST raise a `CQ-n` (SKILL.md step 6, `client-question-rules.md`) and the Status cell
|
|
28
|
-
names that question. A non-**drv** gap is recorded and left alone — it is context, not a
|
|
29
|
-
blocker. `conflicting` always raises a `CQ-n` regardless of **drv**.
|
|
13
|
+
A fact the Knowledge Base does not carry: state it as `not provided by the Dev Knowledge Base` in section 1 rather than guessing; a scope item that depends on it becomes a `Q-n` to the operator, never an assumption dressed as a fact.
|
|
30
14
|
|
|
31
|
-
|
|
32
|
-
writing `~4 variants per parent` into P-02), and never carry a figure over from a
|
|
33
|
-
different tender.
|
|
15
|
+
## What section 1 states
|
|
34
16
|
|
|
35
|
-
|
|
17
|
+
- Detected Shopware version, edition and plan of an existing project, each with the Knowledge Base page it came from — stated here in section 1's meta prose only. The Project information table's `shopware` row (`project-information.md`) instead records the tender's own stated target, Source = the tender location; when the detected version differs from the tender's stated target, raise a `Q-n` to the operator.
|
|
18
|
+
- What the project already built that is relevant to at least one scope item, named by feature, with its Knowledge Base or wiki page.
|
|
19
|
+
- The coverage-to-client-token map is not an intake fact — it is decided at export and stored in the fit-back map (`coverage-mapping.md`).
|
|
36
20
|
|
|
37
|
-
|
|
38
|
-
| --- | --- | --- | --- | --- |
|
|
39
|
-
| P-01 | Sellable SKUs / variants | Catalog | import, indexing, migration, search | drv |
|
|
40
|
-
| P-02 | Parent products | Catalog | catalog modelling, PDP work | drv |
|
|
41
|
-
| P-03 | Categories | Catalog | navigation, migration, SEO | drv |
|
|
42
|
-
| P-04 | Technical attributes / properties (and values) | Catalog | property model, filters, ERP mapping | drv |
|
|
43
|
-
| P-05 | Product images (count and storage volume) | Catalog | media migration, CDN, cutover window | drv |
|
|
44
|
-
| P-06 | Product documents (datasheets, certificates) | Catalog | media or ERP-link decision, migration | drv |
|
|
45
|
-
| P-07 | Hazardous / regulated product share | Catalog | compliance fields, shipping rules | |
|
|
46
|
-
| P-08 | Packaging units, MOQ, order increments | Catalog | cart and pricing logic | |
|
|
47
|
-
| P-09 | Languages / translations | Catalog | snippets, content, ERP language feeds | drv |
|
|
48
|
-
| P-10 | Sales channels and domains | Catalog | channel config, theme, caching | drv |
|
|
49
|
-
| P-11 | Customer groups / price lists | Pricing | pricing model, ERP sync | drv |
|
|
50
|
-
| P-12 | Customer-specific price rows | Pricing | price sync volume, performance | drv |
|
|
51
|
-
| P-13 | Tier / scale price coverage | Pricing | pricing rules, import | |
|
|
52
|
-
| P-14 | Net / gross display rule | Pricing | storefront pricing, tax config | |
|
|
53
|
-
| P-15 | Currencies | Pricing | currency config, rounding | |
|
|
54
|
-
| P-16 | Countries / VAT and delivery scope | Pricing | tax, shipping, legal texts | |
|
|
55
|
-
| P-17 | Companies / accounts | Customers | B2B model, migration | drv |
|
|
56
|
-
| P-18 | Contacts / users | Customers | login migration, roles | drv |
|
|
57
|
-
| P-19 | Addresses | Customers | migration, address model | |
|
|
58
|
-
| P-20 | B2B roles, budgets, approval workflows | Customers | B2B Components vs plugin vs custom | drv |
|
|
59
|
-
| P-21 | Punch-out / procurement accounts | Customers | OCI / cXML scope | drv |
|
|
60
|
-
| P-22 | Orders per day (average) | Orders & traffic | sizing, queue and worker design | drv |
|
|
61
|
-
| P-23 | Orders per day (peak) | Orders & traffic | load test target, hosting | drv |
|
|
62
|
-
| P-24 | Average order value | Orders & traffic | context only, never priced | |
|
|
63
|
-
| P-25 | Lines per order | Orders & traffic | cart performance, ERP payload | |
|
|
64
|
-
| P-26 | Order history to migrate (orders and lines) | Orders & traffic | migration volume and window | drv |
|
|
65
|
-
| P-27 | Sessions per month | Orders & traffic | caching, hosting | drv |
|
|
66
|
-
| P-28 | Peak concurrent users | Orders & traffic | load test target, hosting | drv |
|
|
67
|
-
| P-29 | Device split | Orders & traffic | responsive and mobile scope | |
|
|
68
|
-
| P-30 | CMS / shop pages | Content & media | Shopping Experiences rebuild | |
|
|
69
|
-
| P-31 | Blog posts | Content & media | blog scope, migration | |
|
|
70
|
-
| P-32 | Landing pages | Content & media | rebuild effort | |
|
|
71
|
-
| P-33 | Indexed SEO URLs / redirects | Content & media | redirect map, SEO risk | drv |
|
|
72
|
-
| P-34 | Leading system (ERP) and version | Systems | integration pattern, ownership | drv |
|
|
73
|
-
| P-35 | ERP protocol and API surface | Systems | connector effort, real-time feasibility | drv |
|
|
74
|
-
| P-36 | PIM | Systems | catalog ownership | |
|
|
75
|
-
| P-37 | CRM | Systems | interface scope | |
|
|
76
|
-
| P-38 | Marketing / newsletter systems | Systems | interface scope | |
|
|
77
|
-
| P-39 | PSP and payment methods | Systems | payment scope, PCI posture | drv |
|
|
78
|
-
| P-40 | CMP / consent and analytics | Systems | consent scope, tracking | |
|
|
79
|
-
| P-41 | Search / indexing infrastructure | Systems | OpenSearch, relevance work | |
|
|
80
|
-
| P-42 | SSO / identity provider | Systems | admin and customer login scope | |
|
|
81
|
-
| P-43 | Source platform and version | Migration | migration tooling, effort | drv |
|
|
82
|
-
| P-44 | Migration objects and volumes | Migration | see §1.2 Migration inventory | drv |
|
|
83
|
-
| P-45 | Cutover model and freeze window | Migration | go-live plan, risk | drv |
|
|
84
|
-
| P-46 | Hosting model, region and certification | Commercial & timeline | hosting recommendation, operations | |
|
|
85
|
-
| P-47 | Shopware edition / plan expectation | Commercial & timeline | plan decision, class ladder | drv |
|
|
86
|
-
| P-48 | Budget as stated (verbatim, context only) | Commercial & timeline | recorded, never compared, never priced | |
|
|
87
|
-
| P-49 | Questions-until / proposal due dates | Commercial & timeline | question deadline, run planning | |
|
|
88
|
-
| P-50 | Award, kickoff and go-live dates | Commercial & timeline | plan feasibility, phasing | drv |
|
|
21
|
+
## Passed to every agent
|
|
89
22
|
|
|
90
|
-
|
|
91
|
-
parameter table is complete on its own. They are the same values, quoted the same way.
|
|
92
|
-
|
|
93
|
-
## Question stubs for a missing **drv** parameter
|
|
94
|
-
|
|
95
|
-
`client-question-rules.md` governs the wording; these are the decisions to offer. Ask
|
|
96
|
-
for the figure, never for a design.
|
|
97
|
-
|
|
98
|
-
| # | Question | Options to offer |
|
|
99
|
-
| --- | --- | --- |
|
|
100
|
-
| P-01 · P-02 · P-03 · P-04 | catalog size | brackets that change the class, e.g. `< 5,000 SKUs` · `5,000–50,000` · `> 50,000`, plus `Other:` |
|
|
101
|
-
| P-05 · P-06 | media count and storage volume | brackets in files and GB |
|
|
102
|
-
| P-09 | which languages, and who supplies the translations | `client supplies` · `bidder translates UI only` · `bidder translates all` |
|
|
103
|
-
| P-10 | how many sales channels and domains | `one` · `one per country` · `Other:` |
|
|
104
|
-
| P-11 · P-12 · P-13 | how prices are structured and how many customer-specific rows | brackets |
|
|
105
|
-
| P-17 · P-18 · P-20 · P-21 | company/contact counts, and which B2B roles and approval rules apply | the role model options |
|
|
106
|
-
| P-22 · P-23 · P-26 · P-27 · P-28 | order and traffic figures, and how much history must be migrated | brackets; `no history` · `2 years` · `5 years` · `all` |
|
|
107
|
-
| P-33 | indexed URLs and whether a redirect map is required | `redirect map required` · `not required` |
|
|
108
|
-
| P-34 · P-35 | leading system, its version and the API it offers | `documented REST/OData` · `file exchange only` · `to be built by the client's partner` |
|
|
109
|
-
| P-39 | PSP and payment methods in scope | the method list |
|
|
110
|
-
| P-43 · P-44 · P-45 | source platform, migration objects and the cutover model | `big-bang` · `phased` · `Other:` |
|
|
111
|
-
| P-47 | which edition/plan the client expects to licence | `Community` · `Rise` · `Evolve` · `Beyond` · `bidder recommends` |
|
|
112
|
-
| P-50 | the go-live date and whether it is fixed | `fixed` · `target` · `Other:` |
|
|
113
|
-
|
|
114
|
-
One question may cover a whole group of missing parameters in that table (one `CQ-n`
|
|
115
|
-
for "catalog size", not four); every parameter it covers names it in its Status cell.
|
|
116
|
-
The cap in SKILL.md step 6 applies to these questions like any other.
|
|
23
|
+
Every `sw-product-manager` and `sw-shopware-architect` spawn receives: the detected version/edition/plan from this file, section 1's Project information table, and, per scope item it is given, that item's own Internal note (read-only) and its own rejected proposals (`References` `rejected:` lines plus any `rejected` entries in `proposals.json` for that item or global) with an instruction never to re-propose them (AQ-4).
|
|
@@ -1,62 +1,39 @@
|
|
|
1
|
-
# Coverage
|
|
1
|
+
# Requirement Coverage
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Six values, exactly, and no others: `OOTB · Configuration · Extension · ISV · Custom · —`. Every method file, the runtime and every agent use these six and these six only.
|
|
4
4
|
|
|
5
|
-
|
|
|
6
|
-
| --- | --- |
|
|
7
|
-
|
|
|
8
|
-
|
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
| Value | Meaning | Must name | Estimation |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| OOTB | The base already does it — stock Shopware, or already delivered by the project. | The stock feature and its KB page, or the project's implementation. | `0 PD` |
|
|
8
|
+
| Configuration | The base has it; a consultant sets it up in the Administration — Rule Builder, Flow Builder, Shopping Experiences, settings, import profiles. No code. | The admin surface. | never `0 PD` |
|
|
9
|
+
| Extension | The base has the entity, service, route or UI that does most of the job; we extend it — subscriber, decorator, custom field, Flow action, CMS element, or the project's own extension. | The stock or project feature extended, with its KB page. | the delta |
|
|
10
|
+
| ISV | A Shopware Store extension covers it; we install, configure and integrate it. | Extension, vendor, supported Shopware versions, link. Compatible with the detected version and plan, with no licence terms or amounts attached. | integration and configuration |
|
|
11
|
+
| Custom | A significant part is missing from the base; we build the domain. | Nothing to extend but the DAL or the plugin system. | the whole vertical |
|
|
12
|
+
| `—` | Not about Shopware functionality: training, documentation, go-live support. | — | still carries effort |
|
|
13
|
+
|
|
14
|
+
Each value's basis is a References line in the Knowledge Base's own feature names: `kb: <page>` for OOTB/Configuration/Extension against the platform docs, `project: <implementation or wiki page>` when the project itself already built it, `isv: <extension> · <vendor> · <supported versions> · <url>` for ISV. A claim the Knowledge Base does not cover becomes an assumption proposal (`assumption-catalogue.md`), never a guess written straight into Requirement Coverage.
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## Client-token map — decided agentically at export
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
The six Requirement Coverage values are mapped to the client's own compliance tokens at export, not at intake (`procedure.md` step 7, `editor-session.md` batch kind `export`). Tables are identified by their `<sheet> r<headerRow>` key, unique across the fit-back map. `tokens --suggest` prints the heuristic proposal per table key, the table's client token list, and its numeric legend when it has one; the map is decided from that input and stored with `tokens --file`, keyed the same way, for every later export of the same table.
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Every one of the six values is something the partner delivers, so **never map to a negative token** — never "not offered", "not supported", "no", or "roadmap":
|
|
21
|
+
|
|
22
|
+
| Value | Pick |
|
|
21
23
|
| --- | --- |
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
| `stock` | Stock, Standard, OOTB, Out of the box, Core | Standard, Im Standard, Enthalten |
|
|
39
|
-
| `config` | Config, Configuration | Konfiguration |
|
|
40
|
-
| `plugin` | Plugin, Extension, App, Store plugin | Plugin, Erweiterung, App |
|
|
41
|
-
| `custom` | Custom, Development, Customisation | Individualentwicklung, Anpassung, Entwicklung |
|
|
42
|
-
| `not-offered` | Not offered, No, Not available | Nicht angeboten, Nein, Nicht verfügbar |
|
|
43
|
-
|
|
44
|
-
## Edition tiers — indicative, never evidence
|
|
45
|
-
|
|
46
|
-
Starting hypothesis, taken from this harness's PRD checklist (`sw-design-requirements/reference/prd-confidence-checklist.md` §I). The PM verifies every cell the response relies on, every run, against `platform/func/commercial-features/*` and docs.shopware.com for the detected version. Conflicting tier documentation exists for some B2B capabilities — when the PM reports `conflict`, the row is a `CQ-n` against the client's contract, not a guess.
|
|
47
|
-
|
|
48
|
-
| Capability | Community | Rise | Evolve | Beyond | Verify at |
|
|
49
|
-
| --- | --- | --- | --- | --- | --- |
|
|
50
|
-
| B2B Components (employees, roles, quick order, shopping lists) | — | — | ✓ | ✓ | `platform/func/commercial-features/b2b-components*` |
|
|
51
|
-
| B2B order approval, budgets | — | — | verify | ✓ | same |
|
|
52
|
-
| B2B quote management | — | — | verify | ✓ | same |
|
|
53
|
-
| Sales agent / order on behalf (imitate customer is core) | core: imitate only | core | verify | ✓ | same |
|
|
54
|
-
| Custom Products | — | ✓ | ✓ | ✓ | `platform/func/commercial-features/custom-products*` |
|
|
55
|
-
| Advanced Search | — | verify | ✓ | ✓ | `platform/func/commercial-features/advanced-search*` |
|
|
56
|
-
| Multi-Inventory | — | — | ✓ | ✓ | `platform/func/commercial-features/multi-inventory*` |
|
|
57
|
-
| Subscriptions | — | — | — | ✓ | `platform/func/commercial-features/subscriptions*` |
|
|
58
|
-
| Returns Management | — | verify | ✓ | ✓ | `platform/func/commercial-features/returns*` |
|
|
59
|
-
| Admin SSO / 2FA | 2FA via plugin | verify | verify | verify | `platform/func/settings/*`, docs |
|
|
60
|
-
| Flow Builder premium actions (delay, webhooks) | delay: verify | verify | ✓ | ✓ | `platform/func/settings/flow*` |
|
|
61
|
-
|
|
62
|
-
**Community rule.** With Community as the recommended plan, every row that B2B Components would cover becomes `custom` and typically doubles; the architect returns the alternative and §2 shows both variants until the plan is decided.
|
|
24
|
+
| OOTB | The best "standard / yes / fully" token. |
|
|
25
|
+
| Configuration | The configuration-style token, or the next best after OOTB. |
|
|
26
|
+
| Extension | The customisation- or development-style token. |
|
|
27
|
+
| Custom | The customisation- or development-style token. |
|
|
28
|
+
| ISV | The third-party / partner / add-on-style token when the list has one; otherwise the same customisation-style token as Extension/Custom. |
|
|
29
|
+
| `—` | An N/A-style token when the list has one; otherwise the OOTB token — never a negative token such as "Not offered". |
|
|
30
|
+
|
|
31
|
+
A numeric legend (key → label): pick the key by what its label means, never by the number's position. No token list in the client's file: use the scale the client's instructions define, or a neutral `Yes / Partially / No`, and record the scale used and the chosen map in the confirmed import map (`tokens --file`), not in section 1.
|
|
32
|
+
|
|
33
|
+
## ISV research
|
|
34
|
+
|
|
35
|
+
Coverage is checked only against the Shopware platform documentation and the Shopware Dev Knowledge Base MCP. Exception: for ISV items the architect researches the Shopware Store and vendor pages directly (WebFetch/WebSearch) — there is no marketplace layer in the Knowledge Base yet. An ISV item names the extension, its vendor, the Shopware versions it supports, and a link; it must be compatible with the detected version and plan, and carry no licence terms or amounts — never name a fee, a cost or a rate for it (`estimation-model.md`, money rule).
|
|
36
|
+
|
|
37
|
+
## Project facts
|
|
38
|
+
|
|
39
|
+
The detected Shopware version, edition and plan, and what the project already built, come from the Dev Knowledge Base only (`context-parameters.md`). The tool never researches the project itself outside the Knowledge Base.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Editor session — `--editor`
|
|
2
2
|
|
|
3
|
-
The Tender Discovery Tool: a local live page for one
|
|
3
|
+
The Tender Discovery Tool: a local live page for one working document. The skill session that received `--editor` runs this loop and nothing else; nothing is read, intaken or assessed before the page is open.
|
|
4
4
|
|
|
5
5
|
**The protocol is not in this file.** Run
|
|
6
6
|
|
|
@@ -8,108 +8,67 @@ The Tender Discovery Tool: a local live page for one analysis document. The skil
|
|
|
8
8
|
npx -y @execuro-sw-ecosystem/sw-tender-discovery-tool@latest guide
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
and follow it:
|
|
11
|
+
and follow it: the xlsx import, start, poll, emit, redelivery and close, and every command's `next_step:` line. This file adds only what `guide` cannot know: the install gate, which batch kinds this skill runs, the subagent brief, and the close report.
|
|
12
12
|
|
|
13
13
|
## 0. Install gate
|
|
14
14
|
|
|
15
|
-
The Tender Discovery Tool is an
|
|
16
|
-
|
|
17
|
-
Before anything else, check whether that skill is present in this host's skills directory. Present → continue. Absent → **stop the run**. Do not fall back to non-editor mode, do not write the analysis, do not continue the procedure. Tell the user in one line: the Tender Discovery Tool is not installed; run the `sw-setup` skill to add it, or re-run without `--editor`. The `.xlsx import` step in `reference/procedure.md` uses this same gate and stops the same way.
|
|
15
|
+
The Tender Discovery Tool is an optional add-on: what a host installs is its own skill, `sw-tender-discovery-tool`, shipped inside the npm package and installed by `sw-setup`. Before anything else, check whether that skill is present in this host's skills directory. Present — continue. Absent — stop the run. Do not fall back to non-editor mode. Tell the user in one line: the Tender Discovery Tool is not installed; run the `sw-setup` skill to add it, or re-run without `--editor`.
|
|
18
16
|
|
|
19
17
|
## 1. Prepare
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
- `<slug>` = file name without `-analysis.md` (or without the source extension); analysis `specs/<slug>-analysis.md`; session folder `specs/.editor/<slug>/` (gitignored).
|
|
23
|
-
- **Row-batch setting:** `--batch <n|all>` from the invocation, else the analysis frontmatter's `batch:`, else 50. Keep it for the whole session and pass it to every subagent. `guide` knows nothing about this.
|
|
19
|
+
`<slug>` = the source file name without its extension. Working document `specs/rfp-<slug>-analysis.md`. Session state under `specs/.editor/<slug>/`, gitignored.
|
|
24
20
|
|
|
25
21
|
## 2. Open the session
|
|
26
22
|
|
|
27
|
-
Follow `guide` steps 0
|
|
28
|
-
|
|
29
|
-
Keep the printed `TENDER_TOOL_URL=<url>` (with its trailing slash) for the whole session — the subagent brief needs it.
|
|
30
|
-
|
|
31
|
-
**An xlsx tender's opening batch is the mapping confirmation, not `analyze`.** The page opens on the steering screen, where the user says which tabs are requirement tables, where each header sits and what each column means. Confirming writes the normalised CSVs and arrives here as a batch with `stage: import` (§4). Do not post `analyze` for an xlsx tender.
|
|
23
|
+
Follow `guide` steps 0-1: import an xlsx source first when it has not yet been extracted and intaken, then `start`, then open the printed URL and tell the user in one line. `start` on a source with no working document yet queues the opening `intake` batch itself — extraction plus intake — the moment the page opens; nothing here has to send it. It arrives at the first `poll` in this session, same as any other batch; there is no mapping screen.
|
|
32
24
|
|
|
33
|
-
## 3.
|
|
25
|
+
## 3. Page actions are not batches
|
|
34
26
|
|
|
35
|
-
|
|
27
|
+
Move an item, skip an item, restore an item, edit a Project information value, answer a client question, edit a profile input, patch a Client Response or an Internal note, and export are all handled by the runtime's own commands directly (`move`/`skip`/`restore`/`info`/`confirm`/`unconfirm`/`assume`/`unassume`/`answer`/`patch`/`profile`/`export`); the page calls them without spawning this skill (`confirm` and `unconfirm` save at once even while this session's run holds the lock, so `apply` sees a confirmed row as confirmed), except when export needs a token map first — see the `export` batch kind below. Accepting or rejecting a proposal instead queues a decision alongside notes; the server applies it through the same `accept`/`reject` commands the moment a `notes` batch is sent — before this skill ever sees the batch (see the `notes` row below) — never re-applied by this session. Move, skip and restore work at any time, through a row note — skipping a confirmed item is refused ("unconfirm first"), and the operator's own `unconfirm` (a second click on the row's confirm tick, no dialog) reopens the item so a skip or another correction can follow. Intake queues the opening `analyze` batch itself once it confirms, and an `accept`/`answer`/`profile` change queues a `reestimate` batch the same way — this session never has to send either. `intake-confirm` stays only for an old document still at `intake: review`, and this session runs it on the operator's go before any of the above. This session only spawns a subagent for the five batch kinds below.
|
|
36
28
|
|
|
37
|
-
|
|
38
|
-
| --- | --- | --- |
|
|
39
|
-
| analysis `missing` | `batch --kind analyze` | Steps 1–4 and the skeleton write only, handled by §4. The page renders every requirement row as `queued` within minutes; the estimate batches follow from §4a. |
|
|
40
|
-
| `found`, pending ticks/answers/proposals > 0 | `batch --kind reconcile` | Unreconciled from an earlier session. |
|
|
41
|
-
| `found`, nothing pending | nothing | The page renders the document as it is. |
|
|
42
|
-
| xlsx with no confirmed mapping | nothing | §2: confirming the mapping is the opening batch. |
|
|
29
|
+
## 4. Batch kinds
|
|
43
30
|
|
|
44
|
-
|
|
31
|
+
| kind | Work |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| `intake` | Extraction (`procedure.md` step 1): `sw-tender-editor`'s `extract` job on the digest or the PDF, then `intake`. Writes section 1's Project information and Not taken tables and every new item `queued`, then confirms itself (`intake: confirmed`) and queues the opening `analyze` batch. |
|
|
34
|
+
| `analyze` | Assess exactly the batch's `items` (about 15 ids, in page order — `procedure.md` step 2): split into groups of about 5, spawn PM→architect pairs in parallel per group (cap 10 spawns per message), `apply` each report as it returns. Refused while `intake: review` (an old document not yet confirmed). Intake confirming itself, and any re-estimate work while confirmed, queues this automatically — nothing here sends it. The server chains batches on its own: when this one finishes it queues the next chunk of items still needing work, releasing the lock in between so a page action lands before the next chunk starts; the chain ends when no work is left. |
|
|
35
|
+
| `reestimate` | The items named in `reestimate.json` (or all, on `item: "*"`): re-run steps 2-4 for those items only. |
|
|
36
|
+
| `notes` | Queued annotations and/or chat. A note on a scope row reading "move to <tab>" or "skip: <why>" is applied with `move`/`skip` directly, at any time, not folded into re-assessment — skip on a confirmed item is refused ("unconfirm first"). Any queued accept/reject decision on a suggested assumption has already landed by the time this batch is sent (the server applies it while enqueueing the batch) — treat it as done, never re-apply it from the batch payload. Any other note, while `intake: confirmed`: no item is re-assessed and the run records why an annotation was or was not applied. While `intake: review` (an old document), the remaining notes are folded into a re-run of `extract` and `intake`. |
|
|
37
|
+
| `export` | The page's Export enqueues this when an XLSX table still lacks its coverage-to-client-token map: `tokens --suggest`, decide the map per table key `<sheet> r<headerRow>` (`coverage-mapping.md`), `tokens --file`, then `export` (`procedure.md` step 7). Post the output path and the chosen map (per table, six lines) in chat; on a refused token, adjust and retry once, else post the reason. |
|
|
45
38
|
|
|
46
|
-
|
|
39
|
+
Every batch, of every kind, ends with `check <doc> --write` then `report <doc>`, whose output is posted to the page as the reply (`procedure.md` "Run close").
|
|
47
40
|
|
|
48
|
-
|
|
41
|
+
## 5. Handle one batch
|
|
49
42
|
|
|
50
43
|
Spawn ONE subagent (Agent tool, `general-purpose`). Brief, verbatim structure:
|
|
51
44
|
|
|
52
45
|
```
|
|
53
46
|
Run the skill sw-discover-tender in editor mode.
|
|
54
|
-
Invoke it with the Skill tool: skill "sw-discover-tender", args "<
|
|
55
|
-
(kind=
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Append the session's row-batch setting to the args when it is not the default: <--batch n | --batch all>.
|
|
59
|
-
If the Skill tool is not available to you, read the SKILL.md of the `sw-discover-tender` skill and follow it exactly, including its "Editor mode" section.
|
|
60
|
-
Rules: never ask the user a question with a structured question tool (Claude Code: `AskUserQuestion`; Codex: `request_user_input`); every gap becomes a §5 block with options; emit progress with
|
|
47
|
+
Invoke it with the Skill tool: skill "sw-discover-tender", args "<doc path> --editor-session <url> --batch-file <batch file>"
|
|
48
|
+
(kind=intake: args "<source path> --editor-session <url> --intake" — first run on the source).
|
|
49
|
+
If the Skill tool is not available to you, read the SKILL.md of the `sw-discover-tender` skill and follow it exactly.
|
|
50
|
+
Rules: never ask the user a question with a structured question tool (Claude Code: `AskUserQuestion`; Codex: `request_user_input`); every gap becomes a section 5 block with options; emit progress with
|
|
61
51
|
npx -y @execuro-sw-ecosystem/sw-tender-discovery-tool@latest emit progress "<step>" --batch <id>
|
|
62
|
-
before each procedure step and before/after each agent
|
|
63
|
-
Evidence / risk or Risk to says "partner"; frozen accepted/rejected lines stay byte-identical; never edit the client's file.
|
|
52
|
+
before each procedure step and before/after each agent spawn; never write into a confirmed item's Client Response or Internal note except through `patch`; never edit the client's file.
|
|
64
53
|
Context — last chat entries (newest last):
|
|
65
54
|
<last 10 lines of specs/.editor/<slug>/chat.jsonl, use `tail -n 10`>
|
|
66
|
-
|
|
67
|
-
Return, as your final message, the skill's 8-line report with its final `next:` line (plus the 3 export lines for kind=export). Nothing else.
|
|
55
|
+
Return, as your final message, the run report from `report <doc>`. Nothing else.
|
|
68
56
|
```
|
|
69
57
|
|
|
70
|
-
When the subagent returns, post its report as the reply
|
|
71
|
-
|
|
72
|
-
## 4a. Queue the follow-up batches
|
|
73
|
-
|
|
74
|
-
The report's last line is `next: estimate C1,C2 | C3,C4` or `next: none`. After posting the reply, post one `batch --kind batch --stage "<group>"` per group in order, then `--stage finalize` after the last one, then go back to the poll.
|
|
58
|
+
When the subagent returns, post its report as the reply. If it fails or returns nothing usable, still post a reply (`Run failed: <one line>`) so the lock is released.
|
|
75
59
|
|
|
76
|
-
|
|
60
|
+
## 6. Close
|
|
77
61
|
|
|
78
|
-
|
|
62
|
+
The page going quiet (closed tab, reload, laptop sleep) does not end the session right away: `guide` step 7's close grace holds it open for reconnect first, so keep polling through `idle` and only stop on `closed`.
|
|
79
63
|
|
|
80
|
-
On `closed` (or when the server is unreachable): read `specs/.editor/<slug>/session.json` and report
|
|
81
|
-
-
|
|
64
|
+
On `closed` (or when the server is unreachable): read `specs/.editor/<slug>/session.json` and report:
|
|
65
|
+
- document path and the source it answers
|
|
82
66
|
- batches processed this session
|
|
83
|
-
-
|
|
67
|
+
- state, and confirmed-of-total from the last `report`
|
|
84
68
|
- path of the chat log (`specs/.editor/<slug>/chat.jsonl`)
|
|
85
|
-
- how to resume: re-run the same command with `--editor
|
|
69
|
+
- how to resume: re-run the same command with `--editor`
|
|
86
70
|
|
|
87
71
|
## Notes
|
|
88
72
|
|
|
89
|
-
- Order of operations is fixed: server
|
|
90
|
-
-
|
|
91
|
-
- A batch may arrive while rows are still `queued`: that is normal. The user works on the rows already estimated while the rest are still being worked out.
|
|
92
|
-
- Everything under `specs/.editor/` is session state and gitignored; the analysis file next to the source is tracked.
|
|
93
|
-
|
|
94
|
-
## Editor mode — the skill's own run when spawned by this session
|
|
95
|
-
|
|
96
|
-
Invoked by the editor session (`reference/editor-session.md` in this skill's directory, this file) as a subagent: `<analysis path> --editor-session <url> --batch-file <batch.json>`, `<source path> --editor-session <url> --analyze` (first run), or `… --batch-file <batch.json> --export`. `--batch-file` is the session's batch descriptor; `--batch <n|all>` is the row-count setting and means the same here as anywhere. Same procedure (`reference/procedure.md`), same boundaries, same reconciliation, plus:
|
|
97
|
-
|
|
98
|
-
- **Batch kinds.** The batch file's `kind` and `stage` decide the work; a batch is short by design, so the lock is released often and the user's ticks land between batches.
|
|
99
|
-
|
|
100
|
-
| kind · stage | Work |
|
|
101
|
-
| --- | --- |
|
|
102
|
-
| `analyze` | Steps 1–4 and the **skeleton write only**. Do not estimate. End with `next: estimate <groups>` so the session can queue the rest. Under `--batch all` this batch runs steps 1–8 for every row instead and ends with `next: none`. |
|
|
103
|
-
| `batch` · `stage: import` | The user confirmed what is in the client's workbook. Read `import-map.json` (the batch's `importMap` names it): its `tables` are §1.3 Source map — number, sheet name, rows, id column, vendor columns and allowed tokens, all confirmed by a human. Then continue exactly as `analyze`: steps 1–4 and the skeleton write only. |
|
|
104
|
-
| `batch` · `stage: estimate C3,C4` | Step 5 for those clusters only (pipelined per cluster), then `§ROWS` and `§SPLICE`. No totals. `next:` names the groups still left. |
|
|
105
|
-
| `batch` · `stage: finalize` | Step 7 and step 8: §2, score, §3, §5, §6, §7, frontmatter. |
|
|
106
|
-
| `batch` (notes, chat) | A continue run briefed by the notes and chat in the batch file. |
|
|
107
|
-
| `reconcile` | Step 2 first (every `[x]` → `accepted <date>`, `[-]` → `rejected <date>`, ticked options → `.c` lines / `RC-n` and the block dissolved, rows recomputed, §2 rescored, one `C-n` per decision), then steps 4–7 for the rows it touched. |
|
|
108
|
-
| `export` | Reconcile, then step 9. |
|
|
109
|
-
|
|
110
|
-
- **Tick grammar from the page.** The box is matched at the start of the Status cell: `[x] suspect` and `[-] suspect` are a human decision on a suspect line; the suffix is dropped on reconcile. A `[ ]` line whose Evidence / risk says `risk to <x>; partner` (§4) or whose Risk to says `<x> (partner)` (§3) was written by the partner on the page: keep it, estimate its effect like any candidate, never delete or reword it.
|
|
111
|
-
- **Notes.** `comment` notes carry `block`, `blockKind`, `path` (section breadcrumb), `line`–`endLine`, `md` (the block's source line), `quote`, `hash` and sometimes `selection` (the exact text the user highlighted). Open the file at that range under that path, confirm the text matches `md`, fall back to searching for `quote` when lines shifted. By `blockKind`: `req` → the note questions the class, mechanism or estimate: re-spawn the architect for that row only and rewrite the `req` line; `assume` / `global` → rewrite the statement as a new `[ ]` line (a frozen line is never edited; a proposed line may be replaced in place), or adjust `PD saved` when the note is about the figure; `clarify` → the decision text; `question` → reword or re-option the block (keep its id); `section` / `paragraph` / `row` → that text. `free` notes and `chat` are the briefing for the run. No PD figure ever comes from the page: a note asking for a different number is an architect question, not a hand edit.
|
|
112
|
-
- **A note on a row still `queued` or `analysing`** is not an immediate re-spawn: carry it into that row's own estimate batch and answer it there.
|
|
113
|
-
- **Preserve on every write.** Frozen `accepted <date>` / `rejected <date>` lines byte-identical; every `[x]` / `[-]` untouched except by reconciling it; partner-proposed `[ ]` lines; `X-n` exclusions the page added; §1.1, §1.2, §8, §9 and the nine section headings; the frontmatter block. Rewrite lines in place, never regenerate from the template. Every write must leave the document parseable — the page re-renders on each one.
|
|
114
|
-
- **Progress.** `npx -y @execuro-sw-ecosystem/sw-tender-discovery-tool@latest emit progress "<step>" --batch <id>` before each procedure step and before and after each spawn wave; the page shows it. Row status carries the rest: `queued` → `analysing` → `estimated`.
|
|
115
|
-
- **Report.** The 8-line report of step 8 with its `next:` line (plus the 3 export lines); the editor posts it to the page. Never paste the document into the report.
|
|
73
|
+
- Order of operations is fixed: server -> xlsx import (when applicable) -> browser -> opening batch -> loop.
|
|
74
|
+
- Everything under `specs/.editor/` and `specs/.rfp/<slug>/` is session state and gitignored; the working document next to the source is tracked.
|
|
@@ -1,106 +1,70 @@
|
|
|
1
1
|
# Estimation model
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A working document is in one regime at a time. Regime = `profile` when `specs/rfp-partner-profile.md` exists and parses, else `T-shirt`. The runtime applies this rule on every run; the architect never decides the regime.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Regimes
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
| Regime | When | Estimation cell |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| profile | a partner profile exists | The architect's base person-day estimate, one figure, before overhead and buffer. The runtime applies the profile's overhead and buffer and writes `<n> PD` (rounded to 0.25). |
|
|
10
|
+
| T-shirt | no profile | The architect gives a `size`; the runtime looks up the default-scale PD and writes `<SIZE> (<n> PD)` — default scale, before overhead and buffer. |
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
- **low** — everything goes right, named reuse applies
|
|
11
|
-
- **mid** — most likely, drivers partly materialise
|
|
12
|
-
- **high** — every listed driver materialises
|
|
12
|
+
**E-1** One figure per scope item, no low/high range — the architect returns a single `size` (T-shirt) or a single base `pd` (profile) per item in its report JSON; there is no three-point estimate.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
**OOTB effort.** T-shirt regime: the architect gives `size: "—"`; the runtime writes `— (0 PD)`. It also derives `— (0 PD)` when the coverage is OOTB and `size` is omitted, so an architect that forgets the field on an OOTB item is not a validation failure. Profile regime: the architect gives `pd: 0`.
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## Default scale (T-shirt)
|
|
17
17
|
|
|
18
|
-
|
|
|
18
|
+
| Size | PD | What makes it this size |
|
|
19
19
|
| --- | --- | --- |
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
20
|
+
| — | 0 | OOTB. |
|
|
21
|
+
| XS | 0.5 | A setting, a snippet, a flag. |
|
|
22
|
+
| S | 1.5 | One configuration set, or one hook — subscriber, custom field, Flow action, Rule condition. |
|
|
23
|
+
| M | 4 | One feature on one surface with its own UI, or a plain ISV install and configuration. No new entity. |
|
|
24
|
+
| L | 10 | Administration and Storefront, or a new entity with API and UI, or an ISV integration with real mapping. |
|
|
25
|
+
| XL | 25 | A vertical — domain model, admin module, API, storefront, rules — or a two-way interface. |
|
|
26
|
+
| XXL | 50 | Too large for one scope item; flagged *not decomposed*. |
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
**Size-up drivers**, one size each, applied by the architect when sizing: an external counterpart the partner does not control · data migration · a hard non-functional requirement · no stock feature to stand on. Section 1's Project information table is size-up evidence, not a separate driver — high order/traffic volumes, a heavy migration or many sales channels/markets/currencies are what makes a driver apply; cite the relevant Parameter row when it is why an item is sized up.
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
## Not decomposed
|
|
27
31
|
|
|
28
|
-
|
|
29
|
-
1. removes its PD saved from the row's mid; low and high move proportionally
|
|
30
|
-
2. sets the row's class to the line's class when one is stated
|
|
31
|
-
3. resets the row's level to `detailed` (buffer 0%)
|
|
32
|
+
**E-2** A scope item is *not decomposed* when its size is `XXL`, or — in the profile regime — its final Estimation figure (the architect's base `pd`, after the runtime applies overhead and a folded buffer — the only figure the working document stores) is above the profile's big calibration point (the wizard's XL anchor). It is flagged on the page, in section 2 and in the run report, and still exports with its estimate.
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
## Totals
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
**E-3** Section 2 totals by priority (the client's own priority values, verbatim) and by tab (`TABS`, one row per tab with items) always equal the sum of the section 4 Estimation cells; the runtime checks this on every `check` run and refuses to write section 2 otherwise.
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
mid' = mid − Σ PD saved (accepted lines naming the row)
|
|
39
|
-
PD final = mid' × (1 + buffer) × (1 + overhead_pct / 100) → nearest 0.25
|
|
40
|
-
```
|
|
38
|
+
**E-4** A blocked scope item (`blocked CQ-n`) counts at its fallback option's estimate, marked as such in section 2's "Blocked (at fallback)" column. A scope item with no estimate yet (`queued`, `analysing`, `failed`) is counted in "Not estimated", never as `0`.
|
|
41
39
|
|
|
42
|
-
-
|
|
43
|
-
- **Risk buffer** per profile: `folded` multiplies every row by `(1 + buffer_pct/100)` after the fold above; `separate` adds one line in §2 and leaves rows untouched. The fixed-price scope = the Must rows in PD, plus the separate buffer line when that mode is used.
|
|
44
|
-
- **Foundation efforts** (theme base, integration framework, environments, migration tooling) are rows in their own right when the RFP has a row for them; otherwise they attach to the row the architect named and that row's Text says so.
|
|
45
|
-
- **No money.** No cell, line or report figure carries a currency amount; nothing in the profile is a rate or a fee.
|
|
40
|
+
**E-5** Every effort figure names its regime — section 2's `Regime:` line, the page, and the run report all state it; an item's Estimation cell format (T-shirt vs plain PD) already carries it.
|
|
46
41
|
|
|
47
|
-
|
|
42
|
+
**E-6** The client's effort column in the export gets the PD number only — no size letter, no unit text.
|
|
48
43
|
|
|
49
|
-
|
|
44
|
+
## Money
|
|
50
45
|
|
|
51
|
-
|
|
46
|
+
No amount, currency symbol or currency code appears in any file the tool writes, ever — that boundary is absolute, except section 1's Project information table, which keeps the client's or the operator's own figure verbatim (`project-information.md`), and a scope item's `cost:` reference, which carries a one-line cost consequence but no amount (`agent-briefs.md`). The words themselves (`price`, `cost`, `rate`, `fee`, `budget`, and their plurals) are narrower:
|
|
52
47
|
|
|
53
|
-
- **
|
|
54
|
-
- **
|
|
48
|
+
- **Allowed** in a `kb:`/`project:` reference when it is the Shopware feature, route or admin-surface name itself, quoted verbatim (e.g. a KB page literally titled "Customer-specific Prices").
|
|
49
|
+
- **Allowed** in a Client Response when that item's own Requirement text uses the word — mirror the client's own wording back to them; never introduce the word where the client did not use it.
|
|
50
|
+
- **Allowed** in a `cost:` reference — money words there are not the issue, an amount is; the amount check still applies to a `cost:` line.
|
|
51
|
+
- **Otherwise paraphrase**: write "customer-specific pricing", "a configured amount", "the shop's payment methods" — the `-ing`/descriptive form, not the client's word repeated as if it were the tool's own.
|
|
52
|
+
- Never an amount, a currency symbol (`EUR sign`, `dollar sign`, `pound sign`, `yen sign`) or an ISO code (`EUR`, `USD`, `GBP`, `CHF`), under any of the above, `cost:` included.
|
|
55
53
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
- The Must total is reported in PD and never compared with the client's stated budget. A partner who wants a lower Must total gets a `Q-n` with the routes in PD: further accepted lines, phasing Should/Could, or the full scope. Never lower a number to fit.
|
|
59
|
-
- Sum per area first, then per priority, then the total; write the area subtotals in §2 and re-add once before writing.
|
|
60
|
-
- A row whose high is more than 3× its low at `medium` level is a `CQ-n` candidate even without vague phrasing.
|
|
61
|
-
- Rows estimated from `reuse` keep the source row's three-point unless the requirement text differs; then re-estimate.
|
|
54
|
+
This applies to Client Response, Assumptions, References, proposals, item fields, section 1 prose, section 2 and section 8 Log, the run report, and a working-sheet export. The client's own verbatim Requirement text and cells, section 1's Project information table (its own verbatim-amounts rule above), section 3 Exclusions, section 6 Integrations and section 7 Glossary (client transcriptions, `sw-tender-editor`'s `context` job) are exempt from the whole rule — the client may state a budget figure; the tool never repeats it as a figure of its own. `check`'s money scan covers that tool-authored text for a currency symbol or an ISO currency code, and for a price/cost/rate/fee/budget word, applying the `kb:`/`project:`/`cost:` exemptions above and, for a proposal statement, the same Requirement-wording exemption as a Client Response; the amount check still applies everywhere, `cost:` included; it refuses with a reason on a match.
|
|
62
55
|
|
|
63
56
|
## Partner profile
|
|
64
57
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
```markdown
|
|
68
|
-
# RFP partner profile
|
|
58
|
+
`specs/rfp-partner-profile.md`, gitignored, YAML frontmatter:
|
|
69
59
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
## 1. Overhead
|
|
78
|
-
- **PM + QA overhead:** <n>% <!-- combined, folded into every row -->
|
|
60
|
+
```yaml
|
|
61
|
+
calibration: { small: <PD>, big: <PD> }
|
|
62
|
+
overhead: <percent>
|
|
63
|
+
buffer: { percent: <percent>, mode: folded | separate }
|
|
64
|
+
isv: [ { name: <name>, vendor: <vendor>, versions: <supported versions> } ]
|
|
65
|
+
assets: [ { name: <name>, covers: <what>, pdSaved: <PD> } ]
|
|
66
|
+
```
|
|
79
67
|
|
|
80
|
-
|
|
81
|
-
- **Buffer:** <n>% · mode `folded` | `separate`
|
|
68
|
+
Created and edited in a page wizard, offered when no profile exists, skippable. The wizard shows `calibration.small` with an XS anchor and `calibration.big` with an XL anchor, so both figures mean the same thing across operators. `isv[]` carries no licence field — the money rule is a hard boundary, not a simplification. Creating or changing the profile marks every scope item for re-estimate on the next run.
|
|
82
69
|
|
|
83
|
-
|
|
84
|
-
| Item | Preference | Note |
|
|
85
|
-
| --- | --- | --- |
|
|
86
|
-
| Shopware plan | <Rise · Evolve · Beyond, or "per RFP"> | |
|
|
87
|
-
| Hosting | <provider> | <!-- region, managed / PaaS --> |
|
|
88
|
-
| PSP | <provider> | |
|
|
89
|
-
| CMP | <product> | |
|
|
90
|
-
| Store plugins commonly used | <names> | |
|
|
91
|
-
|
|
92
|
-
## 4. Compliance scale when the RFP has none
|
|
93
|
-
`Stock | Config | Plugin | Custom | Not offered`
|
|
94
|
-
|
|
95
|
-
## 5. Reusable assets
|
|
96
|
-
| Asset | Covers | PD saved | Ownership / licence |
|
|
97
|
-
| --- | --- | --- | --- |
|
|
98
|
-
| <own plugin> | <rows/themes> | <n> | |
|
|
99
|
-
|
|
100
|
-
## 6. Standard exclusions and delivery defaults
|
|
101
|
-
- Warranty <n> months · maintenance offer <scope summary>
|
|
102
|
-
- Always excluded: <list>
|
|
103
|
-
|
|
104
|
-
## 7. Response language
|
|
105
|
-
`auto` <!-- follows the RFP --> | en | de
|
|
106
|
-
```
|
|
70
|
+
Estimation formula the runtime applies (profile regime): `round0.25(pd x (1 + overhead/100) x (1 + buffer/100 if folded))`. Buffer mode `separate` states the buffer once in section 2 instead of folding it into each item.
|