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: 10 additions & 6 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,27 @@ jobs:
- run: pnpm db:generate && pnpm db:migrate && pnpm build
- run: pnpm exec tsc --noEmit && pnpm test && pnpm audit --prod
- run: pnpm exec playwright install --with-deps chromium
- name: Start private production services
- name: Start containerized dashboard and production reference
run: |
docker compose build app
docker compose --profile app up -d --wait app
mkdir -p work
pnpm --filter tally-dashboard start > work/dashboard-server.log 2>&1 &
pnpm --filter tally-reference start > work/reference-server.log 2>&1 &
ready=false
for attempt in $(seq 1 30); do
if curl --fail --silent http://localhost:3000/api/ready; then break; fi
if curl --fail --silent http://localhost:3001/ > /dev/null; then ready=true; break; fi
sleep 1
done
test "$ready" = true
- run: pnpm test:browser
- run: pnpm test:integration && pnpm test:independent && pnpm test:operations
- run: pnpm exec tsx scripts/native-check.ts
- name: Require real native WebMCP checks
env:
TALLY_REQUIRE_NATIVE: '1'
run: pnpm exec tsx scripts/native-check.ts
- run: pnpm exec tsx scripts/workflow-boundary.ts && pnpm exec tsx scripts/recovery-check.ts
- run: pnpm exec tsx scripts/performance.ts
- run: pnpm run licenses
- name: Build container
run: docker compose build app
- uses: actions/upload-artifact@v4
with:
name: tally-sdk-and-verification
Expand Down
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,13 @@ Manual tests, ordinary application controls and native callbacks have distinct a

## Verify

Use a **disposable local installation** for the verification scripts. The browser suite creates its own random QA owner credential in ignored `work/qa-state.json`. It must never run against an installation with a real owner. Run the dashboard and reference application first.
Use a **disposable local installation** for the verification scripts. The browser suite creates its own random QA owner credential in ignored `work/qa-state.json`. It must never run against an installation with a real owner. Complete installation and database migration above first. Generate the Prisma client and build the workspace packages before typechecking a fresh checkout; then run the dashboard and reference application for the browser and integration checks.

```sh
pnpm db:generate
pnpm build
pnpm exec tsc --noEmit
pnpm test
pnpm build
pnpm exec playwright install chromium
pnpm test:browser
pnpm test:integration
Expand All @@ -90,6 +91,8 @@ pnpm audit --prod

The operations test restarts this Compose database and creates/removes only the named disposable `tally_restore_check` and `tally_upgrade_check` databases. The integration test creates verification projects, manipulates their limit counters, expires verification sessions, and tests the owner login limiter. Do not run these tests on a live installation.

CI sets `TALLY_REQUIRE_NATIVE=1` for the native check, so missing browser capabilities fail that job. An ordinary local run records unsupported native APIs as unverified. Native checks exercise the browser's tool discovery and execution APIs, unauthorized project rejection, visible filter changes, persisted outcomes, and removal of tools after sign-out.

## Documentation

- [SDK installation and API](docs/INTEGRATION.md)
Expand Down
2 changes: 1 addition & 1 deletion apps/reference-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"dependencies": {
"@tally-local/sdk": "workspace:*",
"@tally-local/shared": "workspace:*",
"next": "16.3.4",
"next": "16.3.6",
"react": "19.2.8",
"react-dom": "19.2.8",
"zod": "4.5.4"
Expand Down
10 changes: 5 additions & 5 deletions apps/tally/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@
"start:container": "next start --hostname 0.0.0.0"
},
"dependencies": {
"@prisma/client": "6.19.3",
"@tailwindcss/postcss": "4.3.3",
"@tally-local/sdk": "workspace:*",
"@tally-local/shared": "workspace:*",
"@prisma/client": "6.19.3",
"better-auth": "1.7.3",
"next": "16.3.4",
"lucide-react": "^0.577.0",
"next": "16.3.6",
"react": "19.2.8",
"react-dom": "19.2.8",
"recharts": "3.10.1",
"zod": "4.5.4",
"lucide-react": "^0.577.0",
"tailwindcss": "4.3.3",
"@tailwindcss/postcss": "4.3.3"
"zod": "4.5.4"
}
}
4 changes: 1 addition & 3 deletions docs/RELEASE-READINESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ After the security correction, a separate boundary fixture calculated 25,000 wor
3. Native support is verified only for the documented flagged Chromium version. No claim covers unwrapped callbacks, declarative forms, rejection before callback entry, other browsers or automatic provider attribution. See [compatibility](COMPATIBILITY.md).
4. SDK 0.1.0 preserves ordinary synchronous values and native Promise outcomes. It does not treat custom thenables as promises. Promise object identity is not preserved.
5. One owner, up to 20 projects, one named workflow per project, immutable workflow definition and 30 minute observation window. New workflows remain open until the window matures, including those already completed early.
6. Remote HTTPS, secure host access, Windows file ACLs, backup encryption/expiration and retention scheduling are operator responsibilities. No public deployment or hosted service has been configured. The container favors a reproducible source build and includes build dependencies; its measured local image is approximately 4 GB.
6. Remote HTTPS, secure host access, Windows file ACLs, backup encryption/expiration and retention scheduling are operator responsibilities. These checks cover the self-hosted PostgreSQL edition. The hosted D1 service linked from the README is a separately maintained Sites deployment; this historical assessment does not certify it. The container favors a reproducible source build and includes build dependencies; its measured local image is approximately 4 GB.
7. Package namespace and product naming rights have not been established. `@tally-local/sdk` is a provisional local archive name. No npm publication or software license grant has been made.
8. [DEPENDENCIES.json](DEPENDENCIES.json) inspected 222 installed package manifest license fields. Flagged families include LGPL in a Sharp native package, MPL in Lightning CSS, CC BY in caniuse data and composite license expressions. These need distribution specific review and appropriate notices/source obligations before commercial redistribution. No legal clearance is claimed.
9. CI configuration is supplied. Local execution evidence above is distinct from a GitHub Actions run. Consult the repository Actions page for the result on a particular public commit.
Expand All @@ -54,5 +54,3 @@ No essential feature is a placeholder. No external credential blocked the local
## Security report context

The generated Codex Security report is delivered separately as `tally-security/report.md`, alongside sealed canonical JSON. It records the original unversioned snapshot. The workbench explicitly notes that source changed during the scan because the builder applied the verified corrections. It must not be described as an immutable audit of the later public commit. The recorded finding remains visible as historical evidence and its text states that it was fixed before publication.

The scan tool reports 7,219,683 processed tokens across four task logs, including 6,763,392 cached input tokens. This is workbench accounting for the captured logs, not a separately measured security-only cost.
7 changes: 4 additions & 3 deletions packages/shared/src/webmcp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ export function nativeContext():Context|undefined {return typeof document==='und
export async function registerTools(tools:BrowserTool[],signal:AbortSignal):Promise<string>{
const ctx=nativeContext();if(!ctx?.registerTool)return 'Native WebMCP unavailable. Ordinary controls and labeled manual tests remain available.';
const registered:string[]=[];
const cleanup=()=>{for(const name of registered){try{ctx.unregisterTool?.(name);}catch{ /* old implementation cleanup is best effort */ }}};
const registration=new AbortController();
const cleanup=()=>{registration.abort();signal.removeEventListener('abort',cleanup);for(const name of registered){try{ctx.unregisterTool?.(name);}catch{ /* old implementation cleanup is best effort */ }}};
signal.addEventListener('abort',cleanup,{once:true});
try{for(const tool of tools){if(signal.aborted)break;await ctx.registerTool(tool,{signal});registered.push(tool.name);}if(signal.aborted){cleanup();return 'Native registration stopped.';}return 'Native WebMCP registered. Execution source and outcomes are application-reported.';}
catch {cleanup();return 'Native WebMCP registration failed. Use ordinary controls or labeled manual tests.';}
try{for(const tool of tools){if(signal.aborted)break;await ctx.registerTool(tool,{signal:registration.signal});registered.push(tool.name);}if(signal.aborted){cleanup();return 'Native registration stopped.';}return 'Native WebMCP registered. Execution source and outcomes are application-reported.';}
catch {cleanup();return signal.aborted?'Native registration stopped.':'Native WebMCP registration failed. Use ordinary controls or labeled manual tests.';}
}
94 changes: 47 additions & 47 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading