Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 105 additions & 25 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,22 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="dark">
<meta name="theme-color" content="#090d18">
<title>Repository Audit · The Interdependent Way</title>
<meta name="description" content="Evidence-led repository auditing for public Git repositories.">
<title>pubskill-lib · The Interdependent Way</title>
<meta name="description" content="Evidence-led repository audit and examination for public Git repositories.">
<link rel="stylesheet" href="https://interdependentway.org/assets/css/site.css">
<style>
.audit-shell { max-width: 58rem; margin: 0 auto; }
.audit-head { margin-bottom: 2rem; }
.audit-head h1 { font-size: clamp(2.8rem, 8vw, 5.8rem); margin-bottom: .8rem; }
.pubskill-shell { max-width: 62rem; margin: 0 auto; }
.pubskill-head { margin-bottom: 2rem; }
.pubskill-head h1 { font-size: clamp(2.8rem, 8vw, 5.8rem); margin-bottom: .8rem; }
.choice-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; margin: 1.5rem 0 2rem; }
.choice-card { display: flex; flex-direction: column; min-height: 18rem; }
.choice-card h2 { margin: .25rem 0 .7rem; }
.choice-card p { color: var(--silver); }
.choice-card .question { color: var(--starlight); font-family: Georgia, "Times New Roman", serif; font-size: clamp(1.2rem, 2.4vw, 1.55rem); line-height: 1.35; }
.choice-card .actions { margin-top: auto; }
.choice-card[aria-current="true"] { border-color: var(--violet); box-shadow: var(--shadow); }
.product-panel { margin-top: 1.5rem; }
.product-panel[hidden] { display: none; }
.audit-panel { padding: clamp(1.2rem, 4vw, 2rem); background: linear-gradient(145deg, rgba(22,33,58,.9), rgba(16,24,42,.86)); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); }
.audit-panel label { display: block; margin-bottom: .55rem; color: var(--cyan); font: 700 .76rem/1.3 ui-monospace, SFMono-Regular, Consolas, monospace; text-transform: uppercase; letter-spacing: .12em; }
.repo-field { width: 100%; min-height: 3.2rem; padding: .8rem .95rem; border: 1px solid var(--line); border-radius: .7rem; background: var(--night); color: var(--starlight); font: inherit; }
Expand All @@ -28,9 +37,13 @@
.meta { color: var(--silver); font-size: .88rem; overflow-wrap: anywhere; }
.buy { margin-top: .8rem; }
.support-row { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: 1rem; }
.examiner-choices { margin-top: 1rem; }
.examiner-choices .card { min-height: 11rem; }
.boundary-note { margin-top: 1rem; }
.site-footer a { color: var(--silver); }
@media (max-width: 780px) {
.audit-head h1 { font-size: clamp(2.55rem, 13vw, 4.2rem); }
.pubskill-head h1 { font-size: clamp(2.55rem, 13vw, 4.2rem); }
.choice-grid { grid-template-columns: 1fr; }
.site-header { align-items: center; }
.primary-nav { display: flex; width: auto; }
.primary-nav a { border: 0; padding: .45rem .55rem; }
Expand All @@ -51,30 +64,81 @@
</header>

<main id="content" class="site-main">
<div class="audit-shell">
<section class="audit-head">
<div class="pubskill-shell">
<section class="pubskill-head">
<p class="eyebrow">pubskill-lib · repository evidence</p>
<h1>Repository Audit</h1>
<p class="lede">Test repository claims against repository evidence. No target code is executed.</p>
<div class="support-row" aria-label="Supported Git hosts">
<span class="status status-public">GitHub</span>
<span class="status status-public">GitLab</span>
<span class="status status-public">Bitbucket</span>
<span class="status status-public">Codeberg</span>
<span class="status status-public">SourceHut</span>
</div>
<h1>What do you need to know?</h1>
<p class="lede">Choose the question first. pubskill keeps each decision surface to two options.</p>
</section>

<section class="choice-grid" aria-label="pubskill products">
<article class="card choice-card" id="audit-choice" aria-current="true">
<p class="eyebrow">Audit</p>
<h2>Repository Audit</h2>
<p class="question">Which repository claims hold up, and which fail against the evidence?</p>
<p>Three findings are free. Unlock the complete audit for $5. Target code is not executed.</p>
<div class="actions"><button class="button" id="choose-audit" type="button">Audit</button></div>
</article>

<article class="card choice-card" id="examiner-choice">
<p class="eyebrow">Examiner</p>
<h2>Repository Examiner</h2>
<p class="question">What is actually in this codebase, how is it structured and documented, what can be measured safely, and where are the unresolved boundaries?</p>
<p>Structural examination does not require AI. Narration is optional.</p>
<div class="actions"><button class="button secondary" id="choose-examiner" type="button">Examiner</button></div>
</article>
</section>

<section class="audit-panel" aria-labelledby="audit-label">
<label id="audit-label" for="repo">Public Git repository URL</label>
<input class="repo-field" id="repo" inputmode="url" autocomplete="url" placeholder="https://github.com/owner/repo.git">
<div class="audit-actions">
<button class="button" id="audit" type="button">Audit repository</button>
<section class="product-panel" id="audit-panel" aria-labelledby="audit-title">
<div class="page-head">
<p class="eyebrow">Audit</p>
<h2 id="audit-title">Which repository claims hold up, and which fail against the evidence?</h2>
<div class="support-row" aria-label="Supported Git hosts">
<span class="status status-public">GitHub</span>
<span class="status status-public">GitLab</span>
<span class="status status-public">Bitbucket</span>
<span class="status status-public">Codeberg</span>
<span class="status status-public">SourceHut</span>
</div>
</div>
<div id="status" role="status" aria-live="polite"></div>

<div class="audit-panel" aria-labelledby="audit-label">
<label id="audit-label" for="repo">Public Git repository URL</label>
<input class="repo-field" id="repo" inputmode="url" autocomplete="url" placeholder="https://github.com/owner/repo.git">
<div class="audit-actions">
<button class="button" id="audit" type="button">Run free audit</button>
</div>
<div id="status" role="status" aria-live="polite"></div>
</div>

<div id="out"></div>
</section>

<div id="out"></div>
<section class="product-panel" id="examiner-panel" hidden aria-labelledby="examiner-title">
<div class="page-head">
<p class="eyebrow">Examiner</p>
<h2 id="examiner-title">What is actually in this codebase, how is it structured and documented, what can be measured safely, and where are the unresolved boundaries?</h2>
<p class="section-intro">The Examiner inventories source, checks safe adapters and placement boundaries, measures supported RATIOS, detects existing NARRATIVE blocks, preserves unresolved conditions as <code>hmmm</code>, and assembles repository documentation.</p>
</div>

<div class="choice-grid examiner-choices" aria-label="Examiner modes">
<article class="card">
<p class="eyebrow">Without AI</p>
<h3>Structural examination</h3>
<p>Inventory, measurable structure, safe write boundaries, RATIOS, existing narratives, documentation assembly, and unresolved boundaries.</p>
</article>
<article class="card">
<p class="eyebrow">Optional AI</p>
<h3>Examination + narration</h3>
<p>Add evidence-bound source narration. The user keeps the choice between their own AI provider and hosted AI.</p>
</article>
</div>

<div class="hmmm boundary-note">
<h3>hmmm</h3>
<p>The Examiner CLI is available now. Hosted Examiner pricing and metering remain unresolved until measured from real repository runs; they are not guessed here.</p>
</div>
</section>
</div>
</main>

Expand All @@ -90,6 +154,19 @@ <h1>Repository Audit</h1>
const repo = document.getElementById("repo");
const status = document.getElementById("status");
const out = document.getElementById("out");
const auditPanel = document.getElementById("audit-panel");
const examinerPanel = document.getElementById("examiner-panel");
const auditChoice = document.getElementById("audit-choice");
const examinerChoice = document.getElementById("examiner-choice");

function selectProduct(product) {
const auditSelected = product === "audit";
auditPanel.hidden = !auditSelected;
examinerPanel.hidden = auditSelected;
auditChoice.setAttribute("aria-current", String(auditSelected));
examinerChoice.setAttribute("aria-current", String(!auditSelected));
(auditSelected ? auditPanel : examinerPanel).scrollIntoView({behavior: "smooth", block: "start"});
}

function add(tag, text, parent = out, className = "") {
const node = document.createElement(tag);
Expand Down Expand Up @@ -143,7 +220,7 @@ <h1>Repository Audit</h1>
const buy = document.createElement("a");
buy.href = r.payment_link;
buy.className = "button buy";
buy.textContent = "Unlock full audit — $19";
buy.textContent = "Unlock full audit — $5";
gate.appendChild(buy);
out.appendChild(gate);
}
Expand All @@ -168,6 +245,7 @@ <h1>Repository Audit</h1>
}

async function loadPaid(sessionId) {
selectProduct("audit");
clear();
status.textContent = "Verifying payment and running full audit…";
try {
Expand All @@ -182,6 +260,8 @@ <h1>Repository Audit</h1>
}
}

document.getElementById("choose-audit").addEventListener("click", () => selectProduct("audit"));
document.getElementById("choose-examiner").addEventListener("click", () => selectProduct("examiner"));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Give the Examiner selection a usable next step

When a visitor chooses Examiner, this handler only unhides an informational panel; that panel has no runnable action, CLI command, or direct link to the documented Examiner instructions, despite telling the visitor that the CLI is available now. The newly advertised product flow therefore ends without telling users how to obtain the product they selected. Add a direct CLI/source-instructions link or another usable Examiner action.

Useful? React with 👍 / 👎.

document.getElementById("audit").addEventListener("click", runAudit);
repo.addEventListener("keydown", event => {
if (event.key === "Enter") runAudit();
Expand Down
6 changes: 3 additions & 3 deletions service.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
"codeberg.org",
"git.sr.ht",
}
PAYMENT_LINK_ID = "plink_1UFLuMAyiOEDWiRnLUiYEx3Y"
PAYMENT_LINK_URL = "https://buy.stripe.com/14A6oG5Sk9MWg8z3UO5EY01"
PRICE_CENTS = 1900
PAYMENT_LINK_ID = "plink_1UFlbvAyiOEDWiRnnsPOpA2P"
PAYMENT_LINK_URL = "https://buy.stripe.com/bJe9AS94w9MW09B7705EY02"
PRICE_CENTS = 500
Comment on lines +20 to +22

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Continue honoring purchases from the previous payment link

Replacing the sole accepted payment-link ID and amount invalidates every Checkout Session created by the former live $19 link. In particular, a customer who opened that checkout before this deployment but completes it afterward will be charged and then receive payment does not belong to this product from /paid; retries of earlier failed audits are also denied. Keep accepting the previous ID/amount pair alongside the new $5 pair, at least for existing sessions.

Useful? React with 👍 / 👎.

FREE_FINDINGS = 3


Expand Down