Spaces:
Running
Running
Commit History
-
feat(ui): drop the dark banner; the sidebar is the chrome now
"Every modern website doesn't have an explicit header these days, ours looks old school" (2026-09-15). The banner sat on every screen, carried the product's full name, and cost vertical space on a phone to say something the landing page already says. The dashboard now has no top chrome at all, the way ChatGPT and Claude have none: the sidebar holds the logo, the guides, the admin link and the account, and the content area starts at the content. The landing page and /admin have no sidebar, so they keep a bar, but a light and quiet one with no tagline. The three static doc pages get the same treatment, and their inline logo strokes with currentColor, which is what lets one mark serve both their light and dark themes. Two things this forced, both right anyway. The dashboard became a real app shell (100vh, each pane scrolling inside it): stretched by a long page, the sidebar's account row and New project button had drifted to the bottom of the document instead of sitting at the bottom of…3967e32
-
docs(corpus): record the CAMEL licence; the dataset link is fine
Correcting an earlier claim of mine: the dataset link is NOT broken. The HF repo is public and GATED, not private - the page returns 200 for anyone, and only file downloads require signing in and accepting the terms, which is ordinary for a research dataset. I had tested the file URL and generalised it to the page. Checking that surfaced something that does matter. CAMEL is licensed CC BY-NC 4.0, and nothing in the repo said so, while README states the project is MIT and sample_data/camel_sample.csv - 999 rows of that corpus - sits in the tree. Nothing here relicenses it, but a reader had no way to know the sample carries different terms from the code around it. Examples now record their own licence. It shows in the info dialog and rides in run metadata next to the citation, so a researcher who exports results has the terms in the same file as the scores. README and sample_data/README name CC BY-NC 4.0 for the bundled sample explicitly and separate it from MIT, and the guide states i…5411f5f -
fix(ui): sample data as a small entry point under the upload row
The PI's framing for CAMEL is a small "use sample data" call to action: from it a visitor sees the two available sizes, and can read about the data if they want to. The dropdown row did the opposite - it sat above the upload control and read as the first thing to do. Step 1 is now upload first. Under the row, one muted line ("No data of your own? Use sample data") expands in place into a two-row list: name, size, language, a one-line fit note, About, Use. About opens the provenance dialog (description, text column, preprocessing, citation, dataset link), which carries its own Use button so a reader can decide from there; Escape and the backdrop close it. The panel closes once a corpus is loaded, and the Corpus select echoes the sample's name rather than its filename. Sizes an instance cannot run stay listed with the reason and a disabled Use. Picking a size already in the project selects that copy instead of copying the corpus again, so a second click cannot duplicate 38 MB in the bu…0b5c981 -
fix(ui): one compact corpus row instead of two large cards
Three problems with the first cut, all fair. CAMEL appeared twice, as two "corpora". It is one dataset in two sizes, so the sizes are now options in a single dropdown and it reads as one dataset. It was badged DEFAULT, which overstates it. The PI asked for CAMEL to be "available and ready-to-use"; that is a starting point, not a claim that this is THE corpus. The field is renamed default -> preselected, it decides ordering and what loads first, and nothing is badged. The two expanded cards took most of Step 1 and pushed the upload control below the fold, which is the wrong hierarchy: most researchers bring their own data. Step 1 is now one labelled row - dropdown, info button, action - and the provenance (description, text column, preprocessing, citation, dataset link) moved into a modal behind the info button, where it is one click away without occupying the step. Also: the listing now knows this instance's row ceiling. The full corpus is 57,174 rows against a deployed CCR_MAX_ROW…bb4c28d -
feat(corpus): offer the full CAMEL corpus from R2, raise the row ceiling
Follows spec 0010, which shipped only a 999-text sample because the full corpus could not be ingested. CCR_MAX_ROWS goes to 100,000, which was the code default all along; the three docs that variously claimed 20,000 and 50,000 are corrected to agree with it and with each other. That removes the ceiling that made the 57,174-row corpus un-ingestible. The full corpus is served from R2 under examples/, not the repo: 38 MB would ride in the Docker image and the Space repo on every deploy. It is deliberately NOT fetched from Hugging Face at runtime - that dataset returns 401, so fetching it would mean shipping lab credentials in a public app. scripts/upload_example_corpus.py puts it there and prints the row count the catalogue entry has to declare. Selection downloads the master once to parse, then makes the user's copy with a server-side copy_object, so 38 MB does not travel back out through the application for every visitor. Verified against the live bucket: 7.0s fetch, 0.7s parse of 57…88b1ea9 -
feat(corpus): CAMEL as a built-in example corpus [spec 0010]
PI request from 2026-08-19: make the lab's CAMEL corpus the example data on the site so visitors can try CCR without uploading anything. Corpus details from Aliah 2026-09-06. Step 1 now offers an example corpus above the upload control. One click loads it, selects the declared text column, and the run proceeds through the normal ingest path, so nothing downstream changes. The citation and a link to the full dataset sit on the card, and a run on an example writes a corpus_source block into its metadata carrying the citation, source URL and preprocessing note: results produced on someone else's corpus have to stay attributable in the same file as the scores. Ships a 999-text SAMPLE rather than the full corpus, because the full one cannot be the bundled default: 57,174 rows exceeds CCR_MAX_ROWS (50,000 on both deployments) so ingest would refuse it outright, 38 MB against a 156 KB sample_data would ride in the Docker image and the Space repo, and a demo has to finish in seconds on 2 vCP…3a1d713
-
feat(guide): public how-to guide + live AI model details
Split the guides so the public gets a plain how-to page and the lab keeps its click-through testing guide: - /guide now serves a new public how-to guide (public_guide.html): the upload -> construct -> run -> export flow, the four ways to add a construct (library, typed, uploaded, AI drafting), a models table, and a reproducibility section covering the results CSV, run metadata, and the offline reproduction script. - /testing serves the original testing guide, gated to lab and above (same gate as /product); the 403 explainer points to the public guide. Header shows a lab-only Testing link. - Landing page links the PI's name (Mohammad Atari) to mohammadatari.com. - AI construct path shows "Drafted by <model>" with a hover/focus info bubble (model, provider, prompt version, item rules, daily cap). Model identity is read live from the API: new item_generation.public_info() surfaced as a `generation` block on /api/auth/me, so the tooltip and guide never hardcode a model that…8586c1b
-
ui: redesign the new-construct form as a contained panel with source cards
Tester feedback: the form read as cluttered - two levels of the same choice (entry buttons + tabs), every path's fields visible at once, and a flex-wrap bug stretching the Close button full-width. - One '+ New construct' entry; inside, three self-describing radio-cards (Type or paste / Upload a file / Draft with AI) - Only the chosen path's fields render, in task order; Reference hidden on the AI path, Description shown only there (required, drafts from it) - AI path: items box + Save appear once there's a draft to review; quota sits inline next to the Draft button - Panel is a bordered sub-card with its own header + close069d95d -
ui: three explicit construct paths + Save gating + visible AI drafts
PI test feedback (2026-08-07): - Step 2 hint enumerates the three acquisition paths; two buttons next to the picker ('+ Your own items', 'Draft with AI') replace the generic '+ Custom construct' - Save construct is disabled until name + items exist, with an inline line saying what's missing (the silent dead-click read as broken - the error banner sits at the top of the page, out of view) - After drafting, scroll/focus the items box and say 'N items drafted - they're in the box below' (drafts landed off-screen unnoticed) - /guide and MANUAL_TESTING.md updated to the new button namesdc9da41
-
docs: AI item-drafting scenarios in /guide and MANUAL_TESTING.md
Click-through test steps for the Draft-with-AI tab (happy path, review labeling, library guardrail, vague input, provenance in metadata, daily cap, signed-out/no-key behavior) + the 20/day row in the limits table.bf6c4d6
-
style: enhance topbar consistency and responsiveness across guide and product pages
c53fa39 -
feat: put invite links on hold; single brand header everywhere
Invite links are dormant behind CCR_INVITES_ENABLED (default off): creation 409s, existing tokens stop redeeming with a clear message, /admin hides the section. Pre-assigned roles remain the onboarding path; machinery and audit history stay intact for re-enabling. Header: the CCR logo (which already reads 'CCR') stands alone with the tagline 'Psychological Text Analysis with Contextualized Construct Representation' - app, guide, and product topbars now identical.6a6c7cf -
feat: CAML lab branding - CCR logo, ink+teal theme, favicon, attribution
Palette derived from the lab's CCR logo: ink (#151515) header bars with the white logo variant, darkened logo teal (#26736f) for links/buttons (AA on white), pure logo teal (#339B98) for data fills. Correlation matrix now diverges teal (positive) vs copper (negative). Applied across the React app, guide, and product pages with 'Culture & Morality Lab, UMass Amherst' attribution.4e87534
-
feat: Add multi-construct functionality to scoring and results in guide and product pages
b195b7b
-
refactor: enhance AdminPage overview display and improve navigation
- Added a Stat component to better visualize user statistics on the AdminPage. - Updated the overview section to use the new Stat component for a cleaner layout. - Improved the header navigation in App component for better user experience. - Changed the brand header to a link for easier navigation back to the dashboard. - Enhanced styling for header elements and added hover effects for links. - Updated empty state messaging and layout in the App component for clarity. - Refined CSS styles for better visual consistency and responsiveness.54bd1cf -
Four-tier access model: self-governing admin, pre-login access, audit trail
PI decisions 2026-07-22: - Roles: pi | maintainer | lab | external (legacy "member" reads as external). Lab members and above: unlimited saved runs. - PI role holds escalation rights in-app (grant/revoke staff, act on staff accounts, audit view); ADMIN_EMAILS is bootstrap + break-glass only. Maintainers get the operational surface. Nobody can change their own role. - Construct verification is maintainer-only (the RA's job); PI/admin keep a read-only queue. - Access before sign-in: email-bound pre-assigned roles (staff-capable, claimed on first password/Google sign-in) and signed 7-day invite links (lab/external only, ?invite= signup flow). - Append-only admin_audit table records every admin action; visible to PI/env admins. - Docs split: /guide = navigate-and-test; new /product page = access model + capability matrix + architecture (moved from guide).bfb6467 -
Repro script: valid Python booleans + per-run filenames in instructions
- ITEMS was rendered with json.dumps, emitting true/false: valid Python syntax (bare identifiers) but a NameError at runtime. Now a real Python literal (True/False); test literal_evals the block so JSON booleans can't slip through compile() again. - Script/requirements usage instructions now name the files exactly as they download (run-id suffix) and use the uploaded CSV as the example arg; download endpoints share the same filename helpers so names can't drift. Guide + MANUAL_TESTING updated to match.ffe862f
-
Guide: click a section heading to copy a shareable deep-link
Sections already had stable ids (so /guide#limits worked), but there was no way to discover or grab that link. Each id'd heading now shows a "#" on hover and is click-to-copy: clicking sets the URL hash (scrolling to and briefly flashing the section) and copies the full link to the clipboard, with a small toast. Progressive enhancement - if the script fails, headings still render and the ids still deep-link natively. Respects prefers-reduced-motion.46b1454 -
Guide: add limits + models tables, fix stale anon byte cap
Testers were asking what the limits and available models are (Ali, Slack) - the answers were scattered across sections 2/7/8 and the anon byte cap still read 2 MB after we raised it to 5 MB. Add two at-a-glance tables right after the quickstart: - Limits by tier (upload size, rows, runs/day, saved runs) so the signed-out vs signed-in vs lab differences are in one place. - Models available, flagging the four PsyEmbedding fine-tunes and the first-run download so nobody reads the lazy-load pause as a hang. Also corrects the stale "2 MB" anon hint to 5 MB.329d800
-
Guide: add architecture + data-flow diagrams and infra/data-lifecycle notes
New 'How it works' section for technical readers: two inline SVG diagrams (what-runs-where, and the CCR run data flow), where-your-data-lives, and key engineering choices. Top caveat updated - files persist now too (R2).d7891e4 -
Guide: accounts/data now persist (Postgres); files caveat clarified
0b29b70
-
Guide: researcher quickstart, Slack feedback destination, lab-tier saved-run wording
b89016c -
Refine documentation and fix upload handling
- Update MANUAL_TESTING.md to clarify parsing behavior for multi-column files. - Correct title and formatting in guide.html and index.html for consistency. - Enhance README.md to specify behavior for skipped duplicates and blank lines. - Implement unique ID assignment for corpus uploads in main.py to prevent file clobbering. - Add regression test in test_api.py to ensure distinct uploads do not overwrite each other.9fce59c -
Add /guide tester page and /samples demo-data downloads
ed98758