Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
d307141
Add bounded native TypeScript verification oracle
rudycelekli Oct 13, 2026
2455f37
Refuse unbound compiler inputs in reserved state roots
rudycelekli Oct 13, 2026
f09990b
Bind type verification to opening inputs and close final capture windows
rudycelekli Oct 13, 2026
26019c0
Require repeated native TypeScript admission for enabled repairs
rudycelekli Oct 13, 2026
fbfdf49
Run complementary type verification through setup, runtime checks and…
rudycelekli Oct 13, 2026
efd272c
Challenge archive evidence and preserve physical typed repair install…
rudycelekli Oct 13, 2026
f31b22b
Make contribution timeout control independent of scheduler timing
rudycelekli Oct 13, 2026
e8d9590
Request explicit TAP for nested type verification controls
rudycelekli Oct 13, 2026
6227c36
Gate test improvement readiness on native TypeScript and safe receipts
rudycelekli Oct 13, 2026
370cf5c
Recheck typed improvements at publication and in installed archive proof
rudycelekli Oct 13, 2026
b80e34a
Require actual collection scope in installed typed improvement evidence
rudycelekli Oct 13, 2026
08761fe
Synchronize descendant cleanup control with actual OS observation
rudycelekli Oct 13, 2026
cd7bba5
Bound publication forgery setup independently from deadline controls
rudycelekli Oct 13, 2026
82c9048
Prevent result receipt aliases from clobbering verified source
rudycelekli Oct 13, 2026
c09866d
Document source-preserving late result storage failures
rudycelekli Oct 13, 2026
eb5a883
Request explicit TAP for source-preserving receipt replays
rudycelekli Oct 13, 2026
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
23 changes: 23 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,29 @@ concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
type-detection:
runs-on: ubuntu-latest
timeout-minutes: 6
steps:
- uses: actions/checkout@v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: actions/setup-node@v7.0.0
with:
node-version: '24'
- run: npm ci --ignore-scripts
- name: Reproduce observed type defects, retain unsupported scope, challenge evaluator
run: |
node scripts/type-detection-benchmark.js --output .tddswarm/ci-type-detection
node scripts/type-detection-benchmark.js --verify .tddswarm/ci-type-detection/summary.json
node scripts/type-detection-benchmark.js --challenge-evaluator .tddswarm/ci-type-detection/summary.json
- uses: actions/upload-artifact@v4
if: always()
with:
name: type-detection-${{ github.event.pull_request.head.sha || github.sha }}
path: .tddswarm/ci-type-detection/
include-hidden-files: true
if-no-files-found: error
gradia-evidence:
runs-on: ubuntu-latest
timeout-minutes: 5
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ TestLore brings **test creation, intelligent routing and reviewed learning** int

**Go beyond a green suite:** explicitly configured independent behavioral challenges also run during routine verification—even when no native tests are selected. Reports separate native outcomes, additional failures and incomplete checks. [Configure behavioral checks and compare detector coverage →](docs/defect-detection.md)

**Catch type errors runtime assertions miss:** setup enables the installed project-local TypeScript checker when a root `tsconfig.json` is present. Runtime and compiler results stay separate; ignored-source or dependency drift prevents a combined pass. [Native type verification and reproducible development examples →](docs/native-typecheck.md)

| Your starting point | What TestLore does |
| --- | --- |
| **No tests yet** | An architect, bounded author team, and independent reviewer propose runnable tests from your behavioral requirements. |
Expand Down
12 changes: 12 additions & 0 deletions benchmarks/type-detection/development-v1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Independent development type-contract examples

Five seeded healthy/fault pairs show why ordinary runtime checks and static type checking complement each other. Each pair keeps the same native assertions, configuration and shared contracts; one TypeScript source differs. A separate project-reference fixture remains explicitly unsupported/unqualified.

These are original DEVELOPMENT examples. They are not untouched maintainer specifications, historical upstream bugs, learned repairs, or a gold-standard claim. Public export makes them inspectable; they must not be called future holdouts.

Use Node22.19.0 and the pinned original TypeScript6.0.3 installation. Every probe.mjs executes real top-level node:assert/strict checks: six positive assertions across five ordinary probes, plus one in the separate reference probe. Each runs unchanged against healthy and fault states. Runtime checks intentionally exercise partial ordinary inputs.

Read manifest.json for exact source hashes, diagnostic categories, original checker arguments and explicit reference limitations. Capture actual installed SDK closure and complete process costs during reproduction; no SDK is shipped here and the recorded closure checksum grants no authority.

Derived public manifest SHA256: b4130e918e9d6a91edace4eb46e7a227aff46c88212a07760a85ed90942f0b39
Original private frozen manifest SHA256: 16b34a7b750805b6c1b2b8b0988a7e2fd204ae5ce285c630f149111bd2b7b09c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export function parseCount(value: string): number { return Number(value); }
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import {parseCount} from './api.ts';
export function configuredCount(): number { return parseCount(12); }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import assert from 'node:assert/strict';
import {configuredCount} from './consumer.ts';
assert.equal(configuredCount(), 12);
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export function parseCount(value: string): number { return Number(value); }
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import {parseCount} from './api.ts';
export function configuredCount(): number { return parseCount('12'); }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import assert from 'node:assert/strict';
import {configuredCount} from './consumer.ts';
assert.equal(configuredCount(), 12);
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import type {Entry} from '../contracts/types.ts';
export function entry(): Entry { return {id: 'fixed', attempts: '1'}; }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export interface Entry { id: string; attempts: number }
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import assert from 'node:assert/strict';
import {entry} from './packages/app/module.ts';
assert.equal(entry().id, 'fixed');
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import type {Entry} from '../contracts/types.ts';
export function entry(): Entry { return {id: 'fixed', attempts: 1}; }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export interface Entry { id: string; attempts: number }
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import assert from 'node:assert/strict';
import {entry} from './packages/app/module.ts';
assert.equal(entry().id, 'fixed');
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export function label(value: string | null): string {
if (value === null) return value;
return value.toUpperCase();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import assert from 'node:assert/strict';
import {label} from './module.ts';
assert.equal(label('hello'), 'HELLO');
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export function label(value: string | null): string {
if (value === null) return 'missing';
return value.toUpperCase();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import assert from 'node:assert/strict';
import {label} from './module.ts';
assert.equal(label('hello'), 'HELLO');
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export function update(entry: {readonly id: number}, replace: boolean): number {
if (replace) entry.id = 2;
return entry.id;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import assert from 'node:assert/strict';
import {update} from './module.ts';
const entry = {id: 1};
assert.equal(update(entry, false), 1);
assert.deepEqual(entry, {id: 1});
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export function update(entry: {readonly id: number}, replace: boolean): number {
if (replace) return 2;
return entry.id;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import assert from 'node:assert/strict';
import {update} from './module.ts';
const entry = {id: 1};
assert.equal(update(entry, false), 1);
assert.deepEqual(entry, {id: 1});
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true,
"allowImportingTsExtensions": true,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false
},
"include": [
"**/*.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type {Result} from '../contracts/types.js';
export function next(mode: 'idle' | 'fast'): Result {
if (mode === 'idle') return {value: 0};
return {value: '1'};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": false,
"allowImportingTsExtensions": false,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false,
"composite": true,
"declaration": true,
"rootDir": ".",
"outDir": "dist"
},
"include": [
"module.ts"
],
"references": [
{
"path": "../contracts"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": false,
"allowImportingTsExtensions": false,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false,
"composite": true,
"declaration": true,
"rootDir": ".",
"outDir": "dist"
},
"include": [
"types.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export interface Result { value: number }
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import assert from 'node:assert/strict';
import {next} from './packages/app/module.ts';
assert.deepEqual(next('idle'), {value: 0});
console.log('ordinary-input assertions passed');
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"files": [],
"references": [
{
"path": "./packages/contracts"
},
{
"path": "./packages/app"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"testlore-independent-development-spec","private":true,"type":"module"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type {Result} from '../contracts/types.js';
export function next(mode: 'idle' | 'fast'): Result {
if (mode === 'idle') return {value: 0};
return {value: 1};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": false,
"allowImportingTsExtensions": false,
"erasableSyntaxOnly": true,
"types": [],
"skipLibCheck": false,
"composite": true,
"declaration": true,
"rootDir": ".",
"outDir": "dist"
},
"include": [
"module.ts"
],
"references": [
{
"path": "../contracts"
}
]
}
Loading
Loading