-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathindex.html
More file actions
336 lines (319 loc) · 26.5 KB
/
Copy pathindex.html
File metadata and controls
336 lines (319 loc) · 26.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="TestForge gives coding Agents a risk-ranked software-verification discipline, independent evidence review, and a behavioral-evaluation quality ratchet for reusable Augments.">
<meta name="theme-color" content="#050607">
<meta property="og:type" content="website">
<meta property="og:title" content="TestForge">
<meta property="og:description" content="Software verification that argues back.">
<meta property="og:url" content="https://stunspot.github.io/TestForge/">
<meta property="og:image" content="https://raw.githubusercontent.com/Stunspot/TestForge/main/assets/testforge-social-preview.png">
<meta property="og:image:alt" content="TestForge — software verification that argues back.">
<meta name="twitter:card" content="summary_large_image">
<title>TestForge · Software Verification That Argues Back</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<header class="site-header">
<nav aria-label="Primary">
<a class="brand" href="#top" aria-label="TestForge home"><span class="brand-mark" aria-hidden="true">TF</span><span>TestForge</span></a>
<div class="nav-links">
<a href="#start">Start</a>
<a href="#chain">Method</a>
<a href="#install">Install</a>
<a href="#troubleshooting">Recover</a>
<a href="#privacy">Boundaries</a>
<a href="#evidence">Evidence</a>
<a href="https://github.com/Stunspot/TestForge">GitHub</a>
</div>
</nav>
</header>
<main id="main">
<section class="hero" id="top">
<div class="hero-copy">
<p class="eyebrow">Risk-ranked verification for coding Agents</p>
<h1>Software verification<br>that argues back.</h1>
<p class="lede">TestForge gives inexpensive local coding Agents a verification discipline they do not reliably improvise. It attacks explicitly submitted frozen release candidates with risk-ranked evidence - not ordinary implementation and not a comforting pile of green checkmarks.</p>
<div class="actions">
<a class="button primary" href="https://github.com/Stunspot/TestForge/blob/main/JUDGE-QUICKSTART.md">Five-minute judge path</a>
<a class="button secondary" href="https://github.com/Stunspot/TestForge/releases/latest">Get the release</a>
</div>
<p class="quiet">Free Collaborative Dynamics Augment · two matched SKILLs · deterministic tools · independent review · behavioral eval testbed</p>
</div>
<figure class="hero-visual">
<img src="assets/testforge-hero.png" width="1200" height="800" alt="A precision quality gate checks three evidence paths and diverts a failed path into a separate reject tray.">
</figure>
</section>
<section class="section start-section" id="start">
<div class="section-heading">
<p class="eyebrow">Begin successfully</p>
<h2>Bring a finished candidate and a release claim worth attacking.</h2>
<p>TestForge is for developers, release owners, coding-Agent operators, and Augment builders who need evidence stronger than “the tests are green.” It is not a product-design workshop, penetration-testing authorization, compliance certification, or proof that defects do not exist.</p>
</div>
<div class="journey-grid">
<article><span>INPUT</span><h3>What to supply</h3><p>A bounded target and revision; the intended behavior or requirement; relevant diff, source, tests, logs, and environment facts; plus explicit authority for any consequential action.</p></article>
<article><span>OUTPUT</span><h3>What to expect</h3><p>An impact map, ranked risks, invariants, scenarios, tests or commands, captured execution evidence, classified findings, residual risks, reviewer disposition, and exactly one bounded release status.</p></article>
<article><span>FIRST RUN</span><h3>What success looks like</h3><p>The operator distinguishes observed, inferred, assumed, unresolved, executed, and authorized claims; links critical risks to credible evidence; and refuses confidence that the evidence cannot support.</p></article>
</div>
<div class="prompt-grid first-prompt">
<blockquote><code>$software-verification Verify this completed candidate at revision <REVISION>. The intended behavior is <REQUIREMENT>. Inspect the available source and tests, run only safe authorized checks, and issue an evidence-backed release assessment.</code></blockquote>
<blockquote><code>$verification-reviewer Independently challenge the resulting verification package. Find the smallest consequential break in its evidence chain and judge whether the proposed status is supportable.</code></blockquote>
</div>
</section>
<section class="section wager-section">
<div class="section-heading">
<p class="eyebrow">The practical wager</p>
<h2>Externalized method and memory can buy more competent work from cheaper cognition.</h2>
<p>TestForge is not one-shot benchmarking and it is not a prompt folder wearing a fake moustache. It is an installable verification system with doctrine, schemas, deterministic tooling, examples, evals, host adapters, evidence custody, and an independent skeptical pass.</p>
</div>
<div class="capability-grid">
<article class="operator">
<span>$software-verification</span>
<h3>Build the smallest credible evidence set.</h3>
<p>Reconstruct impact, rank failure risk, define invariants, design meaningful oracles, create stack-compatible tests, interpret execution, and issue one traceable assessment.</p>
</article>
<article class="reviewer">
<span>$verification-reviewer</span>
<h3>Try to make the release claim fail.</h3>
<p>Attack target fidelity, catastrophic omissions, oracle strength, mock realism, evidence custody, traceability, authority, and the fit between proof and proposed status.</p>
</article>
</div>
</section>
<section class="section chain-section" id="chain">
<div class="section-heading">
<p class="eyebrow">Preserve one evidence chain</p>
<h2>Begin with the failure the change could create—not with test-shaped code.</h2>
</div>
<ol class="evidence-chain">
<li><span>01</span><strong>Scope</strong><small>What target, revision, surfaces, environment, and authority are actually in bounds?</small></li>
<li><span>02</span><strong>Impact</strong><small>Which call sites, contracts, states, dependencies, persistence, and trust boundaries can change?</small></li>
<li><span>03</span><strong>Risk</strong><small>What consequential failure modes deserve depth, and with what confidence?</small></li>
<li><span>04</span><strong>Invariant</strong><small>What must remain true across normal, denied, degraded, retried, and recovered behavior?</small></li>
<li><span>05</span><strong>Scenario</strong><small>Which preconditions, actions, observations, and forbidden side effects discriminate danger?</small></li>
<li><span>06</span><strong>Test</strong><small>What lowest credible layer preserves the real boundary under examination?</small></li>
<li><span>07</span><strong>Evidence</strong><small>Which exact command, environment, result, timing, and raw record establish execution?</small></li>
<li><span>08</span><strong>Status</strong><small>What bounded release assessment follows—and what authority still remains human?</small></li>
</ol>
<p class="chain-rule">Risk determines depth. Oracles determine whether a test establishes anything. Tool output establishes execution. Polished prose does not get a vote.</p>
</section>
<section class="section states-section">
<div class="section-heading">
<p class="eyebrow">Keep claim states distinct</p>
<h2>Do not let one kind of evidence borrow another kind’s authority.</h2>
</div>
<div class="state-grid">
<article><span>observed</span><p>Directly present in identified source or captured tool output.</p></article>
<article><span>inferred</span><p>The best current interpretation, with basis and confidence.</p></article>
<article><span>assumed</span><p>Provisionally treated as true within a stated scope and consequence.</p></article>
<article><span>unresolved</span><p>Competing or missing support that still changes the decision.</p></article>
<article class="executed"><span>executed</span><p>A named command returned a captured result in a named environment.</p></article>
<article class="authorized"><span>authorized</span><p>A responsible human permitted a bounded consequential action.</p></article>
</div>
<aside class="missing-evidence">Missing evidence is not one state: distinguish <strong>not supplied</strong>, <strong>not inspected</strong>, <strong>capability unavailable</strong>, <strong>retrieval failed</strong>, <strong>out of scope</strong>, and <strong>observed absent</strong>.</aside>
</section>
<section class="section oracles-section">
<div class="oracles-copy">
<p class="eyebrow">Design tests that can lose</p>
<h2>A test is only useful when the dangerous implementation would fail it.</h2>
<p>TestForge prefers invariants and state changes over truthiness, status-only checks, snapshot worship, real sleeps, and mock-interaction theater.</p>
</div>
<div class="oracle-card">
<div class="oracle-head"><span>SCENARIO CONTRACT</span><span>RISK-LINKED</span></div>
<dl>
<div><dt>Preconditions</dt><dd>The relevant state, identity, dependency, time, configuration, and environment.</dd></div>
<div><dt>Action</dt><dd>The exact behavior exercised at the smallest credible layer.</dd></div>
<div><dt>Expected observations</dt><dd>Outputs, state transitions, persistence, events, timing, and recovery evidence.</dd></div>
<div><dt>Forbidden side effects</dt><dd>Unauthorized mutation, duplication, leakage, corruption, stale state, or downstream work.</dd></div>
<div><dt>Evidence source</dt><dd>The test, command, trace, file, log, or observation that could actually establish the claim.</dd></div>
<div><dt>Risk linkage</dt><dd>The failure mode this scenario covers and its current disposition.</dd></div>
</dl>
</div>
</section>
<section class="section failures-section">
<div class="section-heading">
<p class="eyebrow">Diagnose before patching</p>
<h2>Not every red result is a product defect. Not every green result is evidence.</h2>
</div>
<div class="failure-grid">
<article><span>PRODUCT_DEFECT</span><p>The implementation violates the intended, evidence-bearing contract.</p></article>
<article><span>TEST_DEFECT</span><p>The test, fixture, oracle, isolation, or expectation is wrong.</p></article>
<article><span>ENVIRONMENT_FAILURE</span><p>The named environment cannot perform a decision-critical check.</p></article>
<article><span>FLAKY_OR_NONDETERMINISTIC</span><p>Outcome variance requires a stability hypothesis and discriminating rerun.</p></article>
<article><span>EXPECTED_CONTRACT_CHANGE</span><p>The observed behavior changed intentionally, but evidence and baselines need governed revision.</p></article>
<article><span>TOOLING_FAILURE</span><p>The verifier, parser, runner, adapter, or result normalization failed.</p></article>
<article><span>INSUFFICIENT_EVIDENCE</span><p>Correctness cannot be decided from the available implementation, oracle, or execution support.</p></article>
</div>
</section>
<section class="section status-section" id="status">
<div class="section-heading">
<p class="eyebrow">Issue exactly one release status</p>
<h2>The verdict follows from evidence. It does not confer release authority.</h2>
</div>
<div class="status-grid">
<article class="ready"><span>READY</span><p>The bounded release claim is supported by the reachable evidence and resolved review.</p></article>
<article><span>READY_WITH_RESIDUAL_RISK</span><p>The bounded claim is supportable with explicit remaining risk, scope, and owner acceptance.</p></article>
<article class="not-ready"><span>NOT_READY</span><p>An observed material product or package defect makes the proposed release unsound.</p></article>
<article><span>INSUFFICIENT_EVIDENCE</span><p>Missing correctness evidence prevents a grounded release decision.</p></article>
<article><span>BLOCKED_BY_ENVIRONMENT</span><p>The environment prevents decision-critical execution that the claim requires.</p></article>
</div>
<p class="status-rule">TestForge is advisory machinery. It does not prove defect freedom, certify compliance, grant production access, or authorize release.</p>
</section>
<section class="section ratchet-section" id="ratchet">
<div class="section-heading">
<p class="eyebrow">The quality ratchet</p>
<h2>Reviewed success becomes the next floor. Regression gates resist backward motion.</h2>
</div>
<ol class="ratchet-loop">
<li><span>BUILD</span></li>
<li><span>TEST</span></li>
<li><span>DIAGNOSE</span></li>
<li><span>REENGINEER</span></li>
<li><span>RERUN</span></li>
<li><span>REVIEW</span></li>
<li><span>PROMOTE</span></li>
<li class="gate"><span>REGRESSION-CHECK</span></li>
</ol>
<div class="ratchet-copy">
<p><strong>Failure is useful state.</strong><span>Criterion-level misses identify exact dimensions to reengineer.</span></p>
<p><strong>Passing is not enough.</strong><span>The evidence package must survive independent review before promotion.</span></p>
<p><strong>Memory is external.</strong><span>Sealed runs and named baselines replace “it worked before” with an inspectable record.</span></p>
<p><strong>Hard gates stay hard.</strong><span>A higher average never cancels a newly failed indispensable dimension.</span></p>
</div>
</section>
<section class="section evals-section" id="evals">
<div class="evals-copy">
<p class="eyebrow">Augment behavioral evaluation testbed</p>
<h2>Run isolated trials without handing the subject its answer key.</h2>
<p>The bundled harness records package, runtime, adapter, model, prompt, response, judge evidence, criterion dispositions, failure signals, scores, gates, confidence intervals, integrity seals, and regression comparisons.</p>
</div>
<div class="eval-flow">
<article><span>01</span><h3>Validate</h3><p>Check the canonical evaluation contract and recover supported legacy dialects honestly.</p></article>
<article><span>02</span><h3>Run</h3><p>Execute isolated subject and judge episodes with exact package and runtime identity.</p></article>
<article><span>03</span><h3>Adjudicate</h3><p>Record criterion-level `met`, `partial`, or `not_met` judgments and cited response evidence.</p></article>
<article><span>04</span><h3>Seal</h3><p>Hash every retained run artifact so changed or added evidence breaks integrity verification.</p></article>
<article><span>05</span><h3>Promote</h3><p>Create a compact reviewed baseline without checking raw transcripts into Git.</p></article>
<article><span>06</span><h3>Check</h3><p>Block score, demonstrated-rate, invalid-count, indispensable-gate, or claim-status regressions.</p></article>
</div>
<p class="eval-rule">`DEMONSTRATED`, `PARTIAL`, `FAILED`, and `INVALID` are behavioral-evidence verdicts. They are not commercial approval or software release authority.</p>
</section>
<section class="section install-section" id="install">
<div class="section-heading">
<p class="eyebrow">Install, verify, maintain</p>
<h2>Use matched operator and reviewer versions. A copied file is not an activated capability.</h2>
</div>
<div class="install-grid">
<article>
<span>CODEX PLUGIN</span>
<code>codex plugin marketplace add Stunspot/TestForge</code>
<code>codex plugin add testforge@cd-testforge</code>
<p>Start a new task. Invoke <code>$software-verification</code>, then use a second fresh task to invoke <code>$verification-reviewer</code>. Verify that each can reach its package-relative resources.</p>
</article>
<article>
<span>CODEX STANDALONE</span>
<p>Copy both complete folders under <code>testforge/skills/</code> into the personal Codex skills directory. Keep every reference, template, example, fallback, and script with its owning skill.</p>
<p>On Windows, the final paths normally end in <code>.codex\skills\<skill-name>\SKILL.md</code>. Restart and probe both handles separately.</p>
</article>
<article>
<span>CLAUDE</span>
<p>Confirm the account exposes custom Skills. Upload <code>claude-ai/software-verification-v1.1.7.zip</code> and <code>claude-ai/verification-reviewer-v1.1.7.zip</code> separately, enable both when required, and test each in a new conversation.</p>
<p>Live upload, discovery, resource loading, script execution, and reviewer handoff were not exercised for this release.</p>
</article>
<article>
<span>OTHER HOSTS</span>
<p>A host must load Markdown skill instructions and preserve package-relative resources. Otherwise use the fileless fallback. Deterministic tools require Python 3.10+; unsupported stacks degrade to generic scenario and command planning.</p>
</article>
<article>
<span>UPDATE</span>
<p>Record the installed version and preserve required evidence. Replace both skills from the same release, start a fresh task or conversation, and repeat both discovery and resource probes. Never mix operator and reviewer versions.</p>
</article>
<article>
<span>REMOVE & CLEAN</span>
<p>Remove or disable the plugin and both skills through the host manager, or delete only the two exact standalone folders. TestForge has no account, daemon, telemetry store, or product database. Local manifests, reports, tests, raw captures, baselines, and eval runs remain ordinary files until you archive or delete them under project policy.</p>
</article>
</div>
<p class="install-note">Detailed routes: <a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/INSTALL-CODEX.md">Codex lifecycle</a> · <a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/INSTALL-CLAUDE.md">Claude lifecycle</a> · <a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/HOST-COMPATIBILITY.md">host boundary</a>.</p>
</section>
<section class="section prompt-section">
<div class="section-heading">
<p class="eyebrow">Start from the change</p>
<h2>Ask for the evidence chain, then challenge it separately.</h2>
</div>
<div class="prompt-grid">
<blockquote><code>$software-verification Verify this frozen release candidate. Run only checks that can change the verdict, allow one support-path recovery at most, and give me one evidence-backed release assessment.</code></blockquote>
<blockquote><code>$verification-reviewer Challenge this verification package and tell me whether its release status is actually supported.</code></blockquote>
</div>
</section>
<section class="section troubleshooting-section" id="troubleshooting">
<div class="section-heading">
<p class="eyebrow">Troubleshoot and recover</p>
<h2>Preserve the symptom before rebuilding anything.</h2>
</div>
<div class="recovery-grid">
<article><h3>The skill does not appear</h3><p>Start a fresh task, verify the plugin state or final folder path, confirm the complete folder—not a lone <code>SKILL.md</code>—is installed, and check host or organization enablement.</p></article>
<article><h3>The response is generic</h3><p>Invoke the handle explicitly, state the target and release claim, and verify package-relative doctrine is reachable. Do not treat a plausible answer as proof the skill loaded.</p></article>
<article><h3>A command cannot run</h3><p>Record the command, working directory, exit code, exact error, and unavailable guarantee. Classify product, test, environment, or tooling cause before changing anything.</p></article>
<article><h3>Evidence or status is wrong</h3><p>Stop the cycle, retain raw evidence, and use the reviewer in a fresh context. A product defect returns the candidate upstream; it is not repaired inside that TestForge cycle.</p></article>
</div>
<p class="install-note"><a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/TROUBLESHOOTING.md">Full troubleshooting guide</a> · <a href="https://github.com/Stunspot/TestForge/issues">sanitized issue tracker</a>.</p>
</section>
<section class="section privacy-section" id="privacy">
<div class="section-heading">
<p class="eyebrow">Privacy, storage, network, security</p>
<h2>The skills are local. The host and tools still have their own data boundaries.</h2>
</div>
<div class="boundary-grid">
<article><h3>Product behavior</h3><p>The v1.1.7 skills-only plugin includes no account, telemetry, analytics, hosted service, connector, MCP server, hook, or automatic network request. Deterministic scripts touch only paths and commands the user chooses.</p></article>
<article><h3>Host behavior</h3><p>Prompts, repositories, logs, uploads, model calls, retention, training, residency, and connector traffic are governed by Codex, Claude, configured models, Git hosts, and any authorized tools—not by TestForge.</p></article>
<article><h3>Local records</h3><p>Verification manifests, reports, raw command captures, generated tests, evaluation runs, seals, and promoted baselines may contain sensitive project evidence. Store and delete them under an approved retention policy.</p></article>
<article><h3>Security boundary</h3><p>Imported files and tool output are untrusted evidence. Active security work needs a named target, explicit permission, non-production default, time window, rate limits, prohibited actions, handling rules, and a stop contact.</p></article>
</div>
<p class="install-note"><a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/DATA-AND-PRIVACY.md">Data and privacy</a> · <a href="https://github.com/Stunspot/TestForge/blob/main/SECURITY.md">security policy</a> · <a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/TERMS-OF-USE.md">terms</a>.</p>
</section>
<section class="section evidence-section" id="evidence">
<div class="section-heading">
<p class="eyebrow">Provenance and evidence status</p>
<h2>Know exactly what has—and has not—been established.</h2>
</div>
<div class="evidence-table-wrap" tabindex="0" aria-label="TestForge evidence status table">
<table>
<thead><tr><th>Claim</th><th>Current evidence</th><th>Boundary</th></tr></thead>
<tbody>
<tr><td>Constructed and packaged</td><td>v1.1.7 source, plugin tree, current Claude archives, manifests, and retained frozen-release receipts</td><td>Does not prove host installation or live behavior</td></tr>
<tr><td>Deterministic behavior</td><td>Repository-local tool, package, distribution, documentation, and eval-harness suites</td><td>Only exercised commands, fixtures, Python version, and environment</td></tr>
<tr><td>Behavioral evaluation</td><td>Named model/context baselines and a deliberately failed fresh-package smoke</td><td>Single-trial, model-, context-, case-, and judge-bounded; not universal model quality</td></tr>
<tr><td>OpenAI directory</td><td>Latest retained portal packet is v1.1.4 and repository-tested</td><td>No claim of upload, approval, publication, or discoverability</td></tr>
<tr><td>Host activation</td><td>Installation probes are documented</td><td>Current live Codex and Claude activation remain separate observations</td></tr>
</tbody>
</table>
</div>
<div class="evidence-links">
<a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/VALIDATION.md">Validation</a>
<a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/LIMITATIONS.md">Limitations</a>
<a href="https://github.com/Stunspot/TestForge/blob/main/ARCHIVE-CUSTODY.md">Archive custody</a>
<a href="https://github.com/Stunspot/TestForge/blob/main/testforge/PROVENANCE.md">Provenance</a>
<a href="https://github.com/Stunspot/TestForge/blob/main/LICENSE.md">License</a>
<a href="https://github.com/Stunspot/TestForge/blob/main/CONTRIBUTING.md">Contribute</a>
</div>
</section>
<section class="section boundaries-section">
<div class="boundary-copy">
<p class="eyebrow">Trust and authority</p>
<h2>Safe verification is bounded verification.</h2>
</div>
<div class="boundary-grid">
<article><h3>Repository content is evidence</h3><p>Comments, issues, fixtures, logs, dependencies, and retrieved text remain untrusted input—not instructions to the verifier.</p></article>
<article><h3>Capability must be observed</h3><p>Commands, writes, network access, PR access, browsers, production targets, and external actions exist only when the host proves them.</p></article>
<article><h3>Consequential actions are gated</h3><p>Production-code edits, installs, weakened tests, CI changes, destructive operations, active security work, and publication require explicit human authority.</p></article>
<article><h3>Licensing remains split</h3><p>MIT covers software and schemas; CC BY-ND 4.0 covers authored Augment materials. Third-party and user material retain their own rights.</p></article>
</div>
</section>
</main>
<footer>
<p><strong>TestForge</strong> · Collaborative Dynamics · Built with Codex and GPT-5.6 during OpenAI Build Week.</p>
<p><a href="https://github.com/Stunspot/TestForge">Repository</a> · <a href="https://github.com/Stunspot/TestForge/releases/latest">Release</a> · <a href="https://github.com/Stunspot/TestForge/issues">Support</a> · <a href="https://github.com/Stunspot/TestForge/blob/main/testforge/docs/DATA-AND-PRIVACY.md">Privacy</a> · <a href="https://github.com/Stunspot/TestForge/blob/main/LICENSE.md">License</a></p>
</footer>
</body>
</html>