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
16 changes: 13 additions & 3 deletions ARCHIVE-CUSTODY.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# TestForge v1.1.1 archive custody
# TestForge archive custody

TestForge is one two-skill Augment with several independently useful release objects. The canonical release keeps the complete product, its Codex plugin, and both standalone skills separately obtainable without pretending that a standalone skill is the whole product.

Expand All @@ -11,7 +11,17 @@ TestForge is one two-skill Augment with several independently useful release obj
| Claude.ai uploads | `claude-ai/software-verification-v1.1.1.zip` and `claude-ai/verification-reviewer-v1.1.1.zip` | Host-specific one-skill upload archives |
| Source repository | Git tag `v1.1.1` and its GitHub source archives | Versioned source, documentation, tests, testbed, and provenance |

`release-assets/v1.1.1/archive-custody.json` records exact hashes, sizes, member counts, source-tree digests, and extraction-parity results for the governed archives. GitHub release assets and the latest-only convenience backup shelf must match those hashes. Canonical assets are copied, never moved, to the backup shelf. Older same-family convenience copies may be removed only after the new copies match; unrelated products are untouched.
## Plugin publication payloads

The two standalone skill archives and their Claude.ai counterparts intentionally carry the same skill content under channel-appropriate names. Static package equality does not establish live Claude activation, live Codex discovery, or directory approval.
TestForge plugin v1.1.2 preserves two deliberately different ZIPs:

| Object | Canonical release artifact | Use |
|---|---|---|
| Installable Codex plugin | `release-assets/v1.1.2/Plugin-TestForge-v1.1.2.zip` | Normal Codex installation and marketplace distribution with the full interface manifest |
| OpenAI skills-only submission | `release-assets/v1.1.2/Plugin-TestForge-v1.1.2-OpenAI-Submission.zip` | Deterministic portal upload whose archived interface retains only `composerIcon` and `logo` |

`release-assets/v1.1.2/archive-custody.json` governs the installable plugin. `release-assets/v1.1.2/openai-submission-custody.json` separately records the portal derivative's archive hash, source and transformed manifest hashes, member count, and POSIX path requirement. The portal ZIP is not a replacement for the installable plugin.

`release-assets/v1.1.1/archive-custody.json` records exact hashes, sizes, member counts, source-tree digests, and extraction-parity results for the unchanged v1.1.1 Augment and skills. GitHub release assets and the latest-only convenience backup shelf must match the applicable custody records. Canonical assets are copied, never moved, to the backup shelf. Older same-family convenience copies may be removed only after the new copies match; unrelated products are untouched.

The two standalone skill archives and their Claude.ai counterparts intentionally carry the same skill content under channel-appropriate names. Static package equality does not establish live Claude activation, live Codex discovery, or directory approval.
26 changes: 21 additions & 5 deletions PLUGIN-DIRECTORY-SUBMISSION-v1.1.2.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,42 @@
# TestForge Plugins Directory submission packet

This packet maps the released TestForge plugin to the current OpenAI Plugins Directory form. It prepares a **Skills only** submission; it does not assert that a publisher identity is verified, that policy attestations have been made, or that OpenAI has reviewed or published the plugin.
This packet maps the released TestForge plugin to the current OpenAI Plugins Directory form and records the created **Skills only** draft. Draft creation and publisher-identity selection are observed; owner policy attestations, submission for review, approval, publication, and discoverability remain separate states.

## Released object

- Plugin version: `1.1.2`
- Core Augment and standalone skill version: `1.1.1`
- Upload: `release-assets/v1.1.2/Plugin-TestForge-v1.1.2.zip`
- SHA-256: `ae04e5b090e48f94aa6316b38955bd82e38a75a202161db56f0d5fed539fdae7`
- Installable plugin: `release-assets/v1.1.2/Plugin-TestForge-v1.1.2.zip`
- Installable plugin SHA-256: `ae04e5b090e48f94aa6316b38955bd82e38a75a202161db56f0d5fed539fdae7`
- OpenAI submission upload: `release-assets/v1.1.2/Plugin-TestForge-v1.1.2-OpenAI-Submission.zip`
- Submission upload SHA-256: `5154636d71c9bb00fa8754071d843110fedd036e361036fd00dc2b42fcdb7db2`
- Submission custody: `release-assets/v1.1.2/openai-submission-custody.json`
- Draft-upload comparison: `release-assets/v1.1.2/portal-draft-upload-evidence.json`
- Public release: <https://github.com/Stunspot/TestForge/releases/tag/v1.1.2>
- Submission type: **Skills only**

The installable plugin keeps its full local and marketplace `interface`. The governed portal upload is a deterministic channel derivative of the same 106-file plugin tree; only the archived manifest is transformed to retain `composerIcon` and `logo`. Every ZIP member path uses `/`; UTF-8 text is canonicalized to LF without a BOM; and members use stored ZIP entries so the archive is byte-identical across supported Python runtimes. The draft was created from a preflight ZIP with the same member names and raw member bytes; its ZIP container metadata was not deterministic. The live portal accepted this shape after rejecting the rich upload interface and its screenshot configuration.

## Created draft

- Plugin ID: `plugins_6a5e0f2981d48191a11548355b7ecbc5`
- Submission ID: `appsub_6a5e0f299d848191b1cd16ae162ef105`
- Draft URL: <https://platform.openai.com/plugins/plugins_6a5e0f2981d48191a11548355b7ecbc5/submissions/appsub_6a5e0f299d848191b1cd16ae162ef105>
- Observed draft state on 2026-07-20: listing, three prompts, two skills, and capability tags saved; both skills passed automated scanning; policy attestations unchecked; review submission not executed.

## Info

- Plugin name: **TestForge**
- Short description: **Risk-ranked verification with an independent skeptic.**
- Portal subtitle: **Risk-ranked code verification** (29 characters; the live form caps this field at 30)
- Long description: **Turn software changes, repositories, defects, and release candidates into risk-ranked evidence, meaningful tests, captured execution, and a traceable release assessment, then challenge the result with an independent skeptical reviewer.**
- Developer identity: select the verified **Collaborative Dynamics** identity in the portal; the accountable owner must confirm the identity and organization match before submission.
- Developer identity: **Business — Collaborative Dynamics Inc** selected in the portal; the listing developer name is **Collaborative Dynamics Inc**.
- Category: **Developer Tools**
- Logo: `plugins/testforge/assets/testforge-icon-v1.1.1.png`
- Website: <https://github.com/Stunspot/TestForge>
- Support: <https://github.com/Stunspot/TestForge/issues>
- Privacy: <https://github.com/Stunspot/TestForge/blob/main/testforge/docs/DATA-AND-PRIVACY.md>
- Terms: <https://github.com/Stunspot/TestForge/blob/main/testforge/docs/TERMS-OF-USE.md>
- Capabilities: separate **Interactive**, **Read**, and **Write** tags.

## Starter prompts

Expand Down Expand Up @@ -98,3 +112,5 @@ Initial public submission of the free TestForge skills-only plugin. TestForge co
## Accountable-owner gate

Before selecting **Submit for Review**, the publisher must personally confirm the verified developer or business identity, organization and Apps Management authority, country availability, public URLs, and every policy attestation. Submission begins OpenAI review; approval, publisher release, and public discoverability are later observable states.

The live 2026-07-20 skills-only form did not expose the documentation page's separate Testing, Global, or release-notes panels. The exact five positive cases, three negative cases, availability decision, and release notes remain preserved above for reviewer follow-up or a later portal revision; their repository presence does not mean they were transmitted in the current draft.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ TestForge is advisory verification machinery. It does not prove defect freedom,
- [`testforge/docs/QUICK-START.md`](testforge/docs/QUICK-START.md) - install and first-use guide.
- [`RELEASE-NOTES-v1.1.1.md`](RELEASE-NOTES-v1.1.1.md) - plugin-publication changes and exact untested boundary.
- [`ARCHIVE-CUSTODY.md`](ARCHIVE-CUSTODY.md) - canonical Augment, plugin, standalone-skill, Claude, GitHub, and backup custody.
- [`PLUGIN-DIRECTORY-SUBMISSION-v1.1.2.md`](PLUGIN-DIRECTORY-SUBMISSION-v1.1.2.md) - exact OpenAI draft listing, portal-specific upload custody, reviewer cases, and owner-only submission gate.
- [`testforge/docs/SALES-DEMO.md`](testforge/docs/SALES-DEMO.md) - a compact proof-of-value scenario.
- [`tools/augment-evals/`](tools/augment-evals/) - isolated Augment behavioral evaluation harness.
- [`tools/augment-evals/README.md`](tools/augment-evals/README.md) - testbed setup, run, review, seal, promote and regression workflow.
Expand All @@ -61,7 +62,7 @@ Start a new Codex task, then invoke `$software-verification` or `$verification-r

Download the latest release, unzip it and keep the `testforge/` tree together. Expose both directories under `testforge/skills/` through your Agent host's skill mechanism. Host-specific notes are included for [Codex](testforge/adapters/codex.md), [Claude Code](testforge/adapters/claude-code.md), [GitHub](testforge/adapters/github.md), [local shell](testforge/adapters/local-shell.md) and [copy-paste chat](testforge/adapters/copy-paste-chat.md).

The GitHub release also preserves the complete Augment, the Codex plugin, and each bundled skill as separately named archives. This keeps `$software-verification` and `$verification-reviewer` independently recoverable without losing the complete two-skill product.
The GitHub release also preserves the complete Augment, the installable Codex plugin, its distinct OpenAI skills-only portal upload, and each bundled skill as separately named archives. This keeps `$software-verification` and `$verification-reviewer` independently recoverable without losing the complete two-skill product. The OpenAI draft exists and both bundled skills passed automated scanning; accountable-owner attestations and submission for review remain pending.

Then start with:

Expand Down
3 changes: 2 additions & 1 deletion documentation-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"testforge/docs/SUPPORT-AND-VERSIONING.md",
"RELEASE-NOTES-v1.1.1.md",
"ARCHIVE-CUSTODY.md",
"PLUGIN-DIRECTORY-SUBMISSION-v1.1.2.md",
"testforge/PROVENANCE.md"
],
"moments": {
Expand All @@ -29,7 +30,7 @@
"recovery": ["README.md", "testforge/docs/TROUBLESHOOTING.md", "testforge/docs/SUPPORT-AND-VERSIONING.md"],
"privacy_security": ["testforge/docs/DATA-AND-PRIVACY.md", "testforge/docs/TERMS-OF-USE.md", "testforge/SECURITY.md"],
"evidence_limits": ["testforge/docs/VALIDATION.md", "testforge/docs/LIMITATIONS.md"],
"support_maintenance": ["testforge/docs/SUPPORT-AND-VERSIONING.md", "RELEASE-NOTES-v1.1.1.md", "ARCHIVE-CUSTODY.md"],
"support_maintenance": ["testforge/docs/SUPPORT-AND-VERSIONING.md", "RELEASE-NOTES-v1.1.1.md", "ARCHIVE-CUSTODY.md", "PLUGIN-DIRECTORY-SUBMISSION-v1.1.2.md"],
"provenance": ["testforge/PROVENANCE.md"]
}
}
Binary file not shown.
39 changes: 39 additions & 0 deletions release-assets/v1.1.2/openai-submission-custody.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"schema_version": "cd-openai-plugin-submission-custody/v1",
"plugin": {
"name": "testforge",
"version": "1.1.2"
},
"source_plugin_root": "testforge",
"top_level": "testforge-plugin",
"archive_name": "Plugin-TestForge-v1.1.2-OpenAI-Submission.zip",
"archive_sha256": "5154636d71c9bb00fa8754071d843110fedd036e361036fd00dc2b42fcdb7db2",
"bytes": 954071,
"member_count": 106,
"source_manifest_sha256": "5130b07286a89ec9c3e837b2432a3dbb02f7ea5a9a6b5ef2715470ecd40feba8",
"submission_manifest_sha256": "c520ced3671ee355ba228e55604d809d09af3de41c56b41102500ef95d39874e",
"text_canonicalization": "UTF-8 text is stored as LF without a BOM; binary and non-UTF-8 bytes are preserved",
"normalized_text_member_count": 0,
"zip_compression": "stored",
"manifest_transform": {
"kept_interface_fields": [
"composerIcon",
"logo"
],
"omitted_interface_fields": [
"brandColor",
"capabilities",
"category",
"defaultPrompt",
"developerName",
"displayName",
"longDescription",
"privacyPolicyURL",
"screenshots",
"shortDescription",
"termsOfServiceURL",
"websiteURL"
]
},
"archive_paths_use_forward_slashes": true
}
26 changes: 26 additions & 0 deletions release-assets/v1.1.2/portal-draft-upload-evidence.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"schema_version": "cd-openai-plugin-draft-upload-evidence/v1",
"observed_on": "2026-07-20",
"plugin_id": "plugins_6a5e0f2981d48191a11548355b7ecbc5",
"submission_id": "appsub_6a5e0f299d848191b1cd16ae162ef105",
"skill_scan_result": "software-verification passed; verification-reviewer passed",
"owner_gate": "four policy attestations unchecked; review submission not executed",
"accepted_preflight_archive": {
"name": "Plugin-TestForge-v1.1.2-icons-only.zip",
"sha256": "7938793968025cfab1a75eeb935bbbc3edecc5a51bff33d4baae4b408c63ba5b",
"bytes": 866006,
"member_count": 106
},
"governed_release_archive": {
"name": "Plugin-TestForge-v1.1.2-OpenAI-Submission.zip",
"sha256": "5154636d71c9bb00fa8754071d843110fedd036e361036fd00dc2b42fcdb7db2",
"bytes": 954071,
"member_count": 106
},
"comparison": {
"member_names_match": true,
"raw_member_hashes_match": true,
"archive_bytes_match": false,
"explanation": "The accepted preflight ZIP and governed release ZIP contain identical named file bytes. ZIP timestamps and container metadata differ; only the governed release ZIP is deterministic."
}
}
43 changes: 24 additions & 19 deletions release-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"package": "testforge-public-repository",
"version": "1.1.1",
"release_date": "2026-07-20",
"artifact_count": 423,
"artifact_count": 424,
"artifacts": [
{
"path": ".agents/plugins/marketplace.json",
Expand All @@ -27,8 +27,8 @@
},
{
"path": "ARCHIVE-CUSTODY.md",
"size": 1998,
"sha256": "bcdb3dc2ab15604c3ddd7e3a0cf0ca05fea994f84a862e54c13dcd87c92d316c"
"size": 2896,
"sha256": "425b0b6934970f7f08c0cfef076f22a8d5a19fb5e04e42a353c569119e731b1d"
},
{
"path": "archive-plan-v1.1.2.json",
Expand Down Expand Up @@ -87,8 +87,8 @@
},
{
"path": "documentation-manifest.json",
"size": 1591,
"sha256": "e18fc56494395b0ec7c00033f31ea5a022f71f34027902b60309d583934e0028"
"size": 1677,
"sha256": "e1a66509bec90a75b9e0ca8a7fe3734629eaeedd81eec72739c5875f089281e5"
},
{
"path": "documentation-review.json",
Expand Down Expand Up @@ -127,8 +127,8 @@
},
{
"path": "PLUGIN-DIRECTORY-SUBMISSION-v1.1.2.md",
"size": 8319,
"sha256": "4aac07a2b5f71dbc57d17facfcf977113dbf78b284b5c8fc592a41849aee4a9c"
"size": 10356,
"sha256": "80deaedd4a09d08a8c0f39a3fd9ce3d1a7ff3428212c9e2c8b067a535d53d601"
},
{
"path": "plugins/testforge/.codex-plugin/plugin.json",
Expand Down Expand Up @@ -662,8 +662,8 @@
},
{
"path": "README.md",
"size": 8321,
"sha256": "98caca5bba04d25a652d073e41d92b2fb130c8b8e433cb2e2f9980a5469cef91"
"size": 8721,
"sha256": "692953a48b51e18853fe19bc2626ce1bc9d24cf9a8d4c36c11176ccefd164a80"
},
{
"path": "RELEASE-NOTES-v1.1.0.md",
Expand Down Expand Up @@ -1217,8 +1217,8 @@
},
{
"path": "testforge/release-manifest.json",
"size": 41996,
"sha256": "2ceebfee9f8cfee217126091d2af6aed1bcc5d3ff0477061e739c6b685477226"
"size": 42133,
"sha256": "45903a62d228256652199523ff21594ee2acdc66f4d6f68f9dfffb9f7c72938f"
},
{
"path": "testforge/scripts/assemble_report.py",
Expand Down Expand Up @@ -1818,12 +1818,12 @@
{
"path": "tests/test_documentation.py",
"size": 3729,
"sha256": "6966fa1b8b9da566f9c52097e04e5654a069bbce6cbb407e4e4b0f2e913b4ebb"
"sha256": "1b47b54c993d72d2bc8ebd5921794a3f83ab993fd25ad49d2ab53d97b2947091"
},
{
"path": "tests/test_public_distribution.py",
"size": 4517,
"sha256": "faa493e1c4d85e52ad4933e3c5ad28283e7c5246b77458e82f9df21251f162a4"
"size": 6286,
"sha256": "8027ec37dfb3c4381c4eb4c30ef3d5e264af886614dd287483cc5ba3350479b2"
},
{
"path": "tools/augment-evals/.gitignore",
Expand Down Expand Up @@ -1925,10 +1925,15 @@
"size": 11261,
"sha256": "44b5cf0276fe775cee1bb144666c4a3543690c610ff18073a6d958ff05e46920"
},
{
"path": "tools/build_openai_submission_archive.py",
"size": 7174,
"sha256": "af5dace6b88303b244233fc47191cce381cd250dc39b4806d348a3e9589bf3f7"
},
{
"path": "tools/rebuild_public_release.py",
"size": 3869,
"sha256": "22cfb84d685bd30f16bfde49502d0a118fd2a501915f320fc143ce72ca185556"
"size": 4006,
"sha256": "1e55eb13ed19f519b5303997518f3ffef5602ccbb827b8d8e5dbd6954d5c8917"
},
{
"path": "tools/validate_release_manifests.py",
Expand Down Expand Up @@ -2107,8 +2112,8 @@
},
{
"path": "verification/release-summary-v1.1.2.json",
"size": 2310,
"sha256": "8dd00ab570d33033c2afcb4aafab6cd32b1434634b020354189a103c775f37a7"
"size": 3337,
"sha256": "f95e3d09d59878cd90c90912c65d87b717514895f95d74ec6f7f235a084f25e8"
},
{
"path": "verification/verification-report.json",
Expand All @@ -2121,5 +2126,5 @@
"sha256": "3077f2273126e425873c1ac76206602a07007deb8843171127e9d80f71c1e73c"
}
],
"note": "release-manifest.json and release-assets/ are excluded from this source-tree hash list; release-assets/v1.1.1/archive-custody.json governs release archives; UTF-8 text hashes use canonical LF line endings for cross-platform validation"
"note": "release-manifest.json and release-assets/ are excluded from this source-tree hash list; release-assets/v1.1.1/archive-custody.json governs the Augment and standalone skills, while release-assets/v1.1.2/archive-custody.json and openai-submission-custody.json govern plugin publication payloads; UTF-8 text hashes use canonical LF line endings for cross-platform validation"
}
2 changes: 1 addition & 1 deletion testforge/release-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -1131,5 +1131,5 @@
"sha256": "ce0c4eeed8c0be9e89180d8c761f9f254431ff1a05f78b7351506a69cf22b8a0"
}
],
"note": "release-manifest.json and release-assets/ are excluded from this source-tree hash list; release-assets/v1.1.1/archive-custody.json governs release archives; UTF-8 text hashes use canonical LF line endings for cross-platform validation"
"note": "release-manifest.json and release-assets/ are excluded from this source-tree hash list; release-assets/v1.1.1/archive-custody.json governs the Augment and standalone skills, while release-assets/v1.1.2/archive-custody.json and openai-submission-custody.json govern plugin publication payloads; UTF-8 text hashes use canonical LF line endings for cross-platform validation"
}
2 changes: 1 addition & 1 deletion tests/test_documentation.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def setUp(self):
def test_customer_document_manifest_is_complete_and_coherent(self):
documents = self.manifest["customer_docs"]
self.assertEqual(len(documents), len(set(documents)))
self.assertEqual(18, len(documents))
self.assertEqual(19, len(documents))
self.assertIn("testforge/docs/TERMS-OF-USE.md", documents)
self.assertIn("ARCHIVE-CUSTODY.md", documents)
self.assertIn(f"RELEASE-NOTES-v{CURRENT_VERSION}.md", documents)
Expand Down
Loading
Loading