@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,98 +1,62 @@
|
|
|
1
|
-
# Procedure — steps
|
|
1
|
+
# Procedure — the seven steps
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Three agents only: `sw-tender-editor`, `sw-product-manager`, `sw-shopware-architect`. No QA agent anywhere in this flow — QA effort sits inside the profile's overhead percentage (AG-5). No general-purpose agent writes a response file of any kind. Every deterministic step below is a runtime CLI call (`npx -y @execuro-sw-ecosystem/sw-tender-discovery-tool@latest <command>`); an agent's only output is its report, saved by the skill and applied with `apply`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Steps 2-6 repeat until the document is *Ready* (every scope item confirmed). One flow for RFI, RFP, RFQ and project plans alike; a greenfield tender, a tender on an existing project and an internal planning exercise all run the same steps.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 1. Intake
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
- **XLSX/CSV**: `import --source <file>` writes `specs/.editor/<base>/import-snapshot.json`, `import-map.proposed.json` and `import-digest.md` — a heuristic proposal of each table's header/data range and columns, no operator step. In an `--editor` session, `emit progress "Reading N sheets…" --batch <id>` before spawning; spawn `sw-tender-editor` for its `extract` job on `import-digest.md` (the one named file it reads); it confirms or corrects the proposed table structure and answer columns, sorts every row into a tab and topic, and returns the extraction JSON (schema in `agent-briefs.md`). Save it to `specs/.rfp/<slug>/extraction.json`, `emit progress "Extracted N items — building working document" --batch <id>`, then run `intake <doc> --source <file> --extraction <json>` — this writes the committed fit-back map (`import-map.json`) for an xlsx source.
|
|
10
|
+
- **PDF**: in an `--editor` session, `emit progress "Reading the source…" --batch <id>` before spawning; spawn `sw-tender-editor` for its `extract` job on the PDF directly; it returns `items`/`projectInfo` only (no `tables`), per the same schema. Save the extraction JSON, `emit progress "Extracted N items — building working document" --batch <id>`, then run `intake <doc> --source <pdf> --extraction <json>`.
|
|
11
|
+
- Either way, `intake` builds section 4 by tab and topic, fills section 1's Project information and Not taken tables, sets every new scope item `queued`, then confirms itself (`intake: confirmed`) and queues the opening analysis chunk automatically — no operator step in between. Then spawn `sw-tender-editor` for its `context` job to write section 1's meta (detected version/edition/plan per `context-parameters.md`, source files and hashes) and section 3's `### Exclusions` from anything the client's document already states.
|
|
12
|
+
- **Operator corrections, at any time**: on the page, the Overview tab shows a Not-taken banner whenever there are Not-taken rows or unused sheets (item counts per tab, the rows with Restore, unused sheets, per-table answer targets); the operator may `move`, `skip` or `restore` an item and edit Project information (`info`) any time, through a queued row note — skipping a confirmed item is refused ("unconfirm first"). Without the page: relay the same actions from chat. A document still at `intake: review` (an old one, from before this behaviour) is confirmed first: show the extraction summary in chat and run `intake-confirm <doc>` only on the user's explicit go-ahead — that alone starts the analysis; a `notes` batch on such a document re-runs `extract` and `intake` with the notes folded in.
|
|
13
|
+
- Re-intake of a new file version (the same or a newer file, any time): re-run `extract` and `intake` as above. A known id (matched by id across the whole document, not per tab) keeps its current tab, topic and every answer field — a text change sets `reopened` (L-5), keeping Assumptions. A new id is `queued`, placed per the extraction. An id that is gone gets a `removed from <file>` reference. A Project information value whose Source is `operator` is kept; the rest are overwritten. Operator skips are kept while their source row still exists. Every re-intake confirms itself again and queues analysis for whatever needs it.
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
## 2. Assess — in chunks, page order
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
Intake confirming itself starts this automatically; there is no Analyze button or step to invoke separately, and re-estimate work (an answered question, an accepted assumption, a profile change) queues into the same chunking. Work through every item that needs it — `queued`, `reopened`, or marked in `reestimate.json` — about 15 at a time, in page order: tabs in `TABS` order, topics in client first-seen order, items in client order within a topic (the same order as section 4, `analysis-template.md` SI-4), so the top of the first tab fills first. Split a chunk into groups of about 5 and spawn, per group, in parallel (cap 10 spawns per message, `agent-briefs.md`):
|
|
18
|
+
- `sw-product-manager` — checks it against the Dev Knowledge Base MCP (platform and project); reports the stock feature or its absence, and drafts a client question when the item is vague. Free-form markdown, returned as its result (it never writes a file in tender work). The skill passes this report to the architect; only the architect's report is machine-applied.
|
|
19
|
+
- `sw-shopware-architect` — reads the PM report, sets Requirement Coverage, Confidence, the Client Response draft and References, and for ISV items researches the Shopware Store and vendor pages directly.
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
`apply` each group's architect report as soon as it returns (below) — the document updates live, one group at a time, rather than waiting for the whole chunk. Once every group in the chunk is applied, take the next chunk of about 15 items needing work and repeat; stop when none are left, then go to "Run close".
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
Every spawn receives the detected version/edition/plan, section 1's Project information table, and, per item in the group, that item's own Internal note (read-only) and its own rejected proposals, with an instruction never to re-propose them (`context-parameters.md` "Passed to every agent").
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
## 3. Propose
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
- `[-]` → `rejected <date>`. Row stays at full scope. One `C-n`.
|
|
25
|
-
- An accepted statement whose text was edited → the accepted line is restored; the edited text becomes a new `[ ]` line with the next `.a<n>` or `A-n`. One `C-n`.
|
|
26
|
-
- A ticked option or filled `Other:` in a §5 block → one `.c<n>` line under each row the block names (`RC-n` in §3 when cross-cutting), source `client, CQ-n` or `partner, Q-n`, status `<date>`. Delete the block. Re-estimate the affected rows: architect re-spawn for those rows only. One `C-n` per block.
|
|
27
|
-
- Source sha256 differs from the frontmatter → new tender version. Re-extract (step 3), compare requirement text per row. Changed rows: every accepted assume line under them and every §3 line naming them → `[ ] suspect`, row re-estimated. New rows are analysed; rows gone from the source are dropped. One `C-n` naming every row. Update `source`.
|
|
28
|
-
- A legacy `provisional, CQ-n` row becomes `estimated, CQ-n`; that status is retired. No `C-n`.
|
|
29
|
-
- An analysis written before this grammar (missing §1.1/§1.2/§8/§9, or with the old flat §1): backfill by running the `§CONTEXT` extraction of step 3 against the committed source exports and splicing §1.1, §1.2, §8 and §9 in. Nothing else about the document changes. One `C-n`.
|
|
30
|
-
- `[x] suspect` / `[-] suspect` count as `[x]` / `[-]` (the page writes them on suspect lines); the suffix is dropped. Partner-proposed `[ ]` lines (`partner` in Evidence / risk or Risk to) are kept as candidates and estimated like any other.
|
|
31
|
-
- Any change after `export.date` → `export.stale: true`.
|
|
27
|
+
The same `sw-shopware-architect` spawn also proposes 1-3 scope-locking assumptions per item (catalogue entries in `assumption-catalogue.md` first, else a new statement, checked against the item's rejected proposals), each a one-sentence, client-agreeable statement with a `pdSaved` greater than 0 and no greater than the item's own effort, and raises client questions for scope items too vague to assess (`client-question-rules.md` AQ-5), in the same report JSON. Every Configuration, Extension, ISV or Custom item returns 1-3 such proposals; a `noProposal: "<reason>"` is valid only when the item's already-accepted assumptions already cover it; OOTB and `—` items are exempt. `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.
|
|
32
28
|
|
|
33
|
-
|
|
29
|
+
## 4. Estimate
|
|
34
30
|
|
|
35
|
-
|
|
31
|
+
The architect sets each item's Estimation in the same report, under the JSON key `effort`: a `size` (T-shirt regime) or a base `pd` (profile regime) per `estimation-model.md`. The architect never applies overhead or buffer — the runtime does, on `apply`.
|
|
36
32
|
|
|
37
|
-
|
|
33
|
+
## Applying an architect report
|
|
38
34
|
|
|
39
|
-
|
|
35
|
+
The architect's result is the report JSON, schema in `agent-briefs.md`. The skill saves it under `specs/.rfp/<slug>/reports/` and runs `apply <doc> --report <json>`. The runtime validates it (the six coverage values, sizes, confidence, reference prefixes, at least two options with an existing fallback key, 1-3 proposals or a `noProposal` valid only when accepted assumptions already cover it, on every non-OOTB item), formats the Estimation cell per regime, stores proposals in the proposal store (rejected-memory applies), opens or keeps `blocked CQ-n` items, and reopens a confirmed item whose Requirement Coverage, Estimation or Client Response actually changed (L-3) — writing the cause into References. An item that fails gets `failed` status and a `failed:` reference; its other fields are kept. When the source document or a PM report names an integration not yet in section 6, spawn `sw-tender-editor`'s `context` job again to refresh it — the architect's own report carries no section 6 prose. A platform, hosting, PSP or CMP decision belongs in that item's Client Response, not in a context section.
|
|
40
36
|
|
|
41
|
-
|
|
37
|
+
## 5. Confirm
|
|
42
38
|
|
|
43
|
-
|
|
39
|
+
The operator accepts or rejects proposals (`accept`/`reject <doc> <P-n>`) — accepting a numeric-PD item's proposal lowers its Effort by `pdSaved` at once, floored, with a later re-estimate refining the figure — edits Client Response and Internal note (`patch <doc> <id> --response <t> --note <t>`), and confirms items (`confirm <doc> <id>...` or `--all-unconfirmed`). Confirming rejects the item's untouched proposals (L-2). The operator's own edits to Client Response or Internal note never reopen a confirmed item (L-4). Confidence never blocks confirmation. A blocked or a failed item can be confirmed; a failed one needs an operator-written Client Response first (L-6).
|
|
44
40
|
|
|
45
|
-
|
|
41
|
+
## 6. Answer
|
|
46
42
|
|
|
47
|
-
|
|
43
|
+
The operator records the client's chosen option (`answer <doc> <CQ-n> <key>`); the runtime marks the affected items for re-estimate and reopens a confirmed one only when the next `apply` actually changes it (L-3).
|
|
48
44
|
|
|
49
|
-
|
|
45
|
+
## Re-estimate (items marked in `reestimate.json`)
|
|
50
46
|
|
|
51
|
-
-
|
|
52
|
-
- **Then, per cluster**: spawn `sw-shopware-architect` for a cluster as soon as *its own* PM report lands; whatever is ready together goes in one message. Never wait for the whole PM set. Set that cluster's rows to `analysing` when its architect is spawned.
|
|
53
|
-
- PM: verdict, plan tier, evidence, gap, vague flag, one draft question per vague row. No effort. Save each report to `pm-C<n>.md`. Architect: class, mechanism cited, low/mid/high, level, drivers, risks, reuse, assumption candidates each naming its row id or `global`, plan alternative, foundation efforts. QA: quality, test, security-testing and accessibility rows only.
|
|
54
|
-
- Cap 10 spawns per message; over it, raise rows per cluster to 20. Failed spawn → `not consulted — <reason>` in §1, rows `_TBD_`. Cut report → ask for numbered parts.
|
|
55
|
-
- **Merge, delegated**: one `sw-tender-editor` per cluster, brief `§ROWS`, spawned as soon as that cluster's architect report lands, in parallel with the other clusters. It joins by row id per `§ROWS` and writes `rows-C<n>.md` (the finished §4 lines) and `tail-C<n>.md` (the numbers, `A-n`, `K-n`, question candidates). The orchestrator reads only the tails.
|
|
56
|
-
- **Splice** (staged writes, stage 2): one `sw-tender-editor` per cluster, brief `§SPLICE`, **one at a time** — only one writer may touch the analysis file — replacing that cluster's `queued` / `analysing` lines with `rows-C<n>.md`. Each splice is one live update on the editor page.
|
|
57
|
-
- Candidates are `[ ]` lines: `<ROW>.a<n>` under the row they name, `A-n` in §3 when no single row owns them. Never applied, never `accepted`. Conflicts → `K-n` in §7.
|
|
47
|
+
A confirmed or reopened item marked for re-estimate is spawned to the architect with its current Requirement Coverage, Estimation and Client Response as brief input (`agent-briefs.md`'s "Re-estimate of a confirmed or reopened item"). The architect returns those fields verbatim unless the new input materially changes them — no cosmetic rewording. `apply` still only reopens on an actual change (L-3), so a verbatim re-estimate leaves a confirmed item confirmed. Re-estimate work joins the same page-order chunking as step 2, whether raised by an answer, an accepted assumption or a profile change.
|
|
58
48
|
|
|
59
|
-
|
|
49
|
+
## Run close — every run
|
|
60
50
|
|
|
61
|
-
|
|
62
|
-
- **Missing key parameter** `CQ-n` per `context-parameters.md`'s question stubs: an estimate-driving (`drv`) §1.2 parameter whose Status is `_not provided_`, or any `conflicting` parameter, raises a `CQ-n`; the parameter's Status cell names it. One question may cover a whole group (one `CQ-n` for "catalog size", not four). Counts against the same cap of 25.
|
|
63
|
-
- **Partner** `Q-n` only when the answer changes a token, a PD figure or a statement: plan choice, a `K-n` swing above 2× on a Must row, a reuse claim, the profile, Must-total reduction routes in PD. Options with the PD consequence, `Other:`. `high` = touches a Must row.
|
|
64
|
-
- Every question is a §5 block with option checkboxes. Nothing is asked in chat.
|
|
51
|
+
Every chunk, whatever step it did, ends with `check <doc> --write` (grammar, the six values, reference prefixes, the money scan, section 2 totals equality — refuses with reasons on failure). `report <doc>` refuses to run while `check` fails, because it appends to section 8 and section 8 must only ever record a run that left the document valid. On a `check` failure: fix what the reasons name (a malformed row, a money-word hit, a totals mismatch) and re-run `check --write`; when the cause is an item the last `apply` got wrong, re-apply a corrected report for that item, then `check --write` again. Only once `check --write` passes, run `report <doc>` — it prints the P-9 run report (state, confirmed of total, failed, open client questions, not decomposed, low confidence, estimation by priority with regime, waiting proposals, what changed including reopened items), appends the run to section 8, and writes `last-run.json`. Section 8 is written by `report` and by `export` alone — no other step, and no agent, ever appends to it. The skill posts the P-9 report to chat, once per chunk.
|
|
65
52
|
|
|
66
|
-
|
|
53
|
+
## 7. Export
|
|
67
54
|
|
|
68
|
-
|
|
55
|
+
`export <doc>` — available anytime (X-1); unconfirmed items export with empty answer cells. XLSX source: a surgical copy of the client's workbook (X-2 to X-4). CSV/PDF source: a working-sheet XLSX built from the sections (X-5), no token map needed. Every export writes the next `<base>-response-v<n>.xlsx`, never overwriting an existing file, and appends its own section 8 Log line naming `v<n>`, the file, confirmed count and what changed since the last export (X-9). See `response-rules.md`.
|
|
69
56
|
|
|
70
|
-
|
|
57
|
+
**XLSX source, plain mode "export …" or an `export` batch (`editor-session.md`):** when a table lacks its coverage-to-client-token map, decide it before exporting:
|
|
71
58
|
|
|
72
|
-
|
|
73
|
-
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- assumptions proposed / accepted / rejected / suspect
|
|
77
|
-
- open questions: client n (blocking n, deadline) · partner n (high n)
|
|
78
|
-
- clarifications applied this run · `export stale` when set
|
|
79
|
-
- platform: plan · hosting · PSP · CMP, `_TBD_` named
|
|
80
|
-
- agents: PM n, architect n, QA yes|no, `not consulted — <reason>`
|
|
81
|
-
|
|
82
|
-
Then one machine-readable line for the editor loop, always last: `next: estimate C1,C2 | C3,C4` — the groups still to estimate, each whole clusters totalling at most `<batch>` rows — or `next: none` when §4 holds no `queued` row (always the case under `--batch all`).
|
|
83
|
-
|
|
84
|
-
When the gate below holds, one more line: "Generate the response CSV?" Then end.
|
|
85
|
-
|
|
86
|
-
### 9. Export
|
|
87
|
-
|
|
88
|
-
- **Gate.** Status Ready to submit: confidence > 90, no open `high` `Q-n`, no blocking `CQ-n` on a Must row, zero `suspect`, zero unreconciled ticks. Otherwise refuse with one line per failing condition.
|
|
89
|
-
- **Trigger.** "yes" to the report question, `--export`, or an explicit request. Reconcile first, re-check the gate.
|
|
90
|
-
- **Input.** The source as the analysis read it (sha256 must match the frontmatter) and the analysis file. Never the workbook, never a hidden sheet, nothing from memory. §1.1, §1.2, §8 and §9 are analysis context — never written into a response CSV.
|
|
91
|
-
- **Prepare** `specs/.rfp/<slug>/resp-common.md`: per table the client's header row verbatim, delimiter, quoting and BOM (mirroring the operator's CSV, else UTF-8 BOM, `;` for German, `,` otherwise), the token list, the RFP language, overhead and buffer as applied in §2.
|
|
92
|
-
- **Spawn** one general-purpose sub agent per cluster, one message, cap 10, brief §RESP with `reference/response-rules.md` in this skill's directory. Each writes `specs/.rfp/<slug>/resp-C<n>.csv`. Failed spawn → stop: `not exported: cluster C<n>`; no partial file is presented.
|
|
93
|
-
- **Assemble and check, delegated**: one `sw-tender-editor` per client table, all in one message, cap 10, brief `§ASSEMBLE`. Each concatenates its cluster CSVs behind the client's header row into `<source basename>-response-<n>-<table-slug>.csv` (`<n>` and slug from the Source map) and runs the file checks: row count and id sequence equal the source table; header equals the client's; every compliance value in the allowed list; every effort cell a number, 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. Any failure → the agent deletes the file and returns the failing check. The orchestrator never reads the CSVs.
|
|
94
|
-
- **Check the sums** itself, from the returned per-table effort sums: they must equal §2 per priority. Mismatch → delete the files, report the check.
|
|
95
|
-
- **Write back.** Frontmatter `export: {date, files, source_sha256, stale: false}`; one `C-n`: `Response exported: <files> files, <rows> rows, Must <n> PD`.
|
|
96
|
-
- **Workbook copy.** After every response CSV passes its checks, run `npx -y @execuro-sw-ecosystem/sw-tender-discovery-tool@latest export --xlsx --source <file>`: it writes `<source basename>-response.xlsx`, a copy of the client's own workbook with compliance, comment and effort filled in from those CSVs, styles and dropdowns intact. The client's original is never written. Only for an xlsx tender with a confirmed mapping; a CSV/markdown tender stops at the CSVs.
|
|
97
|
-
- **Report** three lines: files with row counts · Must / Should / Could as exported · checks passed or the failing check.
|
|
98
|
-
- Same analysis and same source give byte-identical files.
|
|
59
|
+
1. `tokens <doc> --suggest` — prints, per table (identified by its `<sheet> r<headerRow>` key), the heuristic proposal, the client's compliance token list, and its numeric legend if any.
|
|
60
|
+
2. Decide the six-value → client-token map per table from that output and `coverage-mapping.md`'s rule (never a negative token; `—` to an N/A-style token or the OOTB one; a numeric legend picked by label meaning).
|
|
61
|
+
3. `tokens <doc> --file <json>` with the map, keyed by `<sheet> r<headerRow>`, then `export <doc>`. If the runtime refuses a value (unknown token, negative token), adjust that value and retry once; a second refusal is posted to chat verbatim instead of retried again.
|
|
62
|
+
4. Post the exported file path and the chosen map (per table key, its six value → token lines) in chat.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Project information
|
|
2
|
+
|
|
3
|
+
Section 1's `### Project information` table, 18 fixed rows, `PROJECT_INFO` (runtime constant, `parse.mjs`), in this order. `sw-tender-editor`'s `extract` job fills `projectInfo` for as many keys as the source states; `intake` writes the table, a missing key becomes `not stated` with an empty Source; the operator edits a Value directly (`info <doc> <key> "<value>"`, Source becomes `operator`).
|
|
4
|
+
|
|
5
|
+
| Key | Capture | Feeds |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| `business-model` | B2B, B2C, marketplace, wholesale, or a mix, in the client's own words. | which agent-brief facts and assumption keys apply (e.g. `AS-B2B-*`). |
|
|
8
|
+
| `markets` | Countries or regions the shop serves. | sales-channel and localisation size-up. |
|
|
9
|
+
| `languages` | Storefront/admin languages required. | content-migration and localisation size-up. |
|
|
10
|
+
| `currencies` | Currencies the shop must price and sell in. | pricing and checkout size-up. |
|
|
11
|
+
| `sales-channels` | Storefront, marketplace, B2B portal, POS — however many the client runs or wants. | `AS-PLAT-02`-style channel assumptions; size-up. |
|
|
12
|
+
| `customers` | Customer types and groups (retail, trade, tiered). | pricing/access-rule size-up. |
|
|
13
|
+
| `products` | SKU count and catalogue shape (simple vs. variants). | catalogue and search size-up. |
|
|
14
|
+
| `catalogue-structure` | Category depth, attribute/property count. | Shopping Experiences and filtering size-up. |
|
|
15
|
+
| `media` | Image/asset volume and where it lives today. | migration size-up. |
|
|
16
|
+
| `catalogue-updates` | How often the catalogue changes and which system leads it. | integration and sync-pattern assumptions (`AS-ERP-*`). |
|
|
17
|
+
| `price-model` | List, tiered, negotiated, contract pricing — structure, and a figure if the client or operator states one. | pricing-engine and B2B size-up. |
|
|
18
|
+
| `orders` | Orders per day, average and peak. | performance and hosting size-up. |
|
|
19
|
+
| `traffic` | Visitors/peak concurrency. | performance and hosting size-up (`AS-OPS-*`). |
|
|
20
|
+
| `current-platform` | The platform being replaced or extended, if any. | migration scope and data-mapping size-up. |
|
|
21
|
+
| `leading-systems` | ERP / PIM / CRM the shop must integrate with. | integration size-up (`AS-ERP-*`). |
|
|
22
|
+
| `data-migration` | What data must move (orders, customers, content, media). | `AS-MIG-*` assumptions; size-up. |
|
|
23
|
+
| `go-live` | Target go-live date or window. | timeline and Project & services sizing. |
|
|
24
|
+
| `shopware` | The tender's own stated target Shopware version / edition / plan — Source is where the tender states it, never the Dev Knowledge Base. | `AS-PLAT-*` assumptions; compared against `context-parameters.md`'s Dev KB detection of an existing project — a difference raises a `Q-n`. |
|
|
25
|
+
|
|
26
|
+
Rules:
|
|
27
|
+
- **Value**: free text, or `not stated` — never invented, never guessed from another tender.
|
|
28
|
+
- **Source**: `<sheet> r<row>` (xlsx/csv), `PDF p<page>` or `PDF §<heading>`, `operator` (an `info` edit), or empty; several locations may be joined with "; " (`<sheet> r<row>; <sheet> r<row>`).
|
|
29
|
+
- **Amounts**: a Value is the client's or the operator's own fact, kept verbatim, a figure included (EUR 380, €120k, 160,000 EUR) — `check`'s money scan does not cover this table. Elsewhere the tool writes no money of its own (`estimation-model.md`'s money rule); this table only ever repeats what the source or the operator already stated, never invents or computes a figure.
|
|
30
|
+
- **Value qualification**: state what the source gives; qualify a Value that is not exactly what the key asks (e.g. "up to 10 orders a day per buyer — no shop total stated") rather than computing or inventing the missing figure.
|
|
31
|
+
- A missing, unknown or out-of-order Parameter row is a parse error naming the row.
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Export rules
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The runtime's `export` command applies these; this file is the reference an agent or the operator checks a result against. No agent writes an export file — export is a runtime command / API call, and there is no per-cluster CSV of any kind.
|
|
4
4
|
|
|
5
|
-
- **
|
|
6
|
-
- **
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
5
|
+
- **X-1** Available anytime. Unconfirmed scope items export with empty answer cells.
|
|
6
|
+
- **X-2** XLSX input: `<source basename>-response-v<n>.xlsx` (X-9), a copy of the client's own workbook. The original is never modified. `export` refuses while any exported table lacks its coverage-to-client-token map, listing the tables (by their `<sheet> r<headerRow>` key) — map them first (`coverage-mapping.md`, `procedure.md` step 7).
|
|
7
|
+
- **X-3** Fit-back by item pointer: export resolves each item via the committed fit-back map (`import-map.json`, `<srcdir>/<base>/import-map.json`) — `items[id].table` names the table, `items[id].row` the row — and writes the mapped compliance token, the Client Response and the effort into the client's own columns at that row. An item with no pointer is reported as `not written: <id> (no source row)`, never silently dropped. The coverage-to-client-token map is decided agentically at export, not at intake (`coverage-mapping.md`), and stored per table key for later exports of the same document. Accepted assumptions go into the mapped assumptions column when a table named one; otherwise they follow the Client Response as bullets in the same cell. No column is added.
|
|
8
|
+
- **X-4** Surgical write: only the written cells change; every other part of the workbook is copied byte-for-byte; Excel recalculates on open. No library that re-serialises the workbook.
|
|
9
|
+
- **X-5** CSV or PDF input: no fit-back map — `<source basename>-response-v<n>.xlsx` (X-9) built as the tool's own workbook mirroring the working sheet's own tabs in page order: `Overview` (regime, totals by priority and by tab, readiness counts), `Project information` (`Parameter · Value · Source`), `Functional`/`Non-functional`/`Project & services` (always present, columns `ID · Topic · Requirement · Requirement Coverage (the six values as-is) · Estimation · Client Response · Assumptions`, answer cells filled for confirmed items only), `Integrations`, `Glossary`; `Log` and References are never exported.
|
|
10
|
+
- **X-6** The page shows each scope item's exact exported text before it is confirmed, for every item, confirmed or not.
|
|
11
|
+
- **X-7** The tool writes no cost, price, rate, licence fee or budget of its own — see `estimation-model.md`'s money rule for the exact word list, the `cost:` exemption and scope. Project information keeps the client's or the operator's own figure verbatim; a `cost:` reference is never exported.
|
|
12
|
+
- **X-9** Numbered exports: every export writes `<base>-response-v<n>.xlsx`, `n` the next free number — an existing file, and an explicit `--out` that already exists, are never overwritten. Each export appends a section 8 Log line: `- <date> · export v<n> · <file> · confirmed <c>/<n> · changed since v<n-1>: <k>`. "Changed since last export" is the set of confirmed items whose exported text differs from the last export's snapshot, or that are newly confirmed since then; it is shown in the CLI export output, in the section 8 line, and as a page filter.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
Unproven in the XLSX writer, per the task 3 POC: conditional formatting, print area, over-wide or x14 validation, tables, pre-filled answer cells, desktop Excel, Google Sheets.
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# Confidence rubric
|
|
2
|
-
|
|
3
|
-
Score each dimension 0–100 against its bands, multiply by weight, sum, round to a whole percent. `points = score × weight / 100`. Score the document as written; a verdict given in chat does not count.
|
|
4
|
-
|
|
5
|
-
## Coverage evidence — weight 20
|
|
6
|
-
|
|
7
|
-
| Score | Band |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| 100 | Every Must `req` line's class rests on a PM verdict or a mechanism cited to `vendor/` or a KB page; ≤5% of rows `unverified` |
|
|
10
|
-
| 70 | ≤15% `unverified`; Should/Could rows partly evidenced |
|
|
11
|
-
| 40 | The PM wave was partly not consulted, or >15% `unverified` |
|
|
12
|
-
| 0 | Classes set from memory |
|
|
13
|
-
|
|
14
|
-
## Estimate basis — weight 20
|
|
15
|
-
|
|
16
|
-
| Score | Band |
|
|
17
|
-
| --- | --- |
|
|
18
|
-
| 100 | Every estimated row has low/mid/high, a level and drivers; foundation efforts attached to named rows |
|
|
19
|
-
| 70 | ≤10% of estimated rows lack a three-point |
|
|
20
|
-
| 40 | The architect was not consulted for at least one cluster |
|
|
21
|
-
| 0 | PD figures without agent input |
|
|
22
|
-
|
|
23
|
-
## Scope lock — weight 20
|
|
24
|
-
|
|
25
|
-
Counts `accepted` lines only. `[ ]`, an unreconciled `[x]`, `rejected` and `suspect` count as nothing.
|
|
26
|
-
|
|
27
|
-
| Score | Band |
|
|
28
|
-
| --- | --- |
|
|
29
|
-
| 100 | ≥80% of Must PD sits on rows that are `detailed` or covered by an accepted line; every vague Must row has a `CQ-n` |
|
|
30
|
-
| 70 | 60–80% of Must PD locked; every vague Must row has a `CQ-n` |
|
|
31
|
-
| 40 | <60% locked, or a vague Must row without a `CQ-n` |
|
|
32
|
-
| 0 | No accepted line and no client question |
|
|
33
|
-
|
|
34
|
-
## Platform decision — weight 15
|
|
35
|
-
|
|
36
|
-
| Score | Band |
|
|
37
|
-
| --- | --- |
|
|
38
|
-
| 100 | Plan, hosting, PSP and CMP decided in §6, each with a reason naming the rows it serves and a source (profile, PM tier, architect alternative); the plan's PD delta stated |
|
|
39
|
-
| 70 | One §6 platform item `_TBD_` or open in a `Q-n` |
|
|
40
|
-
| 40 | Two or more `_TBD_` or open, or the plan undecided |
|
|
41
|
-
| 0 | Profile missing, or the §6 platform table empty |
|
|
42
|
-
|
|
43
|
-
## Integration & migration — weight 15
|
|
44
|
-
|
|
45
|
-
| Score | Band |
|
|
46
|
-
| --- | --- |
|
|
47
|
-
| 100 | Every interface and migration object the RFP names is in §6 with pattern and owner split; §8 and §1.2 are complete for every estimate-driving parameter and migration volume |
|
|
48
|
-
| 70 | Main interfaces covered; secondary ones or the owner split missing; §8/§1.2 mostly complete |
|
|
49
|
-
| 40 | Approach lines missing for named interfaces, or an estimate-driving §1.2 parameter or a §1.2 migration volume is missing without a `CQ-n` |
|
|
50
|
-
| 0 | §6 interface and migration tables `_TBD_` |
|
|
51
|
-
|
|
52
|
-
## Consistency — weight 10
|
|
53
|
-
|
|
54
|
-
| Score | Band |
|
|
55
|
-
| --- | --- |
|
|
56
|
-
| 100 | All probes run (plugins, prior analyses, PRDs, partner assets, RFP-internal); every conflict resolved or logged as `K-n` in §7 |
|
|
57
|
-
| 70 | Probes run; a `K-n` unresolved |
|
|
58
|
-
| 40 | Probes run only partially |
|
|
59
|
-
| 0 | A known conflict unrecorded |
|
|
60
|
-
|
|
61
|
-
## Status
|
|
62
|
-
|
|
63
|
-
| Confidence | Open `high` `Q-n` | Blocking `CQ-n` on a Must row | `suspect` lines | Unreconciled ticks | Status |
|
|
64
|
-
| --- | --- | --- | --- | --- | --- |
|
|
65
|
-
| > 90 | none | none | none | none | **Ready to submit** |
|
|
66
|
-
| > 90 | any of the four present | | | | **Review** |
|
|
67
|
-
| 80–90 | | | | | **Review** |
|
|
68
|
-
| < 80 | | | | | **Draft** |
|
|
69
|
-
|
|
70
|
-
The four conditions override the arithmetic. §2 *Weakest dimension* names every blocker by id.
|
|
71
|
-
|
|
72
|
-
## Honesty rules
|
|
73
|
-
|
|
74
|
-
- Do not round up to cross 80 or 90.
|
|
75
|
-
- Never raise a score because the deadline is close or the user wants the response finished.
|
|
76
|
-
- A row with an open non-blocking question (`estimated, CQ-n`) caps *Scope lock* at 70 for the share of Must PD it carries, unless the assumption its estimate rests on is `accepted`.
|
|
77
|
-
- `_TBD_` anywhere in §6 caps that dimension at 40.
|
|
78
|
-
- `_TBD_` overhead or buffer in the profile caps *Estimate basis* at 70; §2 states that PD is given before both.
|
|
79
|
-
- `reuse: rfp-NNNN <ID>` is evidence only if the source row carried a verdict, not a guess.
|
|
80
|
-
- If the total moved down since the last run, the report says so and names the cause.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Pending harness edits for the tender skill
|
|
2
|
-
|
|
3
|
-
The "Editor mode" section and the eight SKILL.md edits this file used to carry were **applied** (SKILL.md `## Editor mode`, the `--editor` / `--editor-session` input rows, step 0, the `[x] suspect` reconcile bullet, frontmatter, reference list), with the batch kinds redefined for staged writes. What follows is the only part still outstanding.
|
|
4
|
-
|
|
5
|
-
## `extension` class (ladder OOTB → Plugin → Extension → Custom)
|
|
6
|
-
|
|
7
|
-
- `coverage-mapping.md` Internal classes: add `| extension | Development on a specific, named, existing base — a stock feature, a store plugin, a partner asset or a project plugin under custom/plugins — materially smaller than building the capability from scratch; the base is named in the row's Text |`. Token rule: `| extension | the development token; comment prefix "Extension of <base>." |`. Synonyms: `| extension | Extension of, Erweiterung von |`. Note under the table: "Not the Shopware plugin/app sense and not 'uses extension points'; test: if the base disappeared, would the estimate roughly double? yes → extension, no → custom."
|
|
8
|
-
- `analysis-template.md` kinds line: class `stock | config | plugin | extension | custom | commitment | service | not-offered | blocked`; the tool shows `stock` and `config` as OOTB.
|
|
9
|
-
- `agent-briefs.md` §ARCH: the class list gains `extension` with the definition and test above; an `assume` candidate may name `extension` as the class the row takes once accepted. §ROWS: plugin vs extension, and extension vs custom, are not conflicts (the architect decides).
|
|
10
|
-
- `estimation-model.md`: one line — an `extension` row states its base in Text; the three-point covers the delta on that base only.
|
|
11
|
-
- `response-rules.md` class note line: `extension` → "Extension of <base>."
|