Add onboarding doc-test harness
Disposable rig that runs the global onboarding-tester agent against the developer SDK-integration journey: boots a fresh keysat fixture, mints a merchant-onboard scoped key, serves keysat-docs as the published corpus, scaffolds a pristine Next.js/TS proof-of-work, and has the agent gate it docs-only. Stage 1 (no payments) reached completed-clean over three runs; see onboarding-harness/STAGE1-RESULT.md. Stage 2 (regtest buyer-pays) is gated on the agent-payment-connect scope work.
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
import { ROWS, toCsv } from "@/lib/reports";
|
||||
|
||||
// The "Pro export" endpoint.
|
||||
//
|
||||
// PRISTINE STATE: this feature is currently FREE — anyone who hits it gets the
|
||||
// CSV. The goal of this proof-of-work is to gate it behind a valid Keysat
|
||||
// license so that only paying customers can export.
|
||||
//
|
||||
// (How you wire that in is up to the integrator following the Keysat docs.)
|
||||
|
||||
export async function GET() {
|
||||
const csv = toCsv(ROWS);
|
||||
return new Response(csv, {
|
||||
status: 200,
|
||||
headers: {
|
||||
"Content-Type": "text/csv",
|
||||
"Content-Disposition": 'attachment; filename="acme-report.csv"',
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
export const metadata = {
|
||||
title: "Acme Reports",
|
||||
description: "A tiny analytics tool with a paid Pro export.",
|
||||
};
|
||||
|
||||
export default function RootLayout({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body style={{ fontFamily: "system-ui, sans-serif", maxWidth: 640, margin: "3rem auto", padding: "0 1rem" }}>
|
||||
{children}
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import { ROWS } from "@/lib/reports";
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<main>
|
||||
<h1>Acme Reports</h1>
|
||||
<p>Your signups and revenue by region. Viewing is free.</p>
|
||||
<table cellPadding={6} style={{ borderCollapse: "collapse" }}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th align="left">Region</th>
|
||||
<th align="right">Signups</th>
|
||||
<th align="right">Revenue (sats)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{ROWS.map((r) => (
|
||||
<tr key={r.region}>
|
||||
<td>{r.region}</td>
|
||||
<td align="right">{r.signups}</td>
|
||||
<td align="right">{r.revenueSats.toLocaleString()}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 style={{ marginTop: "2rem" }}>Pro export</h2>
|
||||
<p>
|
||||
Download the full dataset as CSV. This is a paid feature:{" "}
|
||||
<a href="/api/export">/api/export</a>.
|
||||
</p>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user