Vai al contenuto principale
P

dsh-tender-requirements

perrylink/dsh-tender-requirements

Extracts deadlines, deposit, validity, ceiling, bid composition and copy counts from a tender document, and reports the items it did not find rather than omitting them.

Installazione

dsh plugin --profile web add github:perrylink/dsh-tender-requirements

README

dsh-tender-requirements — Tender requirements

English · 简体中文 · Español · Português · हिन्दी

dshfind

dsh-tender-requirements reads a tender document and reports what it could find: the front-appendix deadlines, deposit, validity and ceiling; the required composition of a bid; and the original/duplicate copy counts.

Every item it looked for is printed whether or not it was found. "Not retrieved" is a different sentence from "the document does not say", and only the first is something a keyword extractor can support.

Install

dsh plugin --profile <name> add dsh-tender-requirements
dsh --profile <name> --dump-config | grep 'dsh-tender-requirements'

What it looks like

Workflow diagram for dsh-tender-requirements: document → rule pack → findings.

Workflow overview: document → rule pack → findings.

Boundary: this is a finder, not a reviewer. It does not judge whether the tender document is compliant, and cannot tell whether a bid will win. It reads the main document only — clarifications, amendments and Q&A minutes are part of the tender document by law (招标投标法第23条) and are not merged here, which is a known systematic gap: please combine them by hand. And nothing here decides that a clause is absent; a differently-worded clause is simply not matched.

What it answers

  • What deadline, deposit, validity period and ceiling does the front appendix state?
  • What must a bid contain, in what order?
  • How many originals and duplicates are required?
  • Which rejection clauses can be quoted verbatim, which need a human look, and which could not be extracted at all?
  • Which of the ten coverage topics were not found, so they can be confirmed by hand?

Standards it follows

No clause is quoted as authority for a check, because this package extracts rather than checks. What it does encode is the structure the clauses imply:

  • 政府采购货物和服务招标投标管理办法(87号令)第20条 lists the 16 items a tender document must contain, including 「评标方法、评标标准和投标无效情形」 — that is why the front appendix is the information hub.
  • 招标投标法第23条: a clarification or amendment is part of the tender document. It is listed as a known gap because it is the single largest source of missed requirements.

Compatibility

SurfaceStatus
Harnesspeer range >=0.1.2-rc.1 <0.2.0 || >=0.2.0-0 <0.3.0
Node`^22.19.0
Platformsall (pure ESM; no native code, no network, no model call)

What it does

Three queues, not one list. Every clause lands in A 交付 (quoted verbatim, in a binding section, no hedge), B 待确认 (quoted but structurally weak), or C 必须处理 (could not be quoted, or is hedged). While C is non-empty the pack reports deliverable: false and the report says the check is 未完成体检 — a merged list is what lets a tool say "no findings" when it only found nothing it could quote.

Rejection clauses are sorted into families (refuse / invalid / reject / disqualify / deviation / postAward) rather than one keyword table.

Recognition is per item, not one keyword table. The spec's probe showed why: on constructed data a result-only word list hit 12/24 with two false positives, and a trigger-only list (不得/应当/必须) hit 15/24 of which over half were the buyer's own obligations.

So each item carries its own pattern and reports a confidence with a reason:

ConfidenceWhen
高found in a two-column front-appendix key
中found in body text, where the wording may not be final
低not found; the reason says whether the label appeared at all

Copy counts accept Chinese numerals and the comma-separated form (正本一份,副本四份), which the obvious regex misses.

Configuration

KeyDefaultMeaning
rulesFilerules/tender-requirements.yaml规则库路径

Material format

Input is a .docx. Tables are read through dsh-table-ingest, one candidate at a time, because the front appendix is not necessarily the first table. Paragraphs come from the same reader and supply the composition list.

A front appendix is recognised as a table with exactly two columns. If the header detector has chosen a data pair as the header (its second cell looks like a date, an amount or a count), that pair is recovered as a row — otherwise a stated deadline would be silently missing.

Rule sources

There is no evidence directory, because nothing here cites a clause as the basis of a finding.

Known limits: only the main document is read; the front appendix must be a two-column table; the composition list must be a run of at least three numbered entries introduced by a lead-in sentence; and a document that states a value in an unusual wording will be reported as not retrieved rather than guessed.

Troubleshooting

  • The plugin installs but the tool never appears: check that main resolves to lib/index.mjs and that pnpm run build produced it.
  • dsh plugin add rejects the package: the peer range covers 0.1.x and 0.2.x; outside it, grant an explicit exemption.
  • A rule did not run: read the skipped array.

Development

pnpm install
pnpm run typecheck
pnpm test
pnpm run build
node ../scripts/sync-shared.mjs dsh-tender-requirements

This project is part of the DeepSeek Harness plugin family from PerryLink. The roster stays collapsed below so every README keeps a short first screen; expand it to see every row and its status.

Expand all plugins
PluginStatus
dsh-aqua-input-check
dsh-archive-check
dsh-auto-review
dsh-autotier
dsh-bid-ca-precheck
dsh-bid-qual-check
dsh-cert-mcp
dsh-checkpoint-rewind
dsh-click
dsh-composer-history
dsh-contract-stance
dsh-customs-doc-check
dsh-data-quality
dsh-demurrage-ledger
dsh-doublecheck
dsh-drill-script-check
dsh-eia-guide-check
dsh-emergency-plan
dsh-essay-rubric-check
dsh-evidence-check
dsh-export-ctl-check
dsh-fast
dsh-fmea-table-check
dsh-forecast-penalty
dsh-fund-research
dsh-github
dsh-gongwen-flow-check
dsh-gongwen-word-check
dsh-guard-plan-qc
dsh-hazchem-check
dsh-hazplan-check
dsh-hidden-risk-map
dsh-hs-classify
dsh-icd-rule-check
dsh-industry-research
dsh-lawcite-adapter
dsh-laya
dsh-lc-doc-check
dsh-learning-gap-check
dsh-library
dsh-local-ai
dsh-lsp-actions
dsh-mask
dsh-mcp-panel
dsh-medrec-qc
dsh-memento
dsh-nsfc-form-check
dsh-nurse-record-check
dsh-observe
dsh-origin-rvc-check
dsh-ota-review-check
dsh-output-styles
dsh-paper-doc-adapter
dsh-permission-rules
dsh-permit-report-check
dsh-pipeline-check
dsh-pleading-draft
dsh-plugin-doctor
dsh-plugin-guide
dsh-plugin-kit
dsh-plugin-upgrade
dsh-policy-brief-draft
dsh-power-loss-split
dsh-power-ticket-check
dsh-ppap-check
dsh-protest-deadline
dsh-railway-window
dsh-repair-order-qc
dsh-research-report
dsh-review-reply-check
dsh-rulefile-check
dsh-safety-brief-check
dsh-score
dsh-session-sync
dsh-site-log-check
dsh-skill-pack-security
dsh-soe-decision-check
dsh-soilwater-check
dsh-sop-sync-check
dsh-spc-gbt-adapter
dsh-talk
dsh-tender-extract
dsh-tender-matrix
dsh-test-drive
dsh-ticktick
dsh-translate
dsh-warranty-calc
dsh-budget🧊 FROZEN — see the repo README
dsh-claude-move🧊 FROZEN — see the repo README
dsh-defend🧊 FROZEN — see the repo README
dsh-draw🧊 FROZEN — see the repo README
dsh-reach🧊 FROZEN — see the repo README
dsh-background-agents🚫 RETIRED — see the repo README
dsh-session-pin🚫 RETIRED — see the repo README
dsh-team-rooms🚫 RETIRED — see the repo README

License

Apache License 2.0 © 2026 dsh-tender-requirements contributors.

Plugin correlati