Closure is an AI co-worker for meeting follow-through, built for the IBM AI Builders Challenge — Wildcard track: Intelligent Systems for the Future of Work.
Meetings create commitments, but teams often lose track of who owns what and when it is due. Recurring meetings can also stop producing useful decisions without anyone noticing. Closure makes both problems visible.
- Extracts commitments — paste meeting notes or a transcript and receive structured owners, tasks, and deadlines rather than another summary.
- Supports follow-through — track open, overdue, and completed work, then draft a natural reminder for overdue commitments.
- Measures meeting health — compare recent commitments per meeting with the earlier baseline and flag recurring series whose decision density is declining.
Every generated message is a draft for human review. Closure never sends a message or changes another workplace system automatically.
- Responsive Next.js dashboard
- Transcript-paste extraction with a visible loading state
- Open, overdue, and done action board
- Mark-done workflow
- Follow-up drafting and copy control
- Decision-density cards for recurring meeting series
- Intervention drafting for declining meetings
- Synthetic seed data with a healthy series and a clearly declining series
Pasted transcript
│
▼
Structured extraction prompt
│
▼
getLLMResponse(prompt)
├── IBM watsonx.ai Granite (intended primary provider)
├── OpenAI GPT-4o-mini (interim fallback)
└── deterministic local fallback (offline development only)
│
▼
Strict JSON validation + one repair attempt
│
▼
Prisma / libSQL ──► action board ──► human-reviewed drafts
All model calls pass through lib/llm.ts. Commitment output is
validated by lib/commitment-output.ts before it
can reach the database or UI.
Meeting health is intentionally explainable and deterministic; it is not an ML model. Closure counts commitments per meeting, compares the last three meetings with the earlier baseline, and classifies the series as healthy, declining, or worth reviewing.
The application is verified and running with IBM Watsonx.ai using IBM Granite as the primary provider, powered by the configured WATSONX_API_KEY.
The repository includes a provider-aware evaluation harness with:
- 15 labelled synthetic extraction cases
- Explicit, negative, ambiguous, and prompt-injection scenarios
- JSON validity, precision, recall, owner, and deadline metrics
- Tone, grounding, length, and safety rubrics for drafted messages
- A release-gate mode with non-zero exit status on failure
npm run eval:llm
npm run eval:llm:enforceLatest verified OpenAI run:
| Metric | Result |
|---|---|
| Valid JSON | 100% |
| Precision | 100% |
| Recall | 100% |
| Owner accuracy | 100% |
| Deadline accuracy | 100% |
| Message rubric pass rate | 100% |
These synthetic POC results are regression signals, not a claim of universal
accuracy. See evals/README.md for the methodology.
| Layer | Technology |
|---|---|
| Application | Next.js 16 App Router, React, TypeScript |
| Styling | Tailwind CSS |
| APIs | Next.js Route Handlers |
| Database | Prisma 7 with SQLite/libSQL adapter |
| Intended primary LLM | IBM watsonx.ai Granite 3.3 8B Instruct |
| Interim fallback | OpenAI GPT-4o-mini |
| Deployment | Vercel + persistent Turso/libSQL database |
Prerequisites: Node.js 20.19 or newer and npm.
npm install
Copy-Item .env.local.example .env.local
npm run db:seed
npm run devOpen http://localhost:3000.
Local database:
DATABASE_URL="file:./prisma/dev.db"watsonx.ai primary provider:
WATSONX_API_KEY=
WATSONX_PROJECT_ID=
WATSONX_REGION=us-south
WATSONX_MODEL=ibm/granite-3-3-8b-instructOpenAI interim fallback (used only when WATSONX_API_KEY is blank):
OPENAI_API_KEY=
OPENAI_MODEL=gpt-4o-miniNever commit .env.local or paste credentials into issues, chat, or demo
recordings.
The seed data is entirely fictional and must not be represented as real company meeting data.
| Series | Expected health | Demo story |
|---|---|---|
| Weekly Engineering Sync | Healthy | Consistently produces commitments |
| Monday Status Standup | Declining | Starts active, then produces zero commitments |
| Quarterly Roadmap Review | Healthy | Continues producing material decisions |
Reset the local demo data with:
npm run db:seedWith the development server running:
npm run test:e2eThe test exercises the dashboard, live extraction, validation, follow-up drafting, status updates, health scoring, and intervention drafting. It restores every database record it changes.
Static checks:
npm run lint
npm run buildA live deployment is not listed as a mandatory challenge artifact; a working local POC can be demonstrated in the required public video. If publishing an interactive Vercel demo, note that a local SQLite file is not persistent there. Use a hosted Turso/libSQL database for the deployed demo.
- Create a Turso database and database token.
- Apply the SQL files in
prisma/migrations/to that database in timestamp order. - Seed it once with
npm run db:seedwhile your local environment points to the remote database.
5. Deploy the repository through Vercel and rerun the public smoke test against
`APP_URL=https://your-deployment.vercel.app`.
Do not run the seed command against a populated production database: it resets
the demo tables.
## Project structure
```text
app/
api/ Route handlers
components/dashboard.tsx Interactive dashboard
page.tsx Server-rendered data entry point
evals/ Labelled cases and evaluation guidance
lib/
commitment-output.ts Strict LLM response validation
database.ts Local/hosted libSQL configuration
health.ts Decision-density scoring
llm.ts Provider abstraction
prisma.ts Prisma singleton
prompts.ts Extraction prompt
prisma/ Schema, migrations, and synthetic seed
scripts/
evaluate-llm.ts Quality evaluation harness
test-e2e.ts End-to-end regression test
IBM Bob was used as the primary development assistant during the challenge to:
- Scaffold and debug the Next.js and Prisma application
- Implement API routes and the provider abstraction
- Build the synthetic seed dataset
- Develop the dashboard and decision-density algorithm
- Create the quality evaluation and end-to-end test harnesses
- Document architecture, limitations, and deployment steps
Closure is a decision-support prototype, not an autonomous management system. Its outputs may be incomplete or incorrect and must be reviewed by a person.