← All craftbooks

Offer Comparison

Personal and business workflowsevalv1.0.0released 2026-06-05workflow: build-loop

Turn competing job offers into one honest decision sheet — every offer normalized into the same fact grid (comp, equity with vesting caveats, benefits, level, location, growth, deadlines), unknowns marked UNKNOWN instead of guessed, computed year-1 and 4-year views under stated assumptions, a weighted read against the candidate's OWN priorities, and a recommendation that separates arithmetic from judgment. Use when any second offer (or a strong counter) lands.

Steps

Entry step: facts. Each step names the specialist role it wants; the full working prompt is expandable.

  1. Normalize the factsplannerentry

    one fact grid across every offer, unknowns honest, the user's own weights elicited

    Show working prompt
    Build the fact sheet before any comparison. Step 1: collect every offer's terms from the user or project documents into one grid: base, bonus (target and realism), equity (kind, vesting schedule, valuation caveats), benefits, PTO, level/title, location/remote terms, team and manager, growth story, response deadline. Step 2: mark every unknown as UNKNOWN — never estimate a number the offer letter does not state; list the UNKNOWNs as questions to ask each company. Step 3: elicit the user's OWN decision weights — what actually matters to them (comp, growth, stability, location, mission, team) — do not invent or assume weights. Step 4: state the assumptions any computed view will use (equity valuation basis, bonus attainment). Step 5: write an acceptance-criteria checklist ('every offer covered on every factor', 'unknowns marked UNKNOWN', 'weights are the user's own words', 'assumptions stated'). Write the fact sheet + checklist via write_task_note AND to notes/offer-facts.md.
  2. Build the comparisonplanner

    the decision sheet — table, computed views, weighted read, recommendation

    Show working prompt
    Write reports/offer-compare.md from the fact sheet. Step 1: a factor-by-offer markdown comparison table — offers as columns, factors as rows, UNKNOWNs still visible. Step 2: computed lines under the STATED assumptions: year-1 cash, and a 4-year total-comp view with the equity caveats repeated next to the number. Step 3: a weighted read against the user's stated priorities — show how each offer scores on what THEY said matters, not on a generic rubric. Step 4: risks and negotiation levers per offer (deadline pressure, level mismatch, unvested cliff, remote-policy risk). Step 5: a recommendation that separates the arithmetic ('offer B leads on 4-year comp under these assumptions') from the judgment ('offer A fits the growth priority you weighted highest') — and says plainly which way the sheet leans and why. On a loop-back, fix ONLY the named issues.
  3. Evaluatereviewer

    Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.

    Show working prompt
    Audit the decision sheet. Step 1: recompute the year-1 and 4-year lines from the fact sheet — FAIL on any arithmetic that does not reproduce, or any computed number whose assumption is not stated beside it. Step 2: check every offer appears in every table row and that fact-sheet UNKNOWNs were not silently replaced with guesses. Step 3: trace the weighted read to the user's stated priorities — FAIL a rubric the user never gave. Step 4: confirm the recommendation separates arithmetic from judgment and takes a clear position. Write PASS/FAIL per criterion.
    
    Then route — this is the whole point of the loop:
    
    - **Every criterion PASSES →** call `advance_task_step({ ref, stepId: "evaluate", next: "finish" })`.
    - **Any criterion FAILS →** write the specific gaps to notes, then call `advance_task_step({ ref, stepId: "evaluate", next: "compare" })` to loop back. The builder fixes exactly those gaps.
    
    Never route to `finish` while any criterion is unmet. The build phase's completion gate already blocked a grossly-incomplete deliverable; your job is the judgment an automated check cannot make (does it actually work, read well, look right). After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.
  4. Finishdeveloper

    All acceptance criteria met. Stamp a short summary and report DONE.

    Show working prompt
    Every acceptance criterion passed. Write a one-paragraph DONE summary to task notes via `write_task_note`: what was built, the deliverable path(s), and a one-line confirmation that each criterion is met. Then report DONE.

Triggers

Phrases that suggest this craftbook to a crew.

Source

View this craftbook on GitHub · MIT license