new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
Forecast Dubai retail demand from events, weather and holidays; plan promotions against it; measure the lift.
MarketingPython · TypeScriptGitHub @krish2105OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Demand-aware promo planning for Dubai retail. Events, weather, holidays and
school calendars drive footfall. MAWSIM forecasts that demand per store zone,
lets a bounded agent crew plan promotions and creatives against the forecast,
checks every claim against brand and food-advertising rules with citations, and
then measures incremental lift rather than clicks.
Built for SP Jain MAIB Term 4, AI 208 AI in Marketing. Owner: Krishna Mathur.Read the full README ↗Demand-aware promo planning for Dubai retail. Events, weather, holidays and school calendars drive footfall. MAWSIM forecasts that demand per store zone, lets a bounded agent crew plan promotions and creatives against the forecast, checks every claim against brand and food-advertising rules with citations, and then measures incremental lift rather than clicks.
Built for SP Jain MAIB Term 4, AI 208 AI in Marketing. Owner: Krishna Mathur.
The brand is fictional
SIDRA (سدرة) is an invented Dubai speciality coffee and bakery chain with four locations. It is not a real company, and nothing here is a claim about any real business. The footfall and point-of-sale figures it is planned against are generated by a seeded model in
pipeline/footfall.py.FootfallRecordcannot be constructed withoutsimulated=True, the database column isNOT NULL CHECK (simulated = 1), and every API response and every chart says so. A real pilot replaces that dataset with an actual export; nothing else in the system changes.
The chart on the lower right is the argument. Four sites, one axis, evening footfall against apparent temperature. Marina Walk — 54% of its seats outdoors — falls away as the evening heats up. Al Barsha, fully enclosed, barely moves. All four sit in neighbouring ERA5 grid cells, so they get the same weather: what differs is how they respond to it, and that is why demand is forecast per site rather than per brand.
That elasticity is not written into the simulator. It is derived from the
seat counts in data/brand/sidra.yaml, so the measured result — Marina Walk
2.4× more temperature-sensitive than Al Barsha, with the ordering across all
four sites matching their outdoor share exactly — is emergent rather than
assumed. Change the seat counts and it follows.
Captured from a local run against a built database. Regenerate with
cd apps/web && node scripts/screenshots.mjs.
| Application | https://uplift-mawsim.vercel.app |
| API | https://mawsim-api.onrender.com — /docs · /healthz |
| Verify it | LIVE_API_URL=https://mawsim-api.onrender.com LIVE_WEB_URL=https://uplift-mawsim.vercel.app make smoke-live |
All fifteen tabs serve measured data. The seven live checks pass: the API answers, no dataset is empty, the page carries the disclaimer, the web app reaches the API across origins, every tab is present, the Security tab carries the red-team result rather than the scorecard alone, and the instance grants no Admin — fail-closed asserted against the real URL rather than inferred from the code.
The API sleeps after fifteen minutes idle, so the first request after a
quiet period takes about fifty seconds while the free instance wakes. For a
live demo, open /healthz a minute
before you start. Every page renders an honest "API unreachable" state in the
meantime rather than an empty chart.
Three failures reached production and were caught by things built to catch them.
The database went to /tmp and vanished. Render's build and its runtime are
different containers. The four pipelines ran, wrote a complete database, and
threw it away. /healthz reported degraded and named all five empty datasets
on the first request — which is the entire reason it reports what is loaded
rather than only that the process is up.
A global gitignore was hiding a required input. ~/.gitignore_global
excludes data/raw/ for every repository on the machine, so the curated events
seed was never committed. git status was clean, the file was on disk, and
nothing inside the repository revealed it. tests/invariants/test_repo_is_complete.py
now asserts that every input the project needs to rebuild itself is tracked.
The forecast endpoint fitted models per request — ninety seconds on a 512 MB instance. The horizon is precomputed at build time and served as data; the endpoint went to 21 ms.
docs/datasets.md with its URL, the date it was verified
by fetching it, and its licence. The sources that refused are recorded
there as prominently as the ones that worked, because which sources refused is
part of what shaped the design.docs/results/. Not as a promise —
tests/test_docs_match_results.py extracts the figures quoted in
docs/models.md and fails if they disagree with the JSON that produced them.Every tab renders measured output. None is a scaffold.
| Group | Tabs |
|---|---|
| Plan | Season (3D terrain + map) · Forecast · Plan · Segments |
| Make | Creatives · Brand · Compliance · Panel |
| Prove | Measure · Experiments · Report |
| System | Ask · Crew · Data · Security |
| Claim | Evidence | Result |
|---|---|---|
| Forecast beats seasonal naive | python scripts/run_phase_b.py | 36/36 site-weeks, MAE 28–34% lower — B1 |
| An injected lift is recovered | same | all 5 checks within 2.61 pts of a 5-point tolerance — B4 |
| Segments survive resampling | same | 91.8% keep their segment — B2 |
| The allocator finds the optimum | same | KKT marginal spread ~0 — B3 |
| Compliance catches violations in three languages | python scripts/run_phase_c.py | recall 100% worst language, precision 100% — C1 |
| Weather history is complete | python -m pipeline.weather --verify | 18,048 hours per site, no gap over 3 h — A4 |
| Islamic dates reproduce UAE observances | python -m pipeline.calendar --verify | all four 2025 observances matched — A5 |
| Events are curated and say so | python -m pipeline.events --verify |
uv sync --extra dev
cd apps/web && npm install && cd ../..
make etl # build the datasets — weather and events reach the network, cached to data/raw/
uv run python scripts/run_phase_b.py # forecast, segments, allocator, uplift
uv run python scripts/run_phase_c.py # compliance and panel
uv run python scripts/build_report.py # the AI 208 artefact, from docs/results/
uv run python scripts/red_team.py # 34 attacks against the safety claims
make check # the green bar: ruff, pytest, contrast, palette, red team, placeholders, typecheck
make e2e # Playwright; starts both servers itself
make api # http://localhost:8000/docs
make web # http://localhost:3000
| Path | What lives there |
|---|---|
services/api/ | FastAPI service: dataset registry, series endpoints, brand kit loader |
pipeline/ | The four ETLs — weather, calendar, events, footfall — each with --verify |
apps/web/ | Next 16 application: fifteen tabs, three languages, two registers |
data/brand/sidra.yaml | The single source of truth for the fictional brand |
docs/results/ | Every measured number, written by a script |
docs/datasets.md · docs/models.md | What the data is, what the models are, and why |
docs/directions.md | The three design directions that were built, and which one was chosen |
docs/artefacts/ | The AI 208 report (markdown + docx), deck outline, 15 viva answers, three-minute demo script, and a notebook that re-runs the numbers |
scripts/red_team.py | The 34 attacks, run inside make check |
Stated here rather than discovered by a reader.
date_confidence: annual_window.clause_verified: false, the generated brand PDF prints "clause unverified"
beside each, and no clause text is written from memory. A citation that looks
verified and is unsourced is worse than one that admits what it is.assumed: true./admin/tokens/revoke refuses an id immediately, though that set is process
memory and clears on restart./admin/roles answers which
state the instance is actually in rather than leaving this paragraph to go
stale. Either way an anonymous caller is a Viewer, and the live checks assert
that rather than asserting the mode.MAWSIM produces a marketing plan and a compliance opinion for a fictional brand as coursework. It is not legal advice, not regulatory clearance, and not a substitute for real customer research. Its persona panel simulates reactions; it does not observe them.
245 instances, no row claiming a verified date — A6 |
| Sites respond differently to weather | python -m pipeline.footfall --verify | slope ordering matches outdoor-share ordering — A7 |
| The embedding model is fit for trilingual retrieval | python scripts/spike_embeddings.py | bge-m3 +0.447/+0.318 margin; nomic-embed-text disqualified — A9 |
| Text and UI meet WCAG in both registers | node apps/web/scripts/check-contrast.mjs | 38 pairs measured, including the inverted pressed-toggle composite — A2 |
| Chart series and verdicts are distinguishable | node apps/web/scripts/check-palette.mjs | six checks per register plus the zone rule, deuteranopia included — A10 |
| The shell is responsive, accessible and RTL-correct | make e2e | 78 Playwright tests, no serious axe violation on any tab in either register |
| No agent can reach the outside world | pytest tests/invariants | every route is a GET; the crew's side-effects column is none on every row |
| Retrieval answers what it can and refuses what it cannot | python scripts/spike_retrieval.py | 6/8 in-domain answered, 10/10 out-of-domain refused — C2 |
| The 3D scene holds its frame budget | npx playwright test frames.spec.ts | median 60 fps, 95th percentile 30 — D1 |
| The deployed pair is what it claims to be | python scripts/verify_deploy.py | 10/10 checks, including that no anonymous caller reaches Admin — A12 |
| The safety claims survive being attacked | python scripts/red_team.py | 48 attacks, 7 controls, 48 held — including 11 against the capability token that replaced the forgeable header — E1 |
| A privileged role is proved, not claimed | pytest tests/security | signed tokens; role, expiry, signature and revocation all attacked — 26 cases |
| Provider spend stays at zero | pytest tests/core/test_llm.py | Anthropic reports itself unavailable with a key set; the chain ends in a deterministic stub |
| Every artefact still matches its builder | pytest tests/test_artefacts_are_current.py | report, deck, viva, demo and notebook regenerate byte-identically from docs/results/ |