diff --git a/app/(marketing)/hire/page.tsx b/app/(marketing)/hire/page.tsx
index ceb338a5..e0a881d6 100644
--- a/app/(marketing)/hire/page.tsx
+++ b/app/(marketing)/hire/page.tsx
@@ -38,7 +38,7 @@ export default async function HirePage({
Scoped from your scan
- We price the work off what the report actually found, at $100/hour.
+ We price the work off what the report actually found, at $400/hour/agent.
Most engagements run two to three weeks.
diff --git a/lib/audit/quote.ts b/lib/audit/quote.ts
index 6de490c0..b1d819ec 100644
--- a/lib/audit/quote.ts
+++ b/lib/audit/quote.ts
@@ -18,8 +18,8 @@
import type { Finding } from "./types";
-/** Blended hourly rate, USD. */
-export const HOURLY_RATE_USD = 100;
+/** Standard price per agent-hour, USD. */
+export const HOURLY_RATE_USD = 400;
/** Score we commit to reaching across every engine in the report. */
export const TARGET_SCORE = 90;
diff --git a/lib/markdown.ts b/lib/markdown.ts
index ffc2336d..1763f950 100644
--- a/lib/markdown.ts
+++ b/lib/markdown.ts
@@ -420,7 +420,7 @@ function quoteBlock(q: Quote, target?: string): string {
Want us to fix this for you?
${formatUsd(q.amountUsd)} USD${q.cappedForScoping ? "+" : ""}
- Estimated ${formatHours(q.totalHours)} at ${formatUsd(q.rateUsd)}/hour to take
+ Estimated ${formatHours(q.totalHours)} of agent time at ${formatUsd(q.rateUsd)}/agent-hour to take
${escapeHtml(host)} to a ${q.targetScore}%+ score across the board.
diff --git a/tests/quote.test.ts b/tests/quote.test.ts
index 1cd27c87..73d5298e 100644
--- a/tests/quote.test.ts
+++ b/tests/quote.test.ts
@@ -14,13 +14,13 @@ function f(check_key: string, status: Finding["status"] = "fail"): Finding {
}
describe("quote: pricing basics", () => {
- it("bills at $100/hour and promises 90%+", () => {
- expect(HOURLY_RATE_USD).toBe(100);
+ it("bills at $400/hour/agent and promises 90%+", () => {
+ expect(HOURLY_RATE_USD).toBe(400);
expect(TARGET_SCORE).toBe(90);
const q = quoteFromFindings([f("homepage.title")]);
- expect(q.rateUsd).toBe(100);
+ expect(q.rateUsd).toBe(400);
expect(q.targetScore).toBe(90);
- expect(q.amountUsd).toBe(Math.round((q.totalHours * 100) / 100) * 100);
+ expect(q.amountUsd).toBe(q.totalHours * 400);
});
it("always splits hours into AI-assisted and manual", () => {
@@ -151,7 +151,7 @@ describe("quote: guardrails", () => {
);
expect(q.cappedForScoping).toBe(true);
expect(q.totalHours).toBeLessThanOrEqual(120);
- expect(q.amountUsd).toBeLessThanOrEqual(12_000);
+ expect(q.amountUsd).toBeLessThanOrEqual(48_000);
});
it("does not flag a normal report for scoping", () => {