Skip to content

feat(rfp-intake): script the go/no-go decision against a reusable company profile - #7

Merged
mikeastock merged 1 commit into
mainfrom
rfp-intake-v2
Oct 6, 2026
Merged

mikeastock merged 1 commit into
mainfrom
rfp-intake-v2

Conversation

@mikeastock-bot

@mikeastock-bot mikeastock-bot commented Oct 5, 2026 •

Copy link
Copy Markdown

Rebuilds rfp-intake around the go/no-go meeting for one opportunity. The job is the same; the decision is now checkable.

  • In: the solicitation (RFP or ITB PDF, addenda, forms) and a reusable company-profile.json. The first run asks for the profile once: licenses, bonding and insurance limits, days needed to bid, terms the company won't accept, scoring context, and the go/no-go criteria, weights, and thresholds.
  • Out: a cited Markdown brief with:
    • the recommendation, the decisive reason, and what's due this week
    • gates and scorecard
    • key dates and the addenda changes
    • requirements to bid
    • risk flags
    • questions for the owner and for the team
    • sources reviewed and not reviewed
  • No estimating and no legal advice; the team makes the call.

How it works

The agent writes intake-data.json, citing every fact as { doc, page, section }. scripts/intake.mjs has no dependencies and does the following:

  • Validates citations: a page beyond a document's page count, or a citation to a referenced-but-unsupplied document (Project Manual, drawings), stops the run.
  • Gates (pass, fail, or unknown):
    • license held (needed at bid and not held fails; needed before contract is a condition)
    • single and aggregate bonding
    • insurance limits
    • mandatory meetings not yet passed
    • days to bid against the team's minimum
    • terms on the company's no-go list
  • Score: weighted 0 to 5 criteria scaled to 100. Unknown criteria are left out, and their share of the weight is reported.
  • Recommendation:
    • any failed gate means No-go
    • unknown gates, too much unknown weight, or a score between the thresholds mean Go with conditions, each written as an action
    • otherwise the score decides Go or No-go
node scripts/intake.mjs intake-data.json company-profile.json --brief intake-brief.md

The brief keeps the headings the existing Brannock eval checks, so that task and the rescore test still apply.

Sample

Cedar Hollow Public Schools, Prairie View Elementary addition and renovation, an $18.2M hard bid. The package ships as three PDFs: an 8-page ITB and two addenda. Planted problems:

  • a mandatory pre-bid meeting three days out
  • a city license required before contract that the company doesn't hold
  • pollution liability added by Addendum 2 and missing from the profile
  • a bond at 91% of the single-job limit
  • liquidated damages against a renovation window that ends on the Substantial Completion date
  • the hazardous materials survey referenced but not supplied

Result: Go with conditions. It scores 63 against a go line of 65, with 20% of the weight unknown (competition, capacity).

Verification

  • evals/tasks/rfp-intake/intake.test.mjs: 11 tests, now in CI. They cover:
    • an exact match of the bundled brief against a fresh build
    • each of the 7 gate failures forcing No-go
    • unknown facts forcing conditions
    • score thresholds and default criteria
    • citation validation
  • 10 deliberate breaks to the script each failed at least one test.
  • The sample brief passes the Brannock task's header and section checks.
  • Not yet tested: a fresh agent extracting a solicitation it hasn't seen.

Version 2.0.0, marketplace 0.7.0. references/intake-checklist.md is replaced by references/data-contract.md and references/reading-solicitations.md.

Note

Rewrite rfp-intake skill as scripted go/no-go decision against a reusable company profile

  • Replaces the checklist-driven intake review with a dependency-free Node.js script that validates two JSON inputs, evaluates pass/fail/unknown gates (license, bonding, insurance, deadlines, disqualifying terms), computes a weighted score, and renders a Markdown go/no-go brief. See intake.mjs.
  • Requires a reusable company profile with capacity, licensing, insurance, bid-preparation time, disqualifying terms, and optional scoring thresholds; built-in defaults apply when the profile omits criteria or thresholds.
  • Bumps the skill from 1.1.0 to 2.0.0 with a new five-stage workflow in SKILL.md, a JSON data contract in data-contract.md, and solicitation-reading guidance in reading-solicitations.md.
  • Replaces sample fixtures with a Prairie View Elementary opportunity that yields a conditional go at score 63, plus new PDF solicitation assets and a byte-exact brief test in intake.test.mjs. The test suite runs in CI via validate.yml.
  • Risk: behavioral change — the skill's prior intake-checklist.md workflow and the Ridgeview sample review in output-intake-review.md are removed; consumers of the catalog entry now get v2.0.0 metadata and the new intake.mjs CLI contract.

Macroscope summarized 5b60ef2.

…pany profile

Add a dependency-free intake script that validates a cited extraction and a
company profile, checks must-pass gates (license, bonding, insurance,
mandatory meetings, time to bid, disqualifying terms), computes a weighted
score, and writes the go/no-go brief. Citations must point at supplied pages
that exist. New sample: a school district ITB with two addenda as PDFs.
@macroscopeapp

macroscopeapp Bot commented Oct 5, 2026

Copy link
Copy Markdown

Macroscope skipped reviewing this pull request. Per-review cost limit exceeded (workspace setting).

This review would cost an estimated $4.71, which exceeds your per-review limit of $3.00.

The top 3 files driving up this estimate:

File Diff Size Estimate
skills/rfp-intake/scripts/intake.mjs 26.52KB $1.33
skills/rfp-intake/samples/intake-data.json 15.84KB $0.79
skills/rfp-intake/samples/output-intake-brief.md 11.76KB $0.59

Tip

To get this pull request reviewed, you can:

  1. Comment @macroscope-app on this PR to request a manual review (monthly spend limits still apply).
  2. Exclude the file(s) above from review by adding a pattern to your .macroscope/ignore.md — note that creating this file replaces Macroscope's built-in default ignores rather than extending them.
  3. Raise your cost limit in your workspace billing settings.

Turn off this reminder going forward

@mikeastock
mikeastock merged commit 77a2d12 into main Oct 6, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants