Last Updated: January 14, 2026
Location: c:/workplace/cal-runtime
c:/workplace/cal-runtime/
├── .git/ ✅ Git initialized
├── .gitignore ✅ Proper ignores
├── LICENSE ✅ MIT license
├── README.md ✅ Documentation
├── package.json ✅ Configured with scripts
├── tsconfig.json ✅ TypeScript config
├── vitest.config.ts ✅ Test framework setup
│
├── src/ ✅ Directory structure
│ ├── parser/
│ │ └── grammar.pegjs ✅ COPIED (with DRIFT/FETCH)
│ ├── executor/ 📁 Empty (needs code)
│ ├── analyzer/ 📁 Empty (needs code)
│ ├── adapters/
│ │ ├── data/ 📁 Empty (needs code)
│ │ └── alert/ 📁 Empty (needs code)
│ ├── types/ 📁 Empty (needs types)
│ └── utils/ 📁 Empty
│
├── tests/ ✅ Directory structure
│ ├── fixtures/
│ │ ├── tailwind-cascade.cal ✅ COPIED
│ │ ├── closed-loop-pipeline.cal ✅ COPIED
│ │ └── sample-data.json ✅ COPIED
│ ├── parser/ 📁 Empty (needs tests)
│ ├── executor/ 📁 Empty (needs tests)
│ ├── analyzer/ 📁 Empty (needs tests)
│ └── integration/ 📁 Empty (needs tests)
│
├── examples/ 📁 Empty (needs examples)
├── docs/ 📁 Empty (needs docs)
│
└── Documentation Files:
├── PROJECT-STATUS.md ✅ Progress tracker
├── VALIDATION-RESULTS.md ✅ Original validation
├── DRIFT-FETCH-IMPLEMENTATION.md ✅ New features
└── CURRENT-STATUS.md ✅ This file
{
"dependencies": {
"peggy": "^4.0.2" ✅ Parser generator
},
"devDependencies": {
"typescript": "^5.3.3", ✅ TypeScript compiler
"vitest": "^1.2.0", ✅ Test framework
"@vitest/coverage-v8": "^1.2.0", ✅ Coverage
"@types/node": "^20.11.0", ✅ Node types
"eslint": "^8.56.0", ✅ Linter
"prettier": "^3.2.4", ✅ Formatter
"rollup": "^4.9.6" ✅ Bundler
}
}- Location:
src/parser/grammar.pegjs - Status: Fully updated with DRIFT/FETCH
- Keywords: All 10 (FORAGE, DIVE, DRIFT, FETCH, PERCH, LISTEN, WAKE, CHIRP, TRACE, SURFACE)
- Ready to compile with Peggy
tailwind-cascade.cal- UC-002 case studyclosed-loop-pipeline.cal- Full SENSE→ACT pipelinesample-data.json- 4 test entities
- URL: https://github.com/semanticintent/cal-runtime
- Commits: 3 (structure, validation, DRIFT/FETCH)
- Branch: main
| Original File | Target Location | Status |
|---|---|---|
cal.js (282 lines) |
src/parser/index.ts |
❌ Not ported |
lib/executor.js (525 lines) |
src/executor/index.ts |
❌ Not ported |
lib/analysis-engine.js (~300 lines) |
src/analyzer/dimension-scorer.ts |
❌ Not ported |
lib/data-adapters.js (~200 lines) |
src/adapters/data/index.ts |
❌ Not ported |
lib/alert-adapters.js (~150 lines) |
src/adapters/alert/index.ts |
❌ Not ported |
run.js (~250 lines) |
src/cli.ts |
❌ Not ported |
repl.js (~100 lines) |
src/repl.ts |
❌ Not ported |
agent.js (~400 lines) |
Defer to Phase 4 | ⏸️ Later |
Total Lines to Port: ~1,800 lines of JavaScript → TypeScript
The fully functional JavaScript implementation exists at:
c:/workplace/cal/docs/
├── cal.js ✅ Parser working
├── cormorant.pegjs ✅ Grammar (with DRIFT/FETCH)
├── package.json ✅ Dependencies
├── lib/
│ ├── executor.js ✅ All handlers work (including DRIFT/FETCH)
│ ├── analysis-engine.js ✅ 6D scoring works
│ ├── data-adapters.js ✅ JSON/CSV/Memory adapters
│ └── alert-adapters.js ✅ Console/File/Webhook adapters
├── run.js ✅ CLI runner works
├── repl.js ✅ Interactive REPL
├── agent.js ✅ AI integration
├── tailwind-cascade.cal ✅ Test example
├── closed-loop-pipeline.cal ✅ Full pipeline
└── sample-data.json ✅ Test data
Validation Results:
- ✅ Parser: Parses all keywords correctly
- ✅ Executor: Tailwind example runs ($300K → $3M-$4.5M)
- ✅ DRIFT: Gap measurement works (Teaching gap: 50)
- ✅ FETCH: Decision logic works (Score: 1,812 → EXECUTE)
- ✅ Closed-loop: Complete pipeline functional
File to create: src/types/index.ts
What to define:
// AST Types (from grammar)
- Program
- Statement (union of 10 types)
- ForageStatement, DiveStatement, DriftStatement, FetchStatement, etc.
- Condition, Dimension, Duration, etc.
// Action Plan Types
- ActionPlan
- Action (union of action types)
- QueryAction, AnalyzeAction, DriftAction, FetchAction, etc.
// Execution Types
- ExecutionResult
- DriftResult, FetchResult
- CascadeMap, CascadeAnalysis
// Data Types
- Entity, DimensionSignal
- CascadePathway, FinancialImpact
// Adapter Interfaces
- DataAdapter, AlertAdapterWhy start here:
- Types are the contract for everything else
- Other modules import from here
- Helps understand the data flow
- Can write types while planning the port
File to create: src/parser/index.ts
Port from: c:/workplace/cal/docs/cal.js
Key functions:
export function parse(source: string): ParseResult | ParseError
export function toActionPlan(ast: Program): ActionPlan
export function compile(source: string): CompileResultChanges needed:
- Add proper types to all functions
- Handle Peggy types correctly
- Type the action plan transformation
- Add error types
Test immediately:
npm run build:grammar # Compile grammar
npm run build # Compile TypeScript
node dist/parser/index.js # Quick testFile to create: src/analyzer/dimension-scorer.ts
Port from: c:/workplace/cal/docs/lib/analysis-engine.js
Key functions:
export function analyzeCascade(entity: Entity, dimensions: Dimension[], depth: number): CascadeAnalysis
export function scoreDimension(signals: DimensionSignal): number
export function calculateCascadePathways(analysis: CascadeAnalysis, depth: number): CascadePathway[]
export function calculateFinancialImpact(analysis: CascadeAnalysis): FinancialImpactFormulas to preserve:
- 3D Lens:
(Sound × Space × Time) / 10 - Cascade Level: < 15 (Minimal), 15-29 (Low), 30-49 (Medium), 50-69 (High), ≥70 (Critical)
- Multiplier: dimensions × depth → range lookup
- Cascade Probability:
(fromScore / 100) × (toScore / 100)
File to create: src/executor/index.ts
Port from: c:/workplace/cal/docs/lib/executor.js
Key class:
export class Executor {
async execute(actionPlan: ActionPlan, context?: any): Promise<ExecutionResult>
private async handleQuery(action: QueryAction): Promise<any>
private async handleAnalyze(action: AnalyzeAction): Promise<any>
private async handleDrift(action: DriftAction): Promise<DriftResult>
private async handleFetch(action: FetchAction): Promise<FetchResult>
// ... other handlers
}Critical handlers:
- handleDrift - Already working, just port with types
- handleFetch - Already working, just port with types
- handleQuery - FORAGE execution with WHERE filtering
- handleAnalyze - DIVE cascade analysis
Files to create:
src/adapters/data/index.ts(fromdata-adapters.js)src/adapters/alert/index.ts(fromalert-adapters.js)
Interfaces:
export interface DataAdapter {
query(filter: any): Promise<any[]>
get(id: string): Promise<any>
}
export interface AlertAdapter {
send(type: string, message: string, data?: any): Promise<void>
}
export function createDataAdapter(config: any): DataAdapter
export function createAlertAdapter(config: any): AlertAdapterFile to create: src/cli.ts
Port from: c:/workplace/cal/docs/run.js
Make executable:
#!/usr/bin/env node
import { compile } from './parser';
import { createExecutor } from './executor';
// ... CLI logicAdd to package.json:
{
"bin": {
"cal": "./dist/cli.js"
}
}Create test files:
tests/
├── parser/
│ ├── forage.test.ts # Test FORAGE parsing
│ ├── drift.test.ts # Test DRIFT parsing
│ ├── fetch.test.ts # Test FETCH parsing
│ └── errors.test.ts # Test error handling
│
├── executor/
│ ├── drift-execution.test.ts # Test DRIFT handler
│ ├── fetch-execution.test.ts # Test FETCH handler
│ └── forage-execution.test.ts # Test query execution
│
├── analyzer/
│ ├── scoring.test.ts # Test 3D Lens formula
│ └── financial.test.ts # Test multiplier calculation
│
└── integration/
├── tailwind-case.test.ts # UC-002 full test
└── closed-loop-pipeline.test.ts # Full pipeline test
Test pattern:
import { describe, it, expect } from 'vitest';
import { parse } from '../src/parser';
describe('DRIFT parsing', () => {
it('should parse basic DRIFT statement', () => {
const result = parse(`
DRIFT cascade_map
METHODOLOGY 85
PERFORMANCE 35
`);
expect(result.success).toBe(true);
if (result.success) {
expect(result.ast.statements[0].type).toBe('Drift');
expect(result.ast.statements[0].methodology).toBe(85);
expect(result.ast.statements[0].performance).toBe(35);
}
});
});| Phase | Task | Time | Cumulative |
|---|---|---|---|
| 1 | Type definitions | 2h | 2h |
| 2 | Parser port | 1-2h | 3-4h |
| 3 | Analyzer port | 1-2h | 4-6h |
| 4 | Executor port | 2-3h | 6-9h |
| 5 | Adapters port | 1h | 7-10h |
| 6 | CLI port | 30m | 7.5-10.5h |
| 7 | Tests | 2-3h | 9.5-13.5h |
Total: 10-14 hours for complete TypeScript port with tests
npm run build # TypeScript → JavaScript
npm run build:grammar # Grammar → Parser
npm run test # Run all tests
npm run typecheck # Verify typesdist/
├── index.js # Main entry
├── index.d.ts # Type definitions
├── parser/
│ ├── index.js
│ └── grammar.js # Generated parser
├── executor/
├── analyzer/
└── ...
{
"name": "@stratiqx/cal-runtime",
"version": "0.1.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"bin": {
"cal": "dist/cli.js"
}
}- Structure complete
- Dependencies installed
- Grammar updated
- Working reference implementation exists
- Test data ready
- Type-safe runtime
- Better IDE support
- Easier to maintain
- npm-publishable package
- Foundation for products (Playground, PACE, Forage)
- Minimum viable: 6-8 hours (types + parser + executor)
- Production ready: 10-14 hours (includes tests)
- Can be done incrementally (phase by phase)
Start with Phase 1 (Type Definitions) immediately.
Why:
- Types are the foundation
- Takes only 2 hours
- Helps us understand the system better
- Doesn't break anything
- Can be committed and used as reference
Once types are done, we can:
- Port modules one at a time
- Test each module independently
- Commit after each phase
- Have working code at every step
Ready to begin? 🚀
Status checked: January 14, 2026, 6:22 PM