DIAL — Delivery Intelligence Assessment Levels — authoritative technical reference
← Back to Documentation Hub| Layer | Technology |
|---|---|
| Framework | Angular 19.2 (standalone components, no NgModules) |
| Language | TypeScript, SCSS |
| Backend | Firebase 11 (Auth, Firestore, Hosting, Functions) |
| Angular/Firebase | @angular/fire 19.2 |
| AI | @anthropic-ai/sdk via Cloud Functions (claude-sonnet-4-6) |
| Charts | Chart.js 4.5 + ng2-charts 5 (radar charts) |
| PDF Export | jsPDF 2.5 + jspdf-autotable 3.8 |
| Markdown | marked 12 |
| State | RxJS 7.8 (no NgRx) |
| Testing | Karma/Jasmine (unit) |
| CI/CD | GitHub Actions + Workload Identity Federation |
| Runtime | Node.js 20 |
Lazy-loaded routes. Guards: authGuard and role-based guards for admin vs. member access.
RxJS observables + Firestore as single source of truth. Services are providedIn: 'root' singletons.
| Service | Responsibility |
|---|---|
AuthService | Sign-in/up, user profiles, org join workflow |
AssessmentService | Assessment CRUD, scoring, capability responses |
OrganizationService | Org/team CRUD, member management, invite codes |
AiService | Wraps Cloud Functions for AI assessment and chat |
PdfExportService | jsPDF-based assessment result export |
InsightsService | Org-level insights and aggregation |
/dora-tma/ ├── src/app/ │ ├── components/ # UI components (auth, assessment, dashboard, org) │ ├── services/ # Core services (auth, assessment, org, AI, PDF) │ ├── models/ # Data models │ ├── guards/ # authGuard, role-based guards │ └── app.routes.ts # Lazy-loaded routes ├── functions/src/index.ts # 4 AI Cloud Functions ├── .github/ │ ├── workflows/ # CI/CD workflows │ └── agents/ # AI agent instruction files ├── firestore.rules # Security rules └── firebase.json # Hosting targets (dial-app + docs)
20 capabilities across 4 categories, each assessed at 3 maturity levels: Emerging, Advancing, and Leading.
| Collection | Purpose |
|---|---|
userProfiles | Extended user data (name, role, isAdmin, orgId) |
organizations | Org metadata, settings, invite codes |
teams | Team groupings within organizations |
capabilities | Capability definitions and maturity level descriptors |
assessments | Assessment sessions (org-scoped, status, participants) |
capabilityResponses | Individual capability ratings per assessment |
assessmentResults | Aggregated scores and maturity profiles |
invites | Invite tokens for org/team membership |
orgInsights | AI-generated org-level insights |
| Setting | Value |
|---|---|
| Project ID | dora-tma |
| App site | https://dial-assessment.web.app |
| Docs site | https://dial-docs.web.app |
| Hosting targets | dial-app (Angular SPA), docs (this site) |
| Auth | Email/password |
| Functions runtime | Node.js 20 |
| Service account | firebase-adminsdk-fbsvc@dora-tma.iam.gserviceaccount.com |
| Function | Description |
|---|---|
assessCapability | Takes capability ID and team responses, generates AI maturity assessment |
generateRecommendations | Generates prioritized improvement recommendations for a capability |
chatAboutRecommendations | 3-turn conversation per capability, turn-aware guidance |
generateInsights | Org-level synthesis across all capabilities |
All functions use claude-sonnet-4-6. ANTHROPIC_API_KEY set via gcloud run services update --update-env-vars (not firebase.json secrets).
5-job workflow on push to main (skipped if [skip ci] in commit message):
| Job | What it does |
|---|---|
version | Semantic versioning from conventional commits |
build | Node 20, npm install, npm run build:prod |
deploy | firebase deploy --only hosting,firestore,functions via WIF auth |
release-notes | AI-generated via Claude API (grep fallback) |
create-release | Git tag + GitHub Release |
Workflow source: .github/workflows/deploy-and-release.yml
| Layer | Tool / Action | Version / Pin | Purpose |
|---|---|---|---|
| CI Orchestration | GitHub Actions | Hosted | Runs pipeline jobs on push to main |
| Runner OS | ubuntu-latest | Hosted image | Executes all workflow jobs |
| Git Checkout | actions/checkout | v4 | Checks out repository and tags |
| Node Runtime Setup | actions/setup-node | v4 (NODE_VERSION=20) | Provisions Node.js and npm cache |
| Package Manager | npm | npm install strategy | Installs app and functions dependencies |
| Build Artifact Handling | actions/upload-artifact + actions/download-artifact | v4 | Transfers Angular build output between jobs |
| Firebase CLI | firebase-tools | 13.15.2 (pinned) | Deploys Hosting, Firestore, and Functions |
| Cloud Auth | google-github-actions/auth | v2 | Exchanges GitHub OIDC for GCP access token (WIF) |
| Cloud SDK | google-github-actions/setup-gcloud | v2 | Provides gcloud in deploy job |
| Deployment Target | Firebase (hosting,firestore,functions) | Project dora-tma | Ships app, security rules/indexes, and functions |
| Release Notes AI | Anthropic Messages API via curl | claude-sonnet-4-6 | Generates categorized release notes |
| Release Publishing | GitHub CLI (gh) | runner-provided | Creates Git tag and GitHub Release |
The release-notes job calls the Anthropic API directly via curl to generate human-readable release notes from the commit log:
| Property | Value |
|---|---|
| Model | claude-sonnet-4-6 |
| Input | Conventional commit log for the release (feat:, fix:, perf:, docs:, refactor:) |
| Output | Categorized markdown: Features, Bug Fixes, Performance, Documentation, Refactoring |
| Fallback | Shell grep/sed pipeline renders the same section structure if API call fails |
| Secret | ANTHROPIC_API_KEY GitHub Actions secret — CI only, never deployed to runtime |
The final release notes are written to release-notes.md and passed to gh release create in the create-release job.
Beyond CI automation, Claude Code (Anthropic's AI coding assistant) is used interactively throughout development:
feat:, fix:, docs:, etc.), ensuring consistent style and accurate version bumping.github/agents/*.agent.md files written and updated by Claude CodeClaude Code is configured via CLAUDE.md (Claude Code-specific instructions) and AGENTS.md (universal AI assistant instructions shared with other tools like Copilot and Cursor).
Key settings: npm install (not npm ci), NODE_TLS_REJECT_UNAUTHORIZED=0, Firebase Tools pinned to v13.15.2, WIF authentication.
npx ng serve --configuration production --port 4201 # App: http://localhost:4201
firebase emulators:start # Emulator UI: http://localhost:4000
| File | Purpose |
|---|---|
package.json | Dependencies + npm scripts |
angular.json | Build config, lazy loading, budget limits |
firebase.json | Hosting targets, Firestore config, emulator setup |
firestore.rules | Security rules |
src/main.ts | Bootstrap with Firebase providers |
src/app/app.routes.ts | Route definitions with lazy loading |
functions/src/index.ts | 4 AI Cloud Functions |
.github/workflows/deploy-and-release.yml | Main CI/CD pipeline |
docs/ | Static docs site (DIAL hub, architecture) |