Public preview: https://meowrona.github.io/CommonGround/
Latest-build cache-bypass: https://meowrona.github.io/CommonGround/?build=20261003-open-data-v1
Public source: https://github.com/MeowRona/CommonGround
Architecture: ARCHITECTURE.md
Judging demo script: DEMO_SCRIPT.md
API-key request handoff: QLOO_KEY_REQUEST.md
Submission requirements / release gate: SUBMISSION_REQUIREMENTS.md
Use the Render button only after the Qloo key passes live_smoke.py; the Blueprint will prompt for QLOO_API_KEY as a secret.
CommonGround helps two people with different tastes find one movie that each person reaches for a different reason.
The core interaction is intentionally narrow:
- each person searches for and selects 1–3 films or artists;
- the live UI stores the exact Qloo entity ID/type, so ambiguous names are not silently guessed;
- Qloo independently discovers movie candidates for A and B;
- CommonGround unions those candidates and asks Qloo to evaluate the same movie pool for both people;
- candidates missing an evaluation on either side stay unknown instead of becoming zero;
- CommonGround minimizes the worse rank first, then the sum of both ranks;
- it proposes one bridge movie;
- both people react: Want to try / Already know / Not for me;
- a veto or already-known result is excluded and triggers one wider second round (25 candidates per side, keeping the union within Qloo's 50-result request window);
- after two rounds, the agent stops rather than forcing a compromise.
The public fixture deliberately includes a case where A's top 3 and B's top 3 have zero overlap, yet evaluating the union for both profiles recovers Arrival at A #3 / B #4. This makes the reason for same-pool evaluation directly inspectable instead of merely claiming that it helps.
Without Qloo, the intended product loses its core capability: cross-domain cultural relationships from inputs such as films + artists to a movie candidate pool, plus per-result explainability metadata.
The application layer does not claim to predict whether a person will like something. It uses Qloo's result ordering as query-context evidence, then applies a transparent two-person decision policy.
While the Qloo hackathon key is pending, the public GitHub Pages build runs an explicitly labelled OPEN-DATA TEST MODE — NOT QLOO. It searches real entities through Wikipedia/Wikidata and uses Wikipedia morelike: related-page search to generate temporary cultural candidates. Unlike the final Qloo path, the temporary bridge may be any mapped cultural object — artist, label, album, genre, film, person, etc. — which makes it useful for testing arbitrary profiles without fabricating Qloo output.
The open-data ranking is intentionally treated as a weaker temporary heuristic. It is not described as Qloo affinity or as the final fairness signal.
- Public Pages with empty
docs/runtime_config.json— open-data test mode. ?static=1— deterministic fixture scenarios generated by the Python decision engine.COMMON_GROUND_MODE=fixture— local backend fixtures.COMMON_GROUND_MODE=live+ configured Pagesapi_base— real Qloo/search+/v2/insightsflow.
The live client already implements:
- entity search/resolution via
/searchand the app's/api/searchselector endpoint; - movie discovery via
/v2/insights; feature.explainability=true;- candidate exclusions via
filter.exclude.entities; - same-pool evaluation via
filter.results.entities; - defensive parsing and fail-closed behavior when response structure is unexpected.
- parallel A/B discovery and same-pool evaluation to avoid unnecessary serial API latency.
- lightweight per-client rate limits and a bridge-concurrency cap so a public demo cannot trivially burn through the hackathon API allowance.
The remaining final-submission gate is the real hackathon API key, live schema verification, and deployment of the already-prepared Render API. The temporary Wikimedia mode is for development/testing only and must not be presented as the hackathon's Qloo-powered result.
Official API key request form: https://forms.gle/zz12orkLHTAneLGz6
The repository also contains a prepared render.yaml for a free live backend once that smoke test passes.
Python 3.11+; no third-party Python packages are required.
python app.pyOpen the printed http://127.0.0.1:<port>/ URL.
Run tests:
python -m unittest discover -s tests -vOnce the hackathon key is available, run the full read-only live contract smoke test:
$env:QLOO_API_KEY="..."
python live_smoke.py --write-fixtureThe script never prints or records the key. It verifies entity resolution, independent discovery, same-pool evaluation, the first bridge, and a second-round exclusion. With --write-fixture, it saves request query parameters plus raw Qloo response JSON to an ignored local fixture for schema debugging.
After deployment, run the final automated readiness check:
$env:LIVE_API_URL="https://your-service.onrender.com"
python submission_preflight.pyThe preflight can be launched from any working directory. It verifies that the local HEAD is the commit actually published as origin/main and that the HTML currently served by GitHub Pages matches docs/index.html, so neither a clean-but-unpushed repo nor a stale Pages build can accidentally pass the final gate.
The final Devpost demo URL remains the fast GitHub Pages frontend. After Render is live, configure_live_frontend.py writes the Render API origin into docs/runtime_config.json; Pages then wakes and uses the live backend while keeping the key server-side.
Build the static public preview:
python build_static_preview.pyFor every movie that has measurements on both sides:
- minimize
max(rank_A, rank_B); - break ties with
rank_A + rank_B.
Example: A=#1 / B=#9 loses to A=#6 / B=#6, even though average rank prefers the first candidate. This is a simple least-misery-style protection rule, not a novel preference model.
The test suite covers:
- random/unrecognized text failing instead of generating fake recommendations;
- a candidate found only in A's discovery still being evaluated for B;
- same-pool evaluation request parameters;
- missing evaluation staying unknown;
- worse-rank protection (
1/9vs6/6); - second-round widening and veto persistence;
- hard two-round limit;
- candidate-specific evidence;
- live search/insight response parsing fixtures;
- exact explainability-ID matching without substring false positives;
- secret-safe HTTP errors;
- explicit resolved-entity payload validation, so the agent receives stable Qloo IDs instead of reinterpreting a selected label;
- search caching, request bounds and per-client rate limits;
- real HTTP handler behavior for
/health,/api/search,/api/bridge, allowed/blocked CORS origins and invalid content types; - GitHub Pages fixture parity, runtime-config presence and non-blocking Render wake-up polling;
- smoke/preflight title matching across harmless punctuation/diacritic differences.
Public preview and public source are ready. Do not final-submit yet. The remaining blockers are:
- receive the Qloo hackathon API key;
- run live
/searchand/v2/insightssmoke tests; - verify the exact live explainability fields;
- deploy the Python backend on Render Free with the key stored server-side;
- point
docs/runtime_config.jsonat that verified live API while keeping the same GitHub Pages demo URL; - run the final preflight, capture live screenshots, and complete human review/submission.