Pulse360 is a full-stack internal 360° performance review platform built for semi-annual/quarterly/monthly cycles. Built by me and the IBM Bob team at the Pulse Technologies Hackathon V1 — AI App Build IDE Challenge. Testing AI App Build IDE tools like IBM Bob, Codex, Cursor, Claude Code.
- Overview
- Tech Stack
- Team
- Prerequisites
- Getting Started
- Environment Variables
- Database
- Running the App
- Test Accounts
- Project Structure
- API Reference
- Review Cycle Lifecycle
- Features Implemented
- Human-in-the-Loop Log
- IBM Bob — Agentic AI Platform Notes
- Useful Commands
Pulse360 replaces the original eWay 360° Review name with a modern product identity. It allows Pulse Technologies employees to conduct semi-annual peer performance reviews aligned to the eWay competency framework — covering 6 criteria (MASTERFUL, EXCELLENCE, EXECUTION, COMMITMENT, CONTRIBUTION, ADDITIONAL) across 28 questions.
Four roles — System Administrator, HR Administrator, Line Manager, and Employee — each see a tailored dashboard and workflow through an 8-phase review cycle: Draft → Nominate → Approve → Review → Calculation → Consultation → Accept → Closed. The System Administrator is a separate platform-operations persona for adoption analytics, audit metadata, AI usage, and operational health monitoring without exposing sensitive review scores or comments.
All features were built using IBM Bob, an enterprise agentic AI platform(Agentic SDLC Development partner), in a single hackathon day. Bob acted as Developer, Architect, QA Reviewer, Data Engineer, and Security Reviewer throughout the build. My role was to guide bob on the companies architecture, designs shift and other capabilities and feature that would make the product very useful, provide business value and create a differentiator with IBM BOB for Agentic SDLC Development by proving that it is possible to build a fully AI integrated system in a day with minimal ease saying developers the time on development and prototyping.
| Layer | Technology | Version |
|---|---|---|
| Framework | Next.js (App Router) | 16.2.12 |
| Language | TypeScript | 5.x |
| Database | PostgreSQL | 16 |
| Container | Podman | 5.7.1 |
| ORM | Prisma | 7.9.1 |
| Auth | NextAuth.js | 4.24.15 |
| UI | Tailwind CSS | 4.x |
| AI Text Generation | OpenAI SDK (GPT-4o) | 7.4.0 |
| Agentic AI Platform | IBM Bob | 2 |
| MCP Tooling | Model Context Protocol SDK | 1.11.4 |
| Runtime | Node.js | 22.x |
Note: This project uses Podman (not Docker). The
docker-compose.ymlin the root is kept for reference only. The database is started withpodman run— see Database. My Docker env was running on a different machine for a BPMN agentic system build for an e-commerce client's order-processing with agentic capabilities.(projet to be released soon to the public)
| Name | Role |
|---|---|
| Romeo Ndlovu | Data and AI Engineer / Platform Engineer |
| IBM Bob | Agentic AI Developer |
-
Link to 30 day free trial: https://bob.ibm.com/
-
IDC research Link (May 05, 2026): https://www-api.ibm.com/adobe/assets/urn:aaid:aem:f72132ce-a92b-43ea-8b57-f8127b773535/original/as/idc-paper-on-ibm-bob-for-agentic-sdlc-development.pdf
| Requirement | Version | Notes |
|---|---|---|
| Node.js | v20+ | Required to run the Next.js app |
| Podman | v5+ | Used to run the PostgreSQL container |
| npm | v9+ | Bundled with Node.js |
git clone https://bitbucket.org/ovmobile/hackathon-v1-ibm.git
cd hackathon-v2-ibm# Start the container (first time — creates and seeds the DB)
podman run -d `
--name pulse360_db `
-e POSTGRES_USER=pulse360_user `
-e POSTGRES_PASSWORD=password123 `
-e POSTGRES_DB=pulse360 `
-p 5432:5432 `
postgres:16-alpine
# Apply all init scripts in order
Get-ChildItem database\init\*.sql | Sort-Object Name | ForEach-Object {
Write-Host "Applying $($_.Name)..."
Get-Content $_.FullName | podman exec -i pulse360_db psql -U pulse360_user -d pulse360
}If the container already exists from a previous run:
podman start pulse360_dbcd pulse360
npm installCreate pulse360/.env with the following (never committed to git):
DATABASE_URL="postgresql://pulse360_user:password123@localhost:5432/pulse360"
NEXTAUTH_SECRET="pulse360-dev-secret-change-in-production-32chars"
NEXTAUTH_URL="http://localhost:3000"
OPENAI_API_KEY="sk-..." # Optional — app falls back to stub responses if not setcd pulse360
npx prisma generatecd pulse360
npm run devApp is available at http://localhost:3000 locally
Deployed App is on: https://pulse360-gkt8.onrender.com
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
✅ | PostgreSQL connection string |
NEXTAUTH_SECRET |
✅ | Random string for JWT signing (min 32 chars) |
NEXTAUTH_URL |
✅ | Base URL of the app (http://localhost:3000 locally) |
OPENAI_API_KEY |
Enables live AI Comment Suggestions, Theme Summary, Improvement Plan, and PDF Report narrative. App falls back to realistic stub responses if not set. |
Scripts are applied in order on first container start:
| File | Purpose |
|---|---|
01_extensions.sql |
Enables pgcrypto and citext extensions |
02_enums.sql |
All PostgreSQL ENUM types |
03_schema.sql |
11 tables, triggers, and constraints |
04_indexes.sql |
Performance indexes |
05_seed_criteria.sql |
6 eWay criteria + 28 questions |
06_seed_departments.sql |
10 departments |
07_seed_employees.sql |
57 synthetic employees with manager relationships |
08_add_password_hash.sql |
bcrypt password hashes for all 57 employees |
| Table | Purpose |
|---|---|
department |
10 org departments |
employee |
All users — System Admin, HR Admin, Line Manager, Employee |
review_cycle |
Semi-annual review cycles (8-phase lifecycle) |
pulse_criterion |
The 6 eWay competency pillars |
pulse_question |
28 individual sub-questions (RATING / TEXT / BOOLEAN) |
cycle_criteria |
Junction: which criteria are active per cycle |
nomination |
Peer nominations with manager auto-lock |
review |
Submitted reviews per reviewer per subject |
review_rating |
Individual question answers (score or text) |
review_result |
Computed aggregates written at CALCULATION phase |
audit_log |
Append-only raw governance event log |
auth_event |
Login success/failure projection for adoption and access monitoring |
profile_event |
Profile update projection showing which fields changed without exposing old/new values |
ai_usage_event |
AI feature usage, status, model, and token metadata |
ai_hitl_decision |
Human-in-the-loop accept/edit/discard decisions for AI-generated content |
nomination_event |
Nomination lifecycle events with employee/reviewer and department snapshots |
review_event |
Review draft/submission metadata without review comments or scores |
The employee table now also carries HR-managed workforce dimensions: job grade, employment type, conversion-hire status, gender, and ethnicity. System Admin analytics read from dedicated event tables and aggregated workforce dimensions. Ethnicity is intentionally kept for HR demographic reporting and is not displayed on the System Admin dashboard.
# Connect with psql
podman exec -it pulse360_db psql -U pulse360_user -d pulse360
# Check all tables
\dt
# Check seeded employees
SELECT first_name, last_name, role FROM employee LIMIT 10;
# Check criteria and questions
SELECT c.name AS criterion, COUNT(q.id) AS questions
FROM pulse_criterion c
JOIN pulse_question q ON q.criterion_id = c.id
GROUP BY c.name, c.sort_order
ORDER BY c.sort_order;# Development (with hot reload)
cd pulse360
npm run dev
# Production build check
cd pulse360
npx next build
# Production server
cd pulse360
npm startAll passwords are bcrypt-hashed in the database — never stored in plain text.
| Role | Password | |
|---|---|---|
| HR Administrator | lerato.mkhize@techcorp.co.za |
Pulse360!Admin |
| Line Manager | hlanganani.oosthuiz@techcorp.co.za |
Pulse360!Manager |
| Employee | mpho.zulu@techcorp.co.za |
Pulse360!Employee |
| Role | Password | |
|---|---|---|
| Line Manager | zanele.mohamed@techcorp.co.za |
Pulse360!Manager |
| Employee | dikeledi.mkhize@techcorp.co.za |
Pulse360!Employee |
Zanele and Dikeledi are in the Marketing department. They can only nominate peers within Marketing (department-scoped peer selection). Zanele, as Dikeledi's line manager, appears as her mandatory auto-locked reviewer.
hackathon-v2-ibm/
├── README.md
├── .env.example
├── docker-compose.yml # Reference only — use Podman
├── .bob/
│ └── mcp.json # MCP server registration (pulse360-mcp)
├── database/
│ └── init/ # 8 SQL init scripts (applied in order)
│ ├── 01_extensions.sql
│ ├── 02_enums.sql
│ ├── 03_schema.sql
│ ├── 04_indexes.sql
│ ├── 05_seed_criteria.sql
│ ├── 06_seed_departments.sql
│ ├── 07_seed_employees.sql
│ └── 08_add_password_hash.sql
└── pulse360/ # Next.js application
├── .env # Local env (not committed)
├── next.config.ts
├── prisma.config.ts # Prisma v7 datasource config
├── prisma/
│ └── schema.prisma # 11 models, 7 enums
├── mcp-server/ # ✨ Custom MCP server (TypeScript)
│ ├── src/index.ts # Two tools: write_csv, generate_pdf_report
│ ├── build/index.js # Compiled output (registered in .bob/mcp.json)
│ └── package.json
└── src/
├── proxy.ts # Next.js 16 middleware (RBAC route guards)
├── components/
│ ├── Sidebar.tsx # Role-aware navigation
│ ├── CycleList.tsx # Cycle phase stepper (client component)
│ ├── AISummaryPanel.tsx # AI Feedback Theme Summary panel
│ └── SelfAssessmentPanel.tsx # ✨ Self-assessment + gap analysis + improvement plan
├── lib/
│ ├── auth.ts # NextAuth v4 credentials provider
│ ├── auth.types.ts # Session type augmentation
│ └── prisma.ts # PrismaClient singleton with pg adapter
└── app/
├── layout.tsx
├── page.tsx # Root redirect → /dashboard or /login
├── globals.css
├── login/
├── api/
│ ├── auth/[...nextauth]/
│ ├── ai/
│ │ ├── suggest-comments/ # POST — AI comment suggestions (GPT-4o)
│ │ ├── theme-summary/ # POST — AI feedback theme analysis (GPT-4o)
│ │ └── improvement-plan/ # ✨ POST — AI self-improvement plan + gap analysis
│ ├── analytics/
│ │ ├── heatmap/ # GET — dept × criterion heatmap + trends + pie data
│ │ └── report/ # ✨ POST — AI-generated PDF report HTML
│ ├── mcp/
│ │ ├── write-csv/ # ✨ POST — MCP tool proxy: write improvement plan CSV
│ │ └── generate-report/ # ✨ POST — MCP tool proxy: write approved report HTML
│ ├── approvals/[id]/approve/ # POST
│ ├── approvals/[id]/reject/ # POST
│ ├── approvals/bulk-approve/ # POST
│ ├── criteria/ # GET (active), POST (create new)
│ ├── criteria/full/ # GET (all + questions)
│ ├── criteria/[id]/ # PUT (edit / toggle active)
│ ├── cycles/ # GET, POST
│ ├── cycles/list/ # GET (lightweight list)
│ ├── cycles/[id]/advance/ # POST (advance phase + auto-calculate scores)
│ ├── departments/ # GET
│ ├── employees/ # GET, POST
│ ├── employees/list/ # GET (dept-scoped for non-HR roles) ✨ Updated
│ ├── employees/managers/ # GET
│ ├── employees/[id]/ # GET, PUT
│ ├── nominations/ # GET, POST (dept-scoped validation) ✨ Updated
│ ├── nominations/cycle/ # GET (effective min/max per pool size) ✨ Updated
│ ├── nominations/submit/ # POST (effective min per pool size) ✨ Updated
│ ├── nominations/[id]/ # DELETE
│ ├── reviews/ # POST (save/submit)
│ └── reviews/draft/ # GET (load draft)
└── (app)/ # Authenticated app shell
├── layout.tsx # Sidebar + session wrapper
├── analytics/ # ✨ Rebuilt: cycle selector, pie chart, trend bars, heatmap, AI report
├── approvals/ # HR Admin + Manager — nomination approvals + bulk approve
├── criteria/ # HR Admin — view/edit/add/deactivate criteria
├── cycles/ # HR Admin — list cycles + advance phases
├── cycles/new/ # HR Admin — create new cycle
├── dashboard/ # All roles — role-specific dashboards
├── employees/ # HR Admin — employee list
├── employees/[id]/ # HR Admin — add/edit employee
├── manager/results/ # Manager — team results + AI summary
├── my-results/ # ✨ Employee — own results + AI summary + self-assessment
├── nominations/ # Employee + Manager — nominate peers (dept-scoped)
├── results/ # HR Admin — all employee results
├── reviews/ # All roles — pending review list
└── reviews/[employeeId]/ # All roles — 28-question form + AI suggestions
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/callback/credentials |
NextAuth email + password login |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/cycles |
HR Admin | List all cycles |
| POST | /api/cycles |
HR Admin | Create new cycle |
| GET | /api/cycles/list |
HR Admin | Lightweight list for client refresh |
| POST | /api/cycles/[id]/advance |
HR Admin | Advance to next phase; auto-calculates scores at REVIEW→CALCULATION |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/nominations |
All | Get my nominations for current cycle |
| POST | /api/nominations |
Employee | Add a nomination (dept-scoped validation) |
| DELETE | /api/nominations/[id] |
Employee | Remove a nomination |
| GET | /api/nominations/cycle |
All | Returns cycle with effectiveMinNominees / effectiveMaxNominees |
| POST | /api/nominations/submit |
Employee | Submit all draft nominations (effective min enforced) |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/approvals |
Manager / HR | List pending nominations scoped to role |
| POST | /api/approvals/[id]/approve |
Manager / HR | Approve a nomination |
| POST | /api/approvals/[id]/reject |
Manager / HR | Reject a nomination |
| POST | /api/approvals/bulk-approve |
Manager / HR | Approve all pending nominations |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| POST | /api/reviews |
All | Save draft or submit a review |
| GET | /api/reviews/draft |
All | Load existing draft review |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/employees |
HR Admin | List all employees (paginated, filterable) |
| POST | /api/employees |
HR Admin | Create new employee |
| GET | /api/employees/[id] |
All | Get employee by ID |
| PUT | /api/employees/[id] |
HR Admin | Update employee |
| GET | /api/employees/list |
All | Dept-scoped list for nomination peer search |
| GET | /api/employees/managers |
HR Admin | List employees who are managers |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/criteria |
All | List active criteria (for review form) |
| POST | /api/criteria |
HR Admin | Create new criterion |
| GET | /api/criteria/full |
HR Admin | All criteria + questions (for management page) |
| PUT | /api/criteria/[id] |
HR Admin | Edit name/description or toggle active |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| GET | /api/analytics/heatmap?cycleId= |
HR Admin | Dept × criterion scores + allCycles, deptOveralls, trends |
| POST | /api/analytics/report |
HR Admin | Generate AI narrative HTML report (GPT-4o or stub) |
| POST | /api/ai/suggest-comments |
All | Generate AI draft feedback comments from ratings (GPT-4o) |
| POST | /api/ai/theme-summary |
All | Generate AI theme summary from all peer comments (GPT-4o) |
| POST | /api/ai/improvement-plan |
All | Generate AI self-improvement plan with gap analysis (GPT-4o) |
| Method | Endpoint | Role | Description |
|---|---|---|---|
| POST | /api/mcp/write-csv |
All (HITL) | Write approved improvement plan to CSV (called post-approval only) |
| POST | /api/mcp/generate-report |
HR Admin (HITL) | Write approved HTML report to disk (called post-approval only) |
Each review cycle advances linearly through 8 phases. HR Administrator controls all phase transitions.
DRAFT → NOMINATE → APPROVE → REVIEW → CALCULATION → CONSULTATION → ACCEPT → CLOSED
| Phase | Who Acts | What Happens |
|---|---|---|
| DRAFT | HR Admin | Creates cycle with name, dates, criteria |
| NOMINATE | Employee | Selects inbound/outbound peers; manager auto-locked; dept-scoped pool |
| APPROVE | Manager / HR | Approves or rejects individual nominations; bulk approve available |
| REVIEW | Employee | Rates each person on 28 questions (1–5) + 2 comments; AI suggestions available |
| CALCULATION | System | Auto-calculates per-criterion and overall averages (2 d.p.) |
| CONSULTATION | Manager / HR | Results visible to manager and HR; employee sees locked message |
| ACCEPT | Employee | Employee views own results, AI summary, and self-assessment gap analysis |
| CLOSED | HR Admin | Results become read-only historical record; visible in analytics history |
| Category | Features |
|---|---|
| Auth & RBAC | Email + bcrypt login, JWT sessions, role-based route guards, 4 roles |
| Employee Management | Add, edit, deactivate, set manager, 57 seeded employees, 10 departments |
| Review Cycles | Create, 8-phase advance, phase stepper UI, one active cycle enforced |
| Nominations | Inbound/outbound peer selection, manager auto-locked, draft + submit, min/max limits |
| Approvals | Manager approves/rejects per nominee; HR Admin bulk approve; scoped by role |
| Reviews | 28-question form (25 RATING + 2 TEXT + 1 BOOLEAN), draft save, submit lock |
| Score Calculation | Auto-triggers at REVIEW→CALCULATION; per-criterion + overall averages to 2 d.p. |
| Results | Phase-gated: HR+Manager from CONSULTATION, Employee from ACCEPT only |
| Dashboards | Role-specific dashboards with progress rings, action banners, team rosters |
| Feature | Status | Notes |
|---|---|---|
| View / Add / Edit / Deactivate eWay criteria | ✅ Done | Full CRUD with historical preservation |
| AI Comment Suggestions | ✅ Done | GPT-4o generates "doing well" + "improve" draft; reviewer Accepts / Edits / Discards → live HITL |
| AI Feedback Theme Summary | ✅ Done | GPT-4o surfaces top 3 strengths, top 3 growth areas, overall sentiment |
| Department Heatmap | ✅ Done | Colour-coded grid (red→amber→green), org averages, top/bottom panels |
| PDF Report Generation | ✅ Done | AI generates narrative HTML report; human reviews + edits; MCP tool writes to disk post-approval |
| Self-Assessment + Gap Analysis | ✅ Done | Employee self-rates with sliders; AI computes gap vs peer score; labels Overrating/Underrating/Aligned |
| Historical Trend Comparison | ✅ Done | SVG grouped bar chart across all closed cycles; per-criterion org averages compared |
| Bulk employee import (XLSX) | ⬜ Not built | Add Employee UI exists for one-at-a-time entry |
| In-App Notification Bell | ✅ Done | Bell icon in top bar; role-scoped notifications on every phase transition; red unread badge; mark-read per item or bulk; 30 s auto-poll |
| Mobile Responsive UI | ✅ Done | Tested and confirmed — layout adjusts across all screen sizes |
| Calibration View | ⬜ Not built | Department heatmap partially fulfils this requirement |
| System Admin Audit Trail & Platform Dashboard | ✅ Done | Custom SYSTEM_ADMIN role and UI for platform adoption, audit metadata, AI usage, HITL decisions, approval health, and anonymized behavioral analytics |
| Feature | Description |
|---|---|
| AI Self-Improvement Plan | After gap analysis, AI generates a personalised weekly action / monthly goal / success metric per criterion. Human must approve before export. |
| MCP Server (pulse360-mcp) | Custom TypeScript MCP server with write_csv and generate_pdf_report tools, registered in Bob's MCP panel. Invoked only post human approval. |
| Department-Scoped Nominations | Peer selection restricted to same department for non-HR roles — enforced both in the employee list API and nomination POST validation. |
| Small-Department Adaptive Limits | effectiveMinNominees and effectiveMaxNominees auto-calculated from pool size, so teams of 2 can still complete the nomination workflow. |
| Cycle History Selector | Analytics dashboard lets HR choose any historical closed cycle to view, compare, and report on. |
| Pie Chart Visualisation | Pure SVG (no external charting lib) showing each department's share of the org-wide average score. |
| Bulk Approve Nominations | HR Admin can approve all pending nominations with one click (per employee or all at once). |
| CSV Export via MCP | Approved improvement plan written as Excel-compatible CSV via the write_csv MCP tool — human must click Approve first. |
| System Admin Platform Analytics | Dedicated System Admin experience for adoption, login activity, nomination/review completion, approval bottlenecks, anonymized behavioral network patterns, AI token metadata, and AI accept/edit/discard decisions. |
| Audit Trail Events | Captures key operational events such as logins, profile updates, nomination actions, approval/rejection decisions, review submissions, AI generation calls, and human-in-the-loop AI decisions. |
The hackathon rules require minimum 3 HITL interventions. We documented 10:
| # | Type | Description | Outcome |
|---|---|---|---|
| 1 | Architecture Decision | Bob suggested Office 365 SSO (OAuth). Human overrode to email + bcrypt — simpler, no external dependencies, demo-safe | Implemented email + bcrypt auth |
| 2 | Security Review | Bob generated fake bcrypt hashes in seed SQL. Human identified they would fail bcrypt.compare() at login |
Replaced with real hashes generated via script |
| 3 | Code Review | Bob used NextAuth v5 beta which broke Next.js 16 route handler types | Downgraded to NextAuth v4.24.15 |
| 4 | Business Logic | Bob made manager nomination removable. Spec requires manager to be auto-locked | Added isMandatory flag; manager locked in nominations UI |
| 5 | UX Override | Bob allowed review submission with partial ratings. Human enforced: all 28 questions + both comments ≥ 20 chars | Full validation before submit enables |
| 6 | Business Logic | Dept-scoped peer validation missing — Zanele and Dikeledi could not review within-dept peers due to missing pool-size adaptive limits | Added effectiveMinNominees / effectiveMaxNominees across three endpoints |
| # | Feature | HITL Moment | What the Human Decides |
|---|---|---|---|
| 7 | AI Comment Suggestions | Reviewer sees AI-generated "doing well" and "improve" text before saving a review | Accept as-is / Edit / Discard — full control retained |
| 8 | AI Feedback Theme Summary | Employee or manager clicks Generate to surface top 3 strengths and growth areas | Human reads the output and decides how to act on it |
| 9 | AI PDF Report Generation | HR Admin generates AI narrative report → reviews it in a preview pane → optionally edits raw HTML | Must click Approve & Save before MCP tool writes the file |
| 10 | AI Self-Improvement Plan | Employee reviews weekly actions, monthly goals, success metrics → must click I've reviewed this — Approve | MCP write_csv tool only fires after explicit human approval |
IBM Bob was used as the primary development agent throughout the hackathon, playing multiple roles:
| Role Bob Played | Examples |
|---|---|
| Full-Stack Developer | Scaffolded and implemented all Next.js pages, API routes, Prisma schema, and auth |
| Data Architect | Designed 11-table PostgreSQL schema, seeded 57 synthetic employees, modelled 8-phase cycle lifecycle |
| Security Reviewer | Identified bcrypt hash issue, enforced RBAC on every API route, added server-side nomination validation |
| QA / Tester | Ran tsc --noEmit after every change, caught TypeScript errors, validated API contracts |
| AI Feature Developer | Built all 4 AI endpoints (suggest-comments, theme-summary, improvement-plan, report) with GPT-4o + stub fallback |
| MCP Server Builder | Scaffolded, implemented, and registered the pulse360-mcp server with write_csv and generate_pdf_report tools |
| Technical Writer | Generated this README, the executive summary, and inline code documentation |
-
Multi-turn agentic reasoning — Bob maintained context across a full day of iterative feature requests without losing architectural context
-
Human-in-the-Loop orchestration — Using Bob I built HITL checkpoints into the product itself (AI suggestions require human approval before persistence)
-
MCP tool authoring — Using Bob I created a custom MCP server from scratch, registered it, and wired it into the app's approval flow (if you have a starterkit on .git use it)
-
Text generation integration — All four AI features use GPT-5.1 for text generation, with Bob writing the prompts, parsing the responses, and building the stub fallback chain
-
TypeScript discipline — Every change validated with
tsc --noEmitbefore being considered complete -
Parallel task execution — Bob ran independent tasks in parallel (DB clear + API build + MCP build + page rebuild) to compress build time
-
The best part is all this was done with full oversite and guidance from me through prompts and feature tunning.
Registered at .bob/mcp.json. Two tools:
| Tool | Trigger | Guard |
|---|---|---|
write_csv |
User approves improvement plan → clicks Download | Post-approval only; description states "invoke ONLY after user review" |
generate_pdf_report |
HR Admin approves report → clicks Save to Downloads | Post-approval only; description states "invoke ONLY after human review" |
# ── Database ──────────────────────────────────────────────────────────────────
# Check container is running
podman ps --filter "name=pulse360_db"
# Start if stopped
podman start pulse360_db
# Connect to psql
podman exec -it pulse360_db psql -U pulse360_user -d pulse360
# Run a SQL script manually
Get-Content database\init\03_schema.sql | podman exec -i pulse360_db psql -U pulse360_user -d pulse360
# ── App ───────────────────────────────────────────────────────────────────────
# Install dependencies
cd pulse360; npm install
# Development server (http://localhost:3000)
cd pulse360; npm run dev
# Production build check
cd pulse360; npx next build
# Regenerate Prisma client (after schema changes)
cd pulse360; npx prisma generate
# ── MCP Server ────────────────────────────────────────────────────────────────
# Rebuild MCP server after changes
cd pulse360/mcp-server; npm run build
# ── Git ───────────────────────────────────────────────────────────────────────
# Check status
git status
# Push to Bitbucket
git add -A
git commit -m "feat: describe your change"
git push origin mainBuilt with IBM Bob · Pulse360 · Pulse Technologies Hackathon V1 · 2026