Owner: Luke
| Tokens reported | 1,009,989,029 |
|---|---|
| In / out | 1,005,576,834 in · 4,412,195 out |
| Spend reported | $1,446.30 ≈ €1,242.21 · 83.1% of budget |
| Models named | GLM-5.2 on the pod's RunPod instance; qwen3.6-35b-a3b and faster-whisper served through their own LiteLLM |
Source: Confluence daily report of _2026-08-3 — GLM-5.2 utilisation table, 7 days counted once each (the reports are cumulative, so only the latest is used). These are the pod's own figures, not measurements by this assessment. Cap: €1,500 per pod.
| Hours stated | not reported |
|---|---|
| Commits | 458 across 6 repo(s), 5 authors |
| Active days | 14 days, 2026-08-16 to 2026-08-31 · busiest 2026-08-27 (98) |
| Commits inside the 3-hour window | 21.0% |
Bare git repositories with full history, so commit timing is verifiable — but a commit is not an hour. The profile below bounds when work happened, not how long it took.
A commit is not an hour and a commit count is not effort. This bounds when work happened, not how long it took, and no score is derived from it.
The strongest individual prompt documents sit next to the weakest evidence trail. The in-repo artifacts are genuinely good: prompt.md and APP_GENERATION_PROMPT.md carry hard constraints (exact stack, 'Do not use Vite', 'Do not create mock APIs', forbid hardcoded secrets, lint/build must pass) and are the most directly reusable prompts any pod submitted; FULL_PROMPT is a serious 673-line master spec iterated to version 8 by 20 Aug. But almost none of it is a record of actual sessions. The .junie history's own header says its 23 prompts were 'written as natural human developer questions' and it stops on 20 Aug though backend work ran ten more days; the Confluence prompt library, created 30 Aug, states its activity log was 'reconstructed... not a verbatim transcript'; and every one of its 21 library prompts exports as an empty '[code block]' placeholder, so the library's actual text is not in the submission. Honesty lives in the retrospective (the '30-40% problem', 3.5 days of rework from unshared prompts) rather than in the prompt logs, which is honest about outcomes but leaves iteration invisible.
submissions/pod2-conviction/repo/ngaige-mno-portal/prompt.mdsubmissions/pod2-conviction/docs/confluence/2024800260_AI_Prompt_Library_and_Prompt_Logs.mdsubmissions/pod2-conviction/repo/ngaige-be-app/.junie/prompts_history.mdAssessed separately from the twelve categories: the trial's question was how each pod worked with models, and the prompts are the record of that.
Things a reader would want to know. Not findings against the submission and not scored — questions, oddities and loose ends.
submissions/pod2-conviction/docs/confluence/2024800260_AI_Prompt_Library_and_Prompt_Logs.mdsubmissions/pod2-conviction/docs/confluence/2024800260_AI_Prompt_Library_and_Prompt_Logs.mdsubmissions/pod2-conviction/docs/confluence/1987477532_AUTOMATED_AI_SESSION_LOG.mdsubmissions/pod2-conviction/repo/ngaige-be-app/.junie/prompts_history.mdsubmissions/pod2-conviction/docs/confluence/2023849987_AI-First_Development_Experiment_Pod_Retrospective.mdsubmissions/pod2-conviction/docs/confluence/2023849987_AI-First_Development_Experiment_Pod_Retrospective.md| Repository | gitea.ngaige.haud.report (6 repos, tarball received 31 Aug) |
|---|---|
| Received | repos 31 Aug 10:30 CEST · Confluence workspace retrieved 31 Aug 12:30 CEST |
Unchanged — mechanisms exist for all six items and the code findings stand: F honours an unsubscribe web link rather than the STOP keyword (BUGS item 41, 26 Aug, now shows this was a deliberate product decision — 'The system should include the unsub link'), cost per campaign is absent (EnterpriseService.java:581-585 hardcodes zeros, and BUGS item 72 confirms credit-per-SMS is miscalculated), and scheduling never fires (BUGS item 75, still marked incomplete: 'we need to have at least 1-Time schedules Broadcast working'). The pod's own 28 Aug testing corroborates the mechanism for F ('OPT out is successfully working', item 70) and records that delivery reports were initially not delivered (item 69, later marked complete). Live end-to-end behaviour still could not be exercised here.
Add an inbound MO webhook that treats a STOP reply as an opt-out (or get the deviation formally accepted), finish the one-time scheduled broadcast, and compute per-campaign cost from dispatch logs instead of the hardcoded zeros.
C and F are refusal properties — the system must decline to do something. A demo can look perfect with the mechanism absent, so these are probed adversarially rather than asked about.
Unchanged — defensible choices throughout: Spring Boot modular monolith with pluggable channel and SMS-gateway adapters, Flyway, Redis state cache, OpenAI-compatible client against their own LiteLLM, and an infra estate that would survive a six-month review. The Confluence infrastructure pages (8 maintained pages, versions 8-10, created 20-23 Aug) confirm the host-communication design was documented as it was built. Weak spots stand: fat Telegram handler classes and a SCHEDULED state with no executor behind it.
Split the Telegram handlers into flow-specific services and either implement or delete the SCHEDULED execution path so the state machine matches reality.
Novelty is not a virtue here. Boring and correct beats clever and unexplained.
Unchanged — consistent style, sensible enums/DTOs, validation at the onboarding boundary, and a green suite make routine change safe, but handleBroadcastExecution (CampaignCommandHandler.java:637-693) still fetches any campaign by ID with no ownership check or status precondition, ReportCommandHandler.java:55-71 has the same cross-tenant read, and exceptions are swallowed in several handlers. Nothing in the Confluence record contradicts or acknowledges these.
Add a campaign.getClientId().equals(client.getId()) guard plus a status precondition (only DRAFT/APPROVED may dispatch, never DISPATCHED again) at the top of handleBroadcastExecution and the report handler.
Volume earns nothing. A small codebase that does the six things beats a large one that does four.
Unchanged in score — 143 backend unit tests verified green, strong onboarding coverage, honest xfail-annotated QA execution logs; still no test proving opt-out-then-second-send or approval-gate refusal. The Confluence 'Tests and Verification Evidence' page (30 Aug) claims 46 passing React Testing Library tests for the MNO frontend and green builds across repos, and the retrospective admits plainly that the final QA cycle was never executed (tester unavailable in week 3) — that admission is credited under candour, but the frontend test claims were not run here and cannot move this score.
Add one test that unsubscribes a subscriber via token, runs dispatchCampaignWithMetrics again, and asserts the MSISDN is absent from the gateway calls, plus one asserting a DISPATCHED or cross-tenant campaign ID is refused.
Coverage percentage is not read. A single test that proves STOP excludes on the next send is worth more than 80% line coverage.
Unchanged — ngaige-product-deploy remains a genuine clone-to-running runbook backed by CI auto-deploy with health verification; the retrospective corroborates it honestly ('runnable, deployable' per the 28 Aug Kevin sync, 'though tested only locally behind VPN', not production-ready on security/certificates/scaling). Could not be executed here, and the runbook's reproducibility still partly rests on the committed live .env.
Replace the committed .env with a documented secret-provisioning step so the runbook works without shipping live credentials in git.
This is scored by doing it. The result is binary and unkind: either the written steps produced a running system or they did not.
Raised from 5: the 113-page Confluence space closes most of the handover gap — a 29.6k-char PRD, 8 maintained infrastructure pages, PWA and MNO-portal developer documentation (created 26 Aug, during the build), ten LLDs, a QA execution guide with a new-engineer setup section, a Telegram-bot delivery/handover report mapping acceptance items to code locations, a user manual, and a project synopsis distinguishing charter items from extras. HAUD could now take over infra and most of the product without the pod in the room. Held from 8 because the product repos' READMEs remain near-empty (the documentation lives off-repo), the seven-point submission document still does not exist as such, and the LLDs were generated in a single AI pass on 30 Aug.
Mirror the Confluence developer docs into each repo's README (even as links plus a one-page summary) and assemble the seven-point submission document from the synopsis and retrospective, which already contain most of its content.
The bar is the client-bound mainline: would you hand this to someone who has never met the authors?
Raised from 6: on top of the 3,335-line portal prompt suite and 23 timestamped backend prompts, the Confluence record supplies a real A/B payload — a 13-pattern prompt library with a dated activity log (10-28 Aug, honestly labelled 'reconstructed... not a verbatim transcript'), daily per-user per-model token telemetry, and a retrospective that analyses how the pod actually worked with models: the '30-40% problem' of AI-reported-but-unapplied fixes, the fragmented-prompting root cause costing 3.5 days of rework, the PWA-in-one-hour full-prompt experiment as a controlled comparison, and a GLM/Qwen/GPT-OSS model comparison. Held from 9 because the AUTOMATED_AI_SESSION_LOG remained an unfilled template, the backend .junie history still stops on 20 Aug, and the per-session kept-vs-redone record exists only at project level.
Populate the session-log template you designed on 13 Aug — even a few real entries per week would turn the reconstructed activity log into a verbatim record.
This is the whole point of the trial. A pod that shipped well but cannot show how it used AI has answered the wrong question.
Raised from 6: the Confluence record supplies contemporaneous cadence the repos could not — page creation dates spread 13-31 Aug, daily reports auto-published the following morning (the 17 Aug report was created 18 Aug), the BUGS page created 26 Aug and versioned 31 times, dated meeting journals for most working days with attendees, achievements and difficulties, and decisions recorded where they were made (e.g. the activation-date logic ruling inline in BUGS items 59-60). The journal pages are meeting minutes rather than the strict rule-6 format (no per-day kept/redone or impediment time-lost fields; the retrospective covers those at project level), several dated entries for 11-21 Aug were backfilled on 25-26 Aug from recordings, and no repo carries a freeze tag.
Tag the freeze commit in each repo, and next time capture the rule-6 fields (kept/redone, impediment category-owner-time-lost) in the daily page rather than reconstructing them at the end.
Entries dated across fifteen days read differently from fifteen entries committed on the last afternoon. The git history shows which.
Raised from 4: a known-issues record now clearly exists and it is honest. The BUGS page logs 40+ defects against their own system including 'We do not have delivery reports (this is part of the charter requirement)' and the still-open scheduling failure; the retrospective names the pod's biggest failure itself (fragmented prompting, 3.5 days of rework), quotes members admitting problems, concedes the 3h/day charter 'was not followed' with 'zero visibility into actual effort', discloses the unexecuted final QA cycle, states 'not production ready' on security, and records the 21 Aug external-AI compliance incident and its correction. Held from 9 because the sharpest risks in this submission — the committed .env, the ngrok authtoken, the cross-tenant IDOR — are disclosed nowhere in the pod's own record, and the honesty is scattered across pages rather than gathered into the required self-assessment.
Write the self-assessment as one document and have it name what the retrospective missed: the committed credentials, the ngrok token, and the missing ownership checks on dispatch and reporting.
A submission that names its own gaps is more trustworthy than one that claims six of six. Overclaiming found by probe is scored here, and it is the most damaging single finding a submission can carry.
Unchanged — product runtime on self-hosted qwen3.6-35b-a3b and faster-whisper via their own LiteLLM (application.yaml:64-68), dev/QA on GLM-5.2-int4 on RunPod, no third-party model found in product source, and the daily reports now confirm the story with per-key per-model token counts. Two new mentions are cited as questions per rule 2, not as findings: the 25 Aug demo notes list 'models used (Whisper, GLM, Gemini)' for the Telegram bot, and the 21 Aug minutes record 'AI usage compliance issue — Akhilesh using external AI. Luke mandated: stick to pod GLM' — a dev-side incident the pod disclosed and corrected itself.
State explicitly in the submission doc which model served each product path, and address the Gemini mention in the 25 Aug demo notes head-on.
Newest is not best. The scored question is fit and boundary, not leaderboard position. A pod that ran a mid-tier open model well scores above one that reached for a frontier API it was not permitted to use. A rule-2 breach is a finding here regardless of how good the output was.
Raised from 6: the figures the repos lacked are now delivered and they reconcile. The $1,740 tracker budget is the €1,500 cap expressed in USD (€1,494.47 at the 28 Aug ECB rate of 0.85889, €1,500.91 at the 17 Aug rate — the fixed USD figure straddles the cap by under a euro either way). Actual consumption was $1,446.30 ≈ €1,242.21, 83.1% of budget and comfortably inside €1,500; top-ups of $1,550.00 minus the $103.45 remaining balance match consumption to within rounding, and ~€10 of Infobip SMS spend is disclosed in the retrospective. The record is per-day, per-service, dual-currency at dated ECB rates, with GPU utilisation and $/1M-token efficiency analysed against it ('heavy AI usage does not automatically translate to working output'). Held from 9 because the Infobip spend appears only in retrospective prose rather than the financial log, token telemetry starts 17 Aug, and the 3h/day effort budget was — by their own admission — never tracked.
Add the Infobip line to FINANCIAL_LOGS and snapshot the final daily report into the repo so the spend story travels with the code.
Underspending is not virtue and overspending is not vice; an exhausted budget is a workflow finding, not a failure. What is scored is whether the pod knew where the money went and can show it. A pod that spent the full cap and can account for it scores above one that spent half and cannot.
Unchanged — real controls (default-on JWT interception, webhook secret validation, rate limiting, network-isolated data tier, two-layer opt-out) remain undermined by live credentials committed to git (full .env in ngaige-product-deploy; ngrok authtoken in README.md:125, commit 94a014b), cross-tenant IDOR on dispatch and reporting, an unauthenticated DLR webhook, and no consent capture on recipient upload. The Confluence record confirms security was consciously deferred ('Security and non-functional requirements deferred', retrospective §8) but discloses none of these specific findings, so the score stands.
Rotate every credential in the committed .env and the ngrok token today, purge them from history, and add the missing ownership checks and a DLR webhook shared-secret.
A campaign platform that leaks a recipient list or ignores an opt-out is not a product, whatever else it does well.
| Category | Item | Where | Note |
|---|---|---|---|
| efficiency | Spend inside the EUR 1,500 cap, reconciled | docs/confluence/2025586690_2026-08-30_-_Daily_Report.md | Budget $1740.0 ≈ €1494.47 at ECB 0.85889 — the €1,500 cap in USD. Spent $1446.3 ≈ €1242.21 (83.1%). Top-ups $1,550.00 (1988755457_FINANCIAL_LOGS.md, 9 dated transactions) minus $103.45 balance ≈ consumption. Per-day GPU/CPU/storage in USD and EUR back to 13 Aug. |
| efficiency | Non-RunPod cost disclosed | docs/confluence/2023849987_AI-First_Development_Experiment_Pod_Retrospective.md | 'Budget: $1,740 (RunPod GPU) + €10 (InfoBip SMS)' and 'Cost efficiency: Within budget'. Infobip pay-as-you-go ~€0.06/SMS, funded 24 Aug per the recap. Not itemised in FINANCIAL_LOGS. |
| efficiency | Per-model token telemetry, daily | docs/confluence/2015854593_2026-08-25_-_Daily_Report.md | Per LiteLLM key, per model, per day: e.g. awais-dev 162,382,839 tokens in on glm-5.2-int4-int8mix on 25 Aug; qwen3.6-35b-a3b broken out separately. GLM-5.2 pod utilisation with busy % and $/1M tokens. Coverage starts 17 Aug. |
| candour | Charter shortfalls disclosed in the pod's own bug log | docs/confluence/2018902035_BUGS.md | Item 69 (28 Aug): 'We do not have and delivery reports. (this is part of the charter requirement)... nothing is ever sent' — later marked complete. Item 75 (open): scheduling not working. Item 70: 'OPT out is successfully working'. Page created 26 Aug, version 31. |
| candour | Self-critical retrospective with named failures | docs/confluence/2023849987_AI-First_Development_Experiment_Pod_Retrospective.md | Names fragmented AI prompting as the biggest self-identified failure (3.5 days rework), admits 'zero visibility into actual effort; no evidence of 3hrs/day compliance', unexecuted final QA, 'not production ready' on security, and the 30-40% AI-reported-but-unapplied-fix problem, with attributed quotes. |
| acceptance | STOP-vs-link was a documented product decision | docs/confluence/2018902035_BUGS.md | Item 41 (26 Aug): bot was suggesting STOP replies; ruling was 'The system should include the unsub link'. Consistent with CampaignRecommendationService.java:134 instructing the model not to write 'Reply STOP'. A decision, but still a deviation from item F as written. |
| process | Contemporaneous cadence partly verifiable via Confluence metadata | docs/confluence/_index.json | 113 pages with createdAt and version numbers spread 13-31 Aug: daily reports created next morning (17 Aug report created 18 Aug, v12), BUGS created 26 Aug. Caveat: several dated journal pages for 11-21 Aug were created 25-26 Aug (backfilled from meeting recordings), and later versions may postdate creation. |
| model_choice | External-AI incident disclosed and corrected; Gemini mentioned in demo | docs/confluence/2026405895_NGAIGE_POD_2_Full_Project_Recap_Progress_Timeline_11_30_Aug_2026_.md | 21 Aug: 'AI usage compliance issue — Akhilesh using external AI. Luke mandated: stick to pod GLM, document everything.' 25 Aug demo notes list Telegram bot 'models used (Whisper, GLM, Gemini)'. Mentions cited per rule 2 for a human to rule on; product source greps found no third-party model. |
| ai_usage | Prompt library and reconstructed activity log | docs/confluence/2024800260_AI_Prompt_Library_and_Prompt_Logs.md | 13 reusable prompt patterns plus a dated activity log 10-28 Aug, honestly labelled 'reconstructed... not a verbatim transcript'. Complements the 3,335-line portal prompt suite (ngaige-mno-portal/APP_GENERATION_PROMPT.md) and 23 timestamped backend prompts. |
| documentation | Delivery/handover documentation set | docs/confluence/2026668040_NGAIGE_Telegram_Bot_Integration_-_Delivery_Handover_Report.md | Maps acceptance items to code locations, validation steps, models used, and limitations. Alongside: PRD (2006221036), 8 infra pages, PWA and MNO developer docs (created 26 Aug), 10 LLDs (single AI pass, 30 Aug), QA execution guide with new-engineer setup (2014412855), user manual, pod-to-pod handover checklist (template, unfilled). |
| acceptance | Opt-out excluded at query time on every dispatch | repo/ngaige-be-app/src/main/java/com/haud/ngaige/service/broadcast/MultiChannelBroadcastDispatcher.java:42 | findByClientIdAndIsOptedOutFalse selects the target list; SmsBroadcastAdapter.java:82 re-checks getIsOptedOut() per subscriber at send time. Pod's own 28 Aug testing (BUGS item 70) corroborates the behaviour live. |
| testing | Full unit suite verified green | repo/ngaige-be-app/src/test | ./mvnw test in an eclipse-temurin:25 container: Tests run: 143, Failures: 0, Errors: 0. No test covers opt-out-then-second-send or approval-gate bypass. Confluence claims 46 passing frontend RTL tests (30 Aug) — not run here. |
| security | Live ngrok authtoken committed deliberately | repo/ngaige-product-deploy/README.md:125 | 49-char NGROK_AUTHTOKEN plus reserved domain, added in commit 94a014b 'fix: update ngrok credentials in README'. Not disclosed anywhere in the 113 Confluence pages. |
| security | Committed .env with live stack secrets | repo/ngaige-product-deploy/.env | Real-shaped REGISTRY_TOKEN, Postgres/Redis passwords, JWT_SECRET, OPENAI_API_KEY (LiteLLM), SMTP_PASSWORD, INFOBIP_API_KEY, TELEGRAM_BOT_TOKEN and secret tracked in git history. Liveness not tested. Prompt-library page asserts no secrets went into prompts; the repo record is the counterpoint judges should weigh. |
| security | Cross-tenant IDOR on dispatch and report | repo/ngaige-be-app/src/main/java/com/haud/ngaige/service/telegram/handler/CampaignCommandHandler.java:657 | campaignRepository.findById(campaignId) with no clientId comparison; 'campaign_broadcast:<anyId>' typed by any ACTIVE client dispatches any campaign. Same pattern in ReportCommandHandler.java:70. Undisclosed in BUGS or the retrospective. |
| model_choice | Product runtime on self-hosted open weights | repo/ngaige-infra/ngaige-host/product/.env.example:37 | OPENAI_BASE_URL=https://litellm.ngaige.haud.report/v1, OPENAI_MODEL=qwen3.6-35b-a3b, TRANSCRIPTION_MODEL=faster-whisper-medium. Greps for third-party API models across product source came back empty. |
Raised by the assessment, not answered by it. Each is a thing a reader of the submission would reasonably ask.
Checks that could not run. Recorded as unverified, never counted as failures.