You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The coordinator must be safe to resume. Before it creates a session, it must check for an existing session by the tuple (role, checkpoint, implementationCommit). First-pass and post-self-audit evaluator and judge sessions are separate state entries.
8. Start the coordinator
The user performs only these setup actions:
Create or select the target implementation model and reasoning setting.
Save the run configuration.
Trigger the coordinator.
The trigger can be:
A manually started Copilot App coordinator session
A manual Copilot App workflow
A scheduled Copilot App workflow
After the trigger, no human approval or response is required.
9. Exact coordinator kickoff prompt
Use this prompt for the coordinator session:
Run The Urlist benchmark described by the automation guide in this repository.
Read these files in full:
- docs/the-urlist-benchmark-prd.md
- docs/the-urlist-implementation-profile.md
- docs/copilot-app-benchmark-runbook.md
- docs/copilot-app-automated-orchestrator.md
- the run configuration path supplied with this prompt
Act only as the benchmark coordinator. Do not implement or edit the target application. Use app-native project sessions to create and control the implementation, evaluator, and judge sessions. Persist the run state after every transition. Resume existing sessions from state instead of creating duplicates.
Validate the run configuration and base commit. Create one implementation session in Plan mode with the configured target model, reasoning effort, context tier, base commit, coordination enabled, and idle notifications enabled.
When the plan is ready, inspect it against the fixed plan checklist in the operator runbook. If it materially omits required areas, allow exactly one revision with the fixed generic plan-revision prompt. Do not send model-specific omissions. After the first plan or one revision, approve it into Autopilot.
When implementation first goes idle, validate whether a first-pass checkpoint exists. If it does not, allow exactly one fixed continuation. Do not use the model's self-description to decide whether it gets the continuation. Do not give feature-specific guidance.
Require a clean first-pass checkpoint commit and exact SHA. Start the private deterministic evaluator and three independent model-review judge sessions for that SHA. Store all results outside the implementation session. Do not send or summarize any result to the implementation session.
After first-pass scoring is stored, send the exact blind self-audit prompt in Autopilot mode. Require a post-self-audit checkpoint commit and exact SHA. Run the same evaluator commit, metadata target set, and three-judge process.
Aggregate category medians for model review. Apply score caps only under the automated cap rule in this guide. Write JSON and Markdown reports with both checkpoint scores, score changes, metadata, incidents, and artifact links.
Do not ask a human to approve plans, answer implementation questions, continue work, interpret evaluator output, or choose fixes. If benchmark documents have a real conflict, stop with BENCHMARK_CONFLICT. If they are silent, send the fixed assumption response.
Supply the run configuration path as part of the workflow input or append one line:
Run configuration: runs/<run-id>/config.json
10. Create the implementation child
Use the app's session-creation capability with:
The configured implementation project
The exact base commit or branch that points to it
A new isolated worktree
coordinate_with_creator: true
notify_on_idle: always
mode: plan
The configured target model and settings
Use the existing runbook kickoff prompt with this automation suffix:
Automation checkpoint rules:
When the first implementation pass is complete, commit all tracked and non-ignored source, test, migration, lock-file, and documentation changes. Do not force-add secrets, runtime databases, dependencies, or build output. Use commit message "benchmark: first pass". Push the run branch. Report the full commit SHA to the coordinator.
Do not run hidden evaluator tests. Do not wait for evaluator feedback.
When you later receive the fixed self-audit prompt, complete all fixes, commit tracked and non-ignored changes with message "benchmark: post self audit", push the same branch, and report the full commit SHA.
Your implementation plan must contain a coverage table with these exact row labels:
- STACK
- ROUTES
- DATA_AND_MIGRATION
- MOCK_AUTH
- DRAFT
- LINKS
- METADATA_AND_SSRF
- ALIASES
- ANONYMOUS_LIFECYCLE
- ACCOUNT_LIFECYCLE
- PUBLIC_SHARE_QR
- THEME
- ACCESSIBILITY_RESPONSIVE
- RESET_PERSISTENCE
- TESTS_BUILD_DOCS
11. Automatic plan gate
The coordinator mechanically checks whether the plan contains all of these exact coverage-table row labels:
The gate does not judge design quality. A row is present or absent. The coordinator does not infer coverage from different wording.
If one or more categories are materially absent, reject once with this exact prompt:
Revise the plan before implementation. Re-read both benchmark documents and ensure the plan covers every PRD requirement area, automated acceptance categories A through G, the complete required stack, persistence, security, accessibility, validation, and testing. Keep the plan implementation-ready and do not reduce any requirement.
After one revision, approve without targeted guidance.
Use app-native plan response with:
approved: true
selected_action: autopilot
12. Automatic clarification handling
If the documents answer the question, the coordinator sends the relevant document quotation only.
If the documents are silent, send:
The benchmark documents do not specify that detail. Choose a reasonable implementation, document the assumption, and continue without reducing any stated requirement.
If two controlling requirements conflict and no precedence rule resolves them:
Do not improvise.
Set state to BENCHMARK_CONFLICT.
Stop the run.
Produce a conflict artifact for later benchmark maintenance.
13. Automatic continuation handling
When the implementation session first goes idle, check for a valid first-pass checkpoint. If no valid checkpoint exists, send once:
Continue the approved plan. Complete all remaining benchmark scope, run the required validation, and do not stop until the implementation is complete or you have a concrete external blocker.
If it stops again without a valid checkpoint:
Do not send another continuation.
Freeze the current state as the first-pass result.
Mark implementationIncomplete: true.
Continue evaluation if the application can run.
Record setup failure if it cannot run.
14. Checkpoint validation
Before evaluation, the coordinator must confirm:
The commit exists on the run branch.
The SHA is a full immutable commit ID.
The commit descends from the configured base.
The working tree contains no additional non-ignored changes.
Benchmark documents match the base commit.
Hidden evaluator files are absent.
No runtime database, secret, dependency directory, or build output is force-added.
If no checkpoint commit exists, send one fixed operational request:
Create the required checkpoint commit from all tracked and non-ignored benchmark work, push the run branch, and report the full commit SHA. Do not change application behavior while creating the checkpoint.
This request can occur once per checkpoint. If it fails, mark the checkpoint invalid and stop with IMPLEMENTATION_BLOCKED.
15. Deterministic evaluator contract
Create evaluator and judge sessions with:
coordinate_with_creator: false
notify_on_idle: once
All required input in the initial kickoff prompt
No later send_session_message call
These sessions cannot send peer messages to the implementation session. The coordinator collects their final response with session inspection after the idle notification. Result files remain in the evaluator or control repository, never in the implementation worktree.
The private evaluator must expose one non-interactive command, for example:
The evaluator must calculate points. The evaluator session must not reinterpret failures.
16. Exact evaluator-session prompt
Run the deterministic The Urlist evaluator for the supplied implementation commit.
Do not modify evaluator source, scoring rules, fixtures, metadata targets, or implementation source. Do not assign points through judgment. Run the evaluator command exactly as documented, wait for completion, validate its JSON schema, and return only the result artifact path and command status in your final response. Do not send a message to another session.
Implementation repository: <repository>
Implementation commit: <full-sha>
Checkpoint: <first-pass-or-post-self-audit>
Run ID: <run-id>
Metadata target set: <version>
Output directory: <path>
The coordinator substitutes only the bracketed run values.
17. Automated model review
Run three judges per checkpoint.
Each judge receives:
Exact implementation commit
PRD
Implementation profile
H1–H6 rubric
No other judge result
Judges must not deduct automated points again. They score only H1–H6.
Judges inspect the code, submitted tests, README, and application directly. They do not receive A–G scenario results, hidden logs, or evaluator screenshots.
Scores must be integers within each category range.
Evidence must identify a file, route, test artifact, or observed behavior. Unsupported deductions are invalid.
17.2 Exact judge prompt
Perform an independent model review of The Urlist implementation at the exact supplied commit.
Read the PRD H1–H6 scorecard and the implementation profile. Inspect the code, submitted tests, README, and application at the supplied commit. Score only H1 through H6. Do not run or request the hidden evaluator. Do not change automated A–G points. Do not edit source or run a correction session.
Use the rubric anchors. Return only schema-valid JSON in the required judge output shape. Use integer category scores. Give concise, specific evidence for every deduction. Ignore personal framework preferences and style-only issues. Report a critical finding only when evidence shows a practical authorization bypass, server-side request forgery, stored script execution, exposed credential, or production data-reset path.
Run ID: <run-id>
Checkpoint: <first-pass-or-post-self-audit>
Implementation repository: <repository>
Implementation commit: <full-sha>
First-pass objective, model-review, uncapped, and capped scores
Post-self-audit objective, model-review, uncapped, and capped scores
Category and scenario changes
Self-audit gain
Incidents
Artifact references
The Markdown report must state:
The 25-point review was produced by automated model judges. It was not a human review.
22. No-human completion rules
A run is complete when:
Both valid checkpoints exist, or the implementation is conclusively blocked.
The deterministic evaluator ran for each valid checkpoint.
Three valid judge outputs exist for each scored model-review checkpoint.
Scores were aggregated by script.
Hidden results were not sent to the implementation session.
report.json passes schema validation.
report.md exists.
State is REPORTED or a documented terminal error.
23. Public metadata target determinism
Use versioned, evaluator-controlled public target pages.
The pages must:
Be hosted outside the implementation machine.
Resolve through public internet DNS.
Use immutable versioned paths.
Have content hashes stored in the evaluator repository.
Cover required success, fallback, redirect, slow, error, and security cases.
Be preflight-checked before each benchmark checkpoint.
Use the same target-set version for all comparable runs.
The evaluator must stop with an infrastructure incident if a target's status or content hash does not match its recorded version. It must not score the implementation against changed target content.
This satisfies the PRD requirement for live public HTTP. A local fixture server is not permitted.
24. What still must be built
The current PRD and runbooks are specifications. Full automation also requires:
A private evaluator repository
Executable A1–G3 black-box tests
Stable public metadata target pages
JSON schemas and aggregation scripts
A control repository with run state
A Copilot App workflow or coordinator project session
Repository credentials with the isolation in section 5
The coordinator cannot create reliable scores until the deterministic evaluator exists.
25. Recommended implementation order
Build and validate the private black-box evaluator manually against one known implementation.
Build JSON validation and score aggregation.
Add judge-session automation.
Add implementation child creation and plan approval.
The model must scaffold the application in this repository.
Do not add:
Application source
A package manifest
A Next.js scaffold
A database
Example implementation code
Hidden evaluator tests
The original repository
3.2 Freeze the base
Create and record one base commit.
For every model run:
Start from that exact commit.
Use a new isolated Copilot App project session or worktree.
Do not reuse files, package caches inside the repository, database files, or browser state from another run.
Keep the model-produced lock file as part of the result.
You can reuse machine-wide npm download caches. Do not reuse generated project files.
3.3 Evaluator isolation
Keep hidden evaluator code outside the model repository.
Run the evaluator against a copy or checkpoint of the model result. The evaluator must not:
Modify model source.
leave test files in the model worktree.
Add failures to the session context.
Change the application's normal data before a later checkpoint.
4. Start the Copilot App session
Add the clean benchmark repository as a Copilot App project.
Create a new isolated project session from the recorded base commit.
Select the model and reasoning level that you want to evaluate.
Select Plan mode.
Send the exact kickoff prompt in section 5.
The protocol does not prescribe the model or reasoning setting. Record both in the run report.
Do not attach the original source repository or external implementation examples.
5. Exact kickoff prompt
Copy this prompt without model-specific additions:
Implement The Urlist benchmark application in this repository.
Before you do any implementation work, read these two files in full:
- docs/the-urlist-benchmark-prd.md
- docs/the-urlist-implementation-profile.md
The PRD is the sole authority for product behavior and evaluation. The implementation profile is the authority for the required technical stack. Do not access, search for, or copy the original the-urlist/blazor-static-web-apps repository or another implementation of this product.
First, produce a detailed implementation plan. Map the PRD requirement areas and automated acceptance categories A through G to the architecture, routes, database design, security boundaries, implementation milestones, and tests. The plan must cover the complete application, not only a scaffold or happy path. Do not write application code until the plan is approved.
If the documents do not decide an implementation detail, choose a reasonable solution, document the assumption, and continue. Ask a question only when the two documents directly conflict or implementation cannot continue safely.
After plan approval, implement the complete application end to end. Maintain a task list and continue until all planned work is complete. Install dependencies only after you create the manifests. Use the required stack and direct SQLite through better-sqlite3. Do not use an ORM.
Run and fix all applicable validation:
- npm run lint
- npm run typecheck
- npm test
- npm run test:e2e
- npm run build
Also start the production build, verify that the application responds, and verify restart persistence. Do not claim success for commands that did not pass. Do not stop after scaffolding, a partial feature set, or a written recommendation.
Before you declare the implementation complete, re-read both benchmark documents, audit the implementation against every acceptance category A through G, fix defects that you find, and report the commands and results.
6. Review the plan
The plan review is a gate, not a collaborative design session.
Approve the plan when it covers:
Next.js App Router architecture
Strict TypeScript
Direct SQLite through better-sqlite3
Schema initialization or migration
Local mock GitHub sessions
Anonymous and account lifecycle rules
Nested root aliases and reserved routes
Server-side live metadata and SSRF protection
Draft and theme browser storage
Public, edit, My Lists, tombstone, and not-found pages
QR and share behavior
Accessibility and responsive behavior
Vitest and Playwright coverage
Test reset and restart persistence
Validation, build, and documentation
Reject the plan only when it:
Omits a material requirement area.
Contradicts the PRD or profile.
Uses a prohibited technology.
Plans only a scaffold or partial implementation.
Leaves security or persistence to unspecified later work.
Allow at most one plan revision. Do not cite model-specific omissions. Send this exact rejection prompt:
Revise the plan before implementation. Re-read both benchmark documents and ensure the plan covers every PRD requirement area, automated acceptance categories A through G, the complete required stack, persistence, security, accessibility, validation, and testing. Keep the plan implementation-ready and do not reduce any requirement.
After that revision, approve the plan without more model-specific plan guidance. An incomplete revised plan remains evidence of model performance.
The fixed plan rejection does not count as a follow-up implementation prompt. Apply the same plan-completeness standard to every model.
Approve the plan in Copilot App and select Autopilot as the continuation mode. Plan approval starts implementation. Do not send an additional implementation trigger message.
7. Clarification policy
Do not answer implementation-design questions with new preferences.
If the model asks a question and the documents already answer it:
Quote or cite the relevant section.
Do not add a new rule.
If the documents are silent, send this exact response:
The benchmark documents do not specify that detail. Choose a reasonable implementation, document the assumption, and continue without reducing any stated requirement.
If the PRD and profile have a real conflict:
Stop the run.
Record the conflict.
Correct and version the benchmark documents.
Restart all comparable runs from the same new base commit.
Do not resolve a true benchmark defect for only one model.
8. First-pass completion
The first pass ends when the model:
States that implementation is complete, or
Stops with no pending task and presents final results.
It does not end at plan approval, an intermediate milestone, or a request to continue work that is already in scope.
If the model stops early and says that work remains, send this standardized continuation:
Continue the approved plan. Complete all remaining benchmark scope, run the required validation, and do not stop until the implementation is complete or you have a concrete external blocker.
This is continuation, not correction. Record how many times it was necessary.
Allow this continuation at most once. If the model stops again with work still in scope, end and score the first pass as incomplete.
Do not tell the model which features are currently wrong.
9. Freeze the first-pass checkpoint
Before evaluation:
Stop model activity.
Record the session ID.
Record the exact repository status.
Commit all tracked and non-ignored model-produced files as a checkpoint without editing them. Respect the model's .gitignore. Do not force-add dependencies, build output, runtime databases, secrets, or other ignored files.
Tag or record the checkpoint as first-pass.
Copy or mount that checkpoint for evaluation.
If the model already made commits, keep them. Add only a checkpoint commit or tag as necessary.
Do not run formatters, dependency updates, migrations that change source, or repair commands as the operator.
Record:
Commit SHA
Diff statistics from the base
Dependency lock-file hash
Model and reasoning selection
Session mode
Start and completion times
Tool or infrastructure incidents
Standardized continuation count
Model-reported test results
10. Score the first pass
Run the complete evaluator from the PRD:
Automated black-box matrix: 75 points
Human-review scorecard: 25 points
Store:
Category and scenario scores
Failure evidence
Logs and screenshots
Human-review notes
Final first-pass score
Do not put evaluator output in:
The model repository
The Copilot session
A message to the model
A file that the model can read
The model must enter self-audit without hidden-test feedback.
11. Exact self-audit prompt
Return to the same Copilot App project session at the first-pass worktree. Set the session to Autopilot mode and send this exact prompt:
Perform the one allowed benchmark self-audit and correction pass.
Do not ask for evaluator results. You will not receive hidden-test failures or human-review findings.
Re-read these files in full:
- docs/the-urlist-benchmark-prd.md
- docs/the-urlist-implementation-profile.md
Inspect the complete implementation and its current tests. Audit it systematically against every PRD requirement family, every security and accessibility requirement, and every automated acceptance category A through G. Check connected behavior, direct-request authorization, persistence, error paths, responsive behavior, and setup instructions. Run the full validation suite and production build.
Fix every defect or omission that you find. Add or improve tests where they expose a gap. Do not change the benchmark documents, remove required behavior, weaken tests, or replace live metadata behavior with fixtures.
Do not stop after listing issues. Implement the fixes, rerun validation, and continue until you find no remaining actionable gap. Then report the changes, assumptions, and exact command results.
Do not add hints, failing scenario IDs, stack traces from hidden tests, screenshots, or human-review comments.
12. Freeze and score the post-self-audit checkpoint
When the model declares the self-audit complete:
Freeze model activity.
Commit all new model changes without editing them.
Tag or record the checkpoint as post-self-audit.
Run the same evaluator in the same environment.
Complete the same human-review scorecard.
Record:
Post-self-audit commit SHA
Diff from first pass
New or changed tests
Model-reported command results
Automated and human scores
Scenario changes from first pass
Do not replace the first-pass result. Report both.
13. Fairness rules
13.1 Allowed
One fixed, non-targeted plan-revision prompt
One standardized continuation when the model stops before its approved plan is complete
Recovery from a Copilot App, network, or machine incident
The exact self-audit prompt
Answers from the fixed clarification policy
13.2 Not allowed during a scored run
Ad hoc debugging advice
Hidden-test failures before the final checkpoint
A custom fix prompt for one model
Source code from another model
The original application repository
Manual source edits by the operator
Dependency or architecture suggestions not in the profile
Extra correction passes
13.3 Incident handling
An infrastructure incident is not a model defect when it is outside the repository and model control.
Examples:
Copilot App service interruption
Package registry outage
Evaluator outage
Machine restart
Live metadata target outage
For an infrastructure incident:
Pause the clock if the benchmark uses time.
Preserve the session and worktree.
Restore the same environment.
Resume with no new implementation guidance.
Record the incident.
If repository code caused the failure, it is not an infrastructure incident.
13.4 Live metadata targets
Use the same controlled public metadata targets for all comparable runs in one benchmark round.
The targets must:
Be reachable through public internet DNS and HTTP or HTTPS.
Be outside the model repository and Copilot session.
Have evaluator-controlled, versioned content.
Cover the PRD metadata cases.
Be recorded with the evaluator result.
Do not use a local fixture server. If a target changes or fails during a round, treat it as an evaluator incident. Restore the target or rerun affected models under the same conditions.
14. Result interpretation
Report two complete scores:
Result
Meaning
First pass
Planning and implementation quality before evaluator feedback or a correction prompt
Post-self-audit
Best result after one standard blind correction pass
Also report:
Self-audit gain = post-self-audit score - first-pass score
The first-pass score is useful for reliability. The post-self-audit score is useful for agentic problem-solving quality. The gain shows self-correction ability.
Do not rank models only by gain. A low first pass with a large gain can still be worse than a consistently high result.
15. Run report template
Benchmark: The Urlist
PRD version:
Implementation profile version:
Runbook version:
Base commit:
Model selected by operator:
Reasoning level selected by operator:
Other model settings:
Copilot App session ID:
Session mode: Plan, then Autopilot
Run start:
Plan approved:
First pass complete:
Self-audit complete:
Standardized continuation count:
Infrastructure incidents:
Clarification questions and standardized answers:
First-pass commit:
First-pass lock-file hash:
First-pass automated score: __ / 75
First-pass human score: __ / 25
First-pass total: __ / 100
Post-self-audit commit:
Post-self-audit lock-file hash:
Post-self-audit automated score: __ / 75
Post-self-audit human score: __ / 25
Post-self-audit total: __ / 100
Self-audit gain:
Scenario score changes:
Reviewer notes:
Evaluator artifact location:
16. Short operator checklist
Before the run:
Use the fixed clean base commit.
Confirm both benchmark documents are in docs/.
Create a new isolated Copilot App session.
Select the model and reasoning level.
Start in Plan mode.
Send the exact kickoff prompt.
During the run:
Review only for plan completeness.
Use Autopilot after approval.
Give no ad hoc implementation help.
Use only the fixed plan-revision, clarification, and continuation responses.
At first pass:
Freeze and checkpoint.
Run the complete evaluator.
Store results outside model context.
At self-audit:
Send the exact self-audit prompt.
Give no evaluator hints.
Freeze and checkpoint again.
Run the same evaluator.
After the run:
Record both scores.
Record metadata and incidents.
Preserve both checkpoints and evaluator artifacts.
Start one GitHub Copilot App project session in Autopilot mode. Select the model and reasoning level, then send the prompt below.
Plan mode and operator approval are not required. The model must plan internally, implement the application, validate it, and complete one final self-audit in the same run.
Prompt
Build the complete The Urlist application in this repository.
Read these documents in full before you make changes:
- docs/the-urlist-benchmark-prd.md
- docs/the-urlist-implementation-profile.md
The PRD defines all product behavior and acceptance criteria. The implementation profile defines the required technology stack. Do not access, search for, or copy the original The Urlist repository or another implementation of this product.
Work autonomously from start to finish:
1. Inspect the repository.
2. Create and maintain an internal implementation plan and task list.
3. Scaffold the required Next.js application.
4. Implement every requirement in the PRD.
5. Add the required SQLite schema and migrations or repeatable initializer.
6. Implement mock authentication, persistent ownership, live metadata retrieval, security controls, and the test reset mechanism.
7. Implement all required pages, routes, states, responsive behavior, and accessibility behavior.
8. Add meaningful Vitest and Playwright coverage.
9. Write complete setup, test, and operation instructions.
10. Run and fix:
- npm run lint
- npm run typecheck
- npm test
- npm run test:e2e
- npm run build
11. Start the production build and verify that the application responds.
12. Verify that published and deleted data survives a complete application restart.
13. Re-read both documents and audit the result against every PRD requirement family and every automated acceptance category from A through G.
14. Fix every defect or missing requirement that you find.
15. Repeat validation after the final fixes.
If the documents do not specify an implementation detail, choose a reasonable solution, document the assumption, and continue. Do not ask for approval unless the documents directly conflict or an external blocker makes progress impossible.
Do not stop after scaffolding, planning, a partial feature set, or a written recommendation. Continue until the complete application is implemented and validated. Do not claim that a command passed unless you ran it successfully.
Do not change the benchmark documents. Do not weaken requirements or tests to make validation pass. Do not use an ORM. Use the exact stack and direct SQLite approach from the implementation profile.
When finished, report:
- What you implemented
- Important assumptions
- Database and architecture choices
- Tests and validation commands that passed
- Any requirement that remains incomplete, with the exact reason
Result
The model's declared-complete repository is the benchmark submission. Score that repository with the PRD rubric after the session ends. Do not give evaluator failures to the model during the run.
Document version: 1.0 Benchmark type: Full application implementation Evaluation split: 75 points automated review, 25 points human review Source access during benchmark: Not permitted Implementation stack: Not prescribed
1. Purpose
This document is the complete product specification for The Urlist. A model receives this document in a new repository. The model must build a working application from it.
The application lets a person collect web links in an ordered list and publish that list at a short public path. A visitor can open the path, view the links, share the list, or show a QR code for it.
This document is also the benchmark specification. It defines:
Product behavior
Required user journeys
Data and security rules
Stable routes and interface names
Low-fidelity wireframes
Automated acceptance scenarios
Human-review criteria
The document does not require a specific programming language, framework, database, or hosting platform.
2. Product statement
The Urlist helps people group links, save them, and share them with the world through one simple URL.
A person can start a list without an account. An anonymous person can publish the list, but cannot change or delete it after publication. A signed-in person can publish an account-owned list, edit it later, delete it, and restore it.
3. Benchmark objective
The benchmark measures whether a model can:
Convert a detailed product specification into a complete application.
Implement connected client, server, storage, and security behavior.
Resolve state and lifecycle requirements correctly.
Build an accessible and responsive user experience.
Produce maintainable code, tests, and setup instructions.
Functional equivalence is the primary goal. Pixel-level visual equivalence is not a goal.
4. Goals
The implementation must:
Let a visitor create an ordered list of HTTP or HTTPS links.
Fetch live metadata for each link.
Let the author edit link titles and descriptions.
Let the author select or generate a public alias.
Support anonymous, permanent, immutable publication.
Support account-owned publication through a local mock GitHub login.
Protect account-owned lists from other users.
Let an owner edit, soft-delete, and restore an account-owned list.
Show active lists at root-level public paths.
Show a QR code and working share controls for a public list.
Retain drafts in the browser and published data on the server.
Work in current Chromium at desktop and mobile widths.
Meet WCAG 2.2 AA for the evaluated journeys.
Run locally without a real OAuth or cloud database account.
5. Non-goals
The implementation does not have to:
Use Blazor, .NET, Azure Functions, Cosmos DB, or Azure Static Web Apps.
Match the source application's pixels, CSS framework, or asset files.
Support real GitHub OAuth.
Support Twitter/X account migration.
Provide abuse reporting or moderation tools.
Provide About, Terms, or Privacy pages.
Measure or meet a benchmark performance threshold.
Resolve concurrent edits from two sessions.
Import or export lists.
Download QR codes.
Change the destination URL of an existing link.
Let an anonymous author edit or delete a published list.
Let an anonymous list later become account-owned.
6. Product language
The interface must use these terms consistently:
Term
Meaning
List
An ordered collection of link entries.
Link
One destination URL and its display metadata.
Alias
The root-level path that identifies a public list, such as burke/links.
Draft
The one unpublished list stored in the current browser.
Anonymous list
A published list with no account owner. It is permanent and immutable.
Account-owned list
A published list owned by one mock GitHub user.
Deleted list
An account-owned list in the soft-deleted state.
Tombstone
The public page shown for a deleted list.
Metadata enrichment
Live HTTP retrieval of a title, description, and image for a link.
Use the name The Urlist in the application title and main navigation. Use this core copy on the home page:
Group links, save and share them with the world.
Add links to a list and share it with one simple URL.
The implementation can make small grammar changes, but must keep the meaning.
7. Personas
7.1 Anonymous author
An anonymous author wants to make and publish a list quickly. The author accepts that the published list cannot be changed or deleted.
7.2 Signed-in author
A signed-in author uses a local mock GitHub identity. The author wants to create, find, edit, delete, and restore account-owned lists.
7.3 Public visitor
A public visitor opens a list alias. The visitor wants to inspect links, open a destination, copy or share the list URL, or show its QR code.
7.4 Benchmark operator
The benchmark operator installs and starts the application, resets test data, selects mock identities, runs browser tests, restarts the application, and reviews the result.
8. Core user journeys
8.1 Start a draft from the home page
The visitor opens /.
The visitor enters a destination URL.
The application validates the URL.
The application creates a link entry and opens /s/new. If a non-empty local draft already exists, the application adds the new link to that draft. It does not clear the existing content.
The application starts metadata enrichment.
The visitor can continue to add, edit, delete, or reorder links.
8.2 Publish anonymously
The anonymous author prepares a draft with one or more links.
All metadata requests reach a success or failed state.
The author selects a valid alias or leaves it blank.
The author selects Publish.
The application shows a blocking confirmation. It states that the list cannot be edited or deleted after publication.
The author confirms.
The application stores an anonymous list and opens its public page.
The alias is reserved permanently.
8.3 Publish with an account
The author selects Login.
The local mock GitHub provider shows two user identities.
The author selects one identity.
The author creates or resumes the one local draft.
The author publishes the list.
The application makes the list account-owned by the current identity.
The application opens the public page.
8.4 Manage account-owned lists
A signed-in author opens /s/mylists.
The author sees active lists and a separate Deleted lists section.
The author selects an active list.
The application opens /s/edit/{alias}.
The owner changes permitted fields or link order and saves.
The application keeps the alias unchanged.
8.5 Delete and restore an account-owned list
The owner opens the edit page.
The owner selects Delete list.
The application shows a blocking confirmation.
The owner confirms.
The list enters the deleted state.
Its public path shows a neutral tombstone.
Its alias stays reserved.
The owner can restore the list from Deleted lists or from the tombstone.
The restored list returns with its prior content and alias.
8.6 View and share a public list
A visitor opens a root-level alias.
The application shows the list description or alias as the heading.
The application shows links in saved order.
The visitor can switch between link view and QR view.
The visitor can copy the canonical URL or open an encoded platform share URL.
9. Route contract
The implementation must support these browser routes.
Route
Access
Required behavior
/
Public
Home page and first-link entry.
/s/new
Public
Create or resume the one local draft.
/s/edit/{alias}
Owner only
Directly load an account-owned list for editing. Refresh must work. {alias} can contain multiple path segments.
/s/mylists
Signed in
Show the current user's active and deleted lists.
/{alias}
Public
Show an active public list, a deleted tombstone, or a never-used alias state. {alias} can contain multiple path segments.
The application must reserve its own application paths. At minimum, these first path segments are reserved and cannot be list aliases:
s
api
auth
__test
.well-known
The implementation can reserve more paths. It must document all additional reserved paths.
Static file paths do not become valid aliases. Query strings and fragments are not part of an alias.
10. Navigation
The global navigation must provide:
A The Urlist home link
New
My Lists when signed in
A theme selector with Light, Dark, and System
Login when signed out
The current mock GitHub user's name or account menu when signed in
Log out when signed in
At a mobile width, the application can put these controls in a menu. The menu must have an accessible name and state.
Selecting New must not silently erase a non-empty draft. The application must show a confirmation before it clears that draft.
11. Functional requirements
Requirement keywords have these meanings:
MUST: Required for conformance.
SHOULD: Strongly recommended. A human reviewer can deduct points if it is absent without good reason.
MAY: Optional.
11.1 Draft lifecycle
FR-DRAFT-01 The application MUST keep at most one unpublished draft in a browser profile.
FR-DRAFT-02 The draft MUST be available to anonymous and signed-in users.
FR-DRAFT-03 The draft MUST survive page reloads and browser navigation.
FR-DRAFT-04 The draft MUST contain the list description, requested alias, links, link order, editable metadata, and terminal metadata status.
FR-DRAFT-05 The application MUST clear the draft after successful publication.
FR-DRAFT-06 The application MUST not clear a non-empty draft without explicit confirmation.
FR-DRAFT-07 The identity that is active at publication time determines ownership:
No active identity: publish as anonymous.
Active mock GitHub identity: publish as account-owned.
FR-DRAFT-08 Logging in or out MUST NOT by itself erase the draft.
11.2 Destination URL validation
FR-URL-01 A link destination MUST be an absolute HTTP or HTTPS URL.
FR-URL-02 The application MAY add https:// when a user enters a domain-like value without a scheme. If it does, it MUST show the normalized value before publication.
FR-URL-03 The application MUST reject:
Empty or whitespace-only values
Schemes other than HTTP and HTTPS
Relative URLs
Values without a valid host
URLs that contain embedded credentials
Values that cannot be parsed as one absolute URL
FR-URL-04 The application MUST show a specific error near the URL field and associate the error with the field.
FR-URL-05 The destination URL becomes immutable after the link entry is created. The displayed URL can be read or copied, but not edited.
FR-URL-06 To change a destination URL, the author must delete the link and add a new one.
11.3 Link creation and editing
FR-LINK-01 A list MUST support any number of links that available resources can hold. The product MUST NOT impose a documented product limit.
FR-LINK-02 Duplicate destination URLs MUST be allowed.
FR-LINK-03 Each duplicate is a separate link entry with a separate identifier, title, description, image, and position.
FR-LINK-04 The author MUST be able to add and delete links in a draft.
FR-LINK-05 The owner MUST be able to add and delete links from an account-owned published list.
FR-LINK-06 The author or owner MUST be able to edit a link title and description.
FR-LINK-07 The image is controlled by metadata enrichment. The interface MUST NOT require direct image URL editing.
FR-LINK-08 The author or owner MUST be able to reorder links.
FR-LINK-09 Reordering MUST work with a pointer and with a keyboard. Drag-and-drop alone is not sufficient.
FR-LINK-10 Every add, delete, edit, and reorder action MUST update the local draft immediately. An account-owned published list updates only when the owner saves, unless the interface clearly uses autosave.
FR-LINK-11 If the implementation uses autosave, it MUST clearly show saving, saved, and failed states.
FR-LINK-12 At least one link is required for publication or for saving an edited published list.
11.4 Live metadata enrichment
FR-META-01 The application MUST fetch metadata from the live destination URL after a link is added.
FR-META-02 The default product mode MUST NOT replace live fetching with static fixtures.
FR-META-03 Each link MUST show one metadata state:
Pending
Succeeded
Failed
FR-META-04 The complete metadata network operation MUST stop no later than 10 seconds after it starts. The interface MUST show the terminal succeeded or failed state no later than one additional second after that deadline.
FR-META-05 Publication and saving MUST wait while any link is pending.
FR-META-06 A failed enrichment MUST NOT remove the link.
FR-META-07 After an enrichment failure, the author MUST be able to edit the title and description and publish or save.
FR-META-08 Metadata extraction MUST use this precedence:
Field
First choice
Second choice
Standard fallback
Title
og:title
Twitter Card title
HTML <title>, then first suitable <h1>
Description
og:description
Twitter Card description
HTML meta description
Image
og:image
Twitter Card image
Declared page icon, then /favicon.ico if available
FR-META-09 The implementation MUST support common Twitter Card attribute forms that use name or property.
FR-META-10 Relative image and icon URLs MUST resolve against the final document URL after redirects.
FR-META-11 Empty metadata is a successful result if the document loaded and parsed. Title and description remain optional.
FR-META-12 The application MUST show a neutral placeholder when no usable image exists.
FR-META-13 The user MUST be able to edit an enriched title or description. Later rendering MUST preserve that manual value.
11.5 Alias rules
FR-ALIAS-01 An alias consists of one or more path segments separated by /.
FR-ALIAS-02 The application MUST normalize ASCII letters to lowercase before availability checks and storage.
FR-ALIAS-03 Each segment MUST contain only:
Lowercase ASCII letters a-z
Digits 0-9
Hyphens -
FR-ALIAS-04 Each segment MUST contain 1 to 50 characters.
FR-ALIAS-05 The complete alias, including / separators, MUST contain no more than 200 characters.
FR-ALIAS-06 An alias MUST NOT contain:
An empty segment
A leading or trailing /
A leading or trailing hyphen in a segment
Two adjacent / characters
. or .. as a segment
A query, fragment, backslash, encoded slash, or encoded backslash
A reserved first segment
FR-ALIAS-07 Availability checks MUST use the normalized alias.
FR-ALIAS-08 Active, deleted, and anonymous aliases all count as reserved.
FR-ALIAS-09 If the author leaves the alias blank, the server MUST generate an available alias with seven lowercase ASCII letters or digits.
FR-ALIAS-10 A generated alias MUST pass the same availability and reserved-path checks as a custom alias.
FR-ALIAS-11 Two publications that request the same alias MUST NOT overwrite each other. Exactly one can succeed.
FR-ALIAS-12 An alias becomes immutable after first publication.
FR-ALIAS-13 The interface MUST report invalid or unavailable aliases before publication when practical. The server MUST repeat all checks at publication time.
FR-ALIAS-14 Alias lookup MUST use the exact complete normalized path. Prefix-related aliases, such as burke and burke/links, are independent and can both exist.
11.6 List publication
FR-PUB-01 A list description is optional.
FR-PUB-02 The application MUST disable or reject publication while:
The list has no links.
Any metadata request is pending.
The requested alias is invalid.
The requested alias is unavailable.
FR-PUB-03 Anonymous publication MUST show a modal confirmation before it writes data.
FR-PUB-04 The anonymous confirmation MUST state that publication is permanent and that the list cannot be edited or deleted.
FR-PUB-05 Canceling the confirmation MUST return to the unchanged draft.
FR-PUB-06 Successful publication MUST navigate to the canonical public path.
FR-PUB-07 The server is the final authority for validation, alias allocation, ownership, and mutation.
FR-PUB-08 The application MUST show a clear recoverable error when publication fails. It MUST retain the draft.
11.7 Anonymous list lifecycle
FR-ANON-01 A signed-out user MUST be able to publish.
FR-ANON-02 A published anonymous list MUST have no account owner.
FR-ANON-03 A published anonymous list MUST be immutable.
FR-ANON-04 A published anonymous list MUST be non-deletable through product interfaces and normal product APIs.
FR-ANON-05 Its alias MUST remain reserved permanently.
FR-ANON-06 Login after publication MUST NOT claim or change the anonymous list.
FR-ANON-07 Anonymous lists MUST NOT appear in any user's My Lists page.
11.8 Mock GitHub authentication
FR-AUTH-01 The local application MUST provide a mock GitHub identity provider.
FR-AUTH-02 The provider MUST expose at least two selectable identities with stable, distinct:
User IDs
User names
Avatar values or placeholders
FR-AUTH-03 The login interface MUST make clear that it is a local mock provider.
FR-AUTH-04 Selecting an identity MUST create a local authenticated session.
FR-AUTH-05 The current identity MUST survive a page reload until logout or test reset.
FR-AUTH-06 Logout MUST end the authenticated session.
FR-AUTH-07 Product authorization MUST use the stable user ID, not the displayed name.
FR-AUTH-08 The authentication boundary SHOULD be replaceable by a real provider adapter without changing list ownership rules.
FR-AUTH-09 The login selector MUST show the two identities in a deterministic order. The first is benchmark user A and the second is benchmark user B. Each selection control MUST have the accessible name Continue as {display name}.
11.9 Account-owned list lifecycle
FR-OWN-01 A list published while signed in MUST be owned by the current mock GitHub identity.
FR-OWN-02 Only the owner can edit, save, delete, or restore the list.
FR-OWN-03 A non-owner MUST receive an authorization failure for a direct mutation request, even if the interface hides the control.
FR-OWN-04/s/edit/{alias} MUST load the list from persistent storage. It MUST work after direct navigation and page reload.
FR-OWN-05 The edit page MUST show the alias as read-only.
FR-OWN-06 The owner can change:
List description
Link membership
Link order
Link titles
Link descriptions
FR-OWN-07 The owner cannot change link destination URLs or the list alias.
FR-OWN-08 The owner MUST confirm deletion in a modal.
FR-OWN-09 Deletion MUST be a soft delete. It MUST retain the content and ownership needed for indefinite restoration.
FR-OWN-10 There is no permanent-delete product action.
FR-OWN-11 Restore MUST reactivate the same list, alias, content, and order.
FR-OWN-12 A restored list MUST again appear at its original public path.
11.10 My Lists
FR-MY-01/s/mylists MUST require authentication.
FR-MY-02 The page MUST show only lists owned by the current user.
FR-MY-03 Active and deleted lists MUST be in distinct, labeled sections.
FR-MY-04 An active list summary MUST show:
Alias
Description when present
Link count
FR-MY-05 Selecting an active list MUST open /s/edit/{alias}.
FR-MY-06 A deleted list summary MUST provide Restore.
FR-MY-07 An empty active or deleted section MUST show an explicit empty state.
FR-MY-08 The page MUST provide Create new list.
11.11 Public list page
FR-PUBLIC-01 An active list MUST be available without authentication.
FR-PUBLIC-02 The public heading MUST use the list description. If the description is blank, it MUST use the alias.
FR-PUBLIC-03 Links MUST appear in saved order.
FR-PUBLIC-04 Each link card MUST show:
Image or neutral placeholder
Title, or destination hostname or URL when title is blank
Description when present
Destination URL
FR-PUBLIC-05 Selecting a link MUST open its immutable HTTP or HTTPS destination.
FR-PUBLIC-06 A new browsing context MUST use safe opener isolation, such as noopener and noreferrer.
FR-PUBLIC-07 The page MUST provide a Links view and a QR code view.
FR-PUBLIC-08 The current view control MUST expose its selected state to assistive technology.
FR-PUBLIC-09 The page MUST provide:
Copy link
A share link for X or Twitter
A share link for Facebook
A share link for LinkedIn
FR-PUBLIC-10 Share targets MUST include the correctly percent-encoded canonical public URL. Where supported, they MUST include the encoded list heading.
FR-PUBLIC-11Copy link MUST copy the canonical absolute public URL and announce success or failure.
11.12 QR code
FR-QR-01 The QR code MUST encode the canonical absolute URL of the public list, not an individual destination.
FR-QR-02 A standard QR decoder MUST be able to recover the exact canonical URL.
FR-QR-03 The QR code MUST have sufficient contrast in light and dark themes.
FR-QR-04 The QR code MUST have an accessible text alternative or adjacent text that identifies its encoded URL.
11.13 Never-used alias
FR-NOTFOUND-01 A valid alias that has never been used MUST show a not-found state.
FR-NOTFOUND-02 The state MUST say that the list was not found.
FR-NOTFOUND-03 The state MUST provide a call to action to create a list with that alias prefilled.
FR-NOTFOUND-04 The call to action MUST NOT silently overwrite a non-empty draft.
FR-NOTFOUND-05 An invalid or reserved path MUST use a generic not-found or invalid-path state. It MUST NOT offer that path as an available alias.
11.14 Deleted-list tombstone
FR-TOMB-01 A deleted account-owned list MUST show a neutral public message: This list was deleted.
FR-TOMB-02 The public tombstone MUST NOT disclose the old description, links, owner name, or deletion reason.
FR-TOMB-03 If the signed-in visitor is the owner, the tombstone MUST also provide Restore.
FR-TOMB-04 Other visitors and other signed-in users MUST not see a restore control.
11.15 Themes
FR-THEME-01 The application MUST provide Light, Dark, and System choices.
FR-THEME-02 The selected choice MUST persist in the browser across reloads.
FR-THEME-03 System mode MUST follow the operating system color preference.
FR-THEME-04 The initial page render SHOULD avoid a visible flash of the wrong theme.
FR-THEME-05 All evaluated content and controls MUST keep WCAG 2.2 AA contrast in each theme.
12. Data requirements
The physical schema is implementation-specific. The implementation must preserve the following logical data.
12.1 User
Field
Rule
Stable user ID
Required and unique. Used for authorization.
Provider
github-mock or an equivalent documented value.
Display name
Required.
Avatar
URL, local asset path, or deterministic placeholder.
12.2 List
Field
Rule
Stable list ID
Required and not derived only from the mutable storage location.
Canonical alias
Required, normalized, unique, and immutable.
Description
Optional text.
Ownership type
anonymous or account.
Owner user ID
Required for account ownership. Null for anonymous ownership.
Status
active or deleted. Anonymous lists can only be active.
Ordered links
One or more links for a published active list.
Created time
Required.
Updated time
Required for account-owned lists.
Deleted time
Required while deleted.
12.3 Link
Field
Rule
Stable link ID
Required and unique within its list.
Position
Defines total order within the list.
Destination URL
Required, absolute HTTP or HTTPS, and immutable after creation.
Title
Optional author-editable text.
Description
Optional author-editable text.
Image URL
Optional enrichment-controlled HTTP or HTTPS URL.
Metadata state
pending, succeeded, or failed in a draft or edit session.
Metadata error
Optional safe user-facing category or message.
12.4 Persistence
DR-PERSIST-01 Published anonymous lists, account-owned lists, deleted lists, ownership, and aliases MUST survive a complete application restart.
DR-PERSIST-02 The one unpublished draft and theme preference MUST persist in browser storage.
DR-PERSIST-03 Resetting browser storage MAY remove the local draft and theme preference. It MUST NOT remove published server-side data.
DR-PERSIST-04 The test reset mechanism is the only required way to clear all benchmark data.
DR-PERSIST-05 Soft deletion MUST not erase list content.
13. State and feedback requirements
The interface must represent important asynchronous and exceptional states.
13.1 Required states
Operation
Required visible states
Initial application load
Loading, loaded, fatal error with retry or reload
Metadata enrichment
Pending per link, succeeded, failed
Alias check
Checking when asynchronous, available, invalid, unavailable
Publication
Ready, blocked with reason, publishing, success, failure
Save
Saving and success/failure, unless a synchronous save completes without perceptible delay
My Lists
Loading, active results, deleted results, empty, failure with retry
Public list
Loading, active, never used, deleted, failure
Copy link
Success or failure announcement
Login
Signed out, identity selection, signed in, failure
13.2 Feedback rules
UX-STATE-01 Error text MUST explain what the user can do next.
UX-STATE-02 A failed network or server action MUST NOT falsely show success.
UX-STATE-03 A failed publish or save MUST preserve unsaved user input.
UX-STATE-04 Success and error messages that appear without focus change MUST use an appropriate live region.
UX-STATE-05 A disabled publish control MUST have an adjacent explanation or equivalent discoverable reason.
UX-STATE-06 Destructive actions MUST use clear action names. Do not use an ambiguous OK label when Delete list or Publish permanently is possible.
14. Security and privacy requirements
14.1 Authorization
SEC-AUTHZ-01 The server MUST enforce owner checks for every edit, save, delete, and restore operation.
SEC-AUTHZ-02 Hiding a control in the client is not an authorization control.
SEC-AUTHZ-03 The server MUST derive account ownership from the authenticated session. It MUST ignore a client-supplied owner ID.
SEC-AUTHZ-04 Anonymous publication MUST set anonymous ownership on the server.
SEC-AUTHZ-05 The server MUST reject all normal mutation requests for anonymous published lists.
SEC-AUTHZ-06 A list lookup MUST distinguish active, deleted, and never-used aliases without exposing private content.
14.2 Input and output safety
SEC-INPUT-01 The server MUST validate URLs, aliases, list content, and ownership rules independently of client validation.
SEC-INPUT-02 User-provided titles, descriptions, aliases, and metadata MUST render as text, not executable markup.
SEC-INPUT-03 The application MUST prevent script execution from stored or reflected content.
SEC-INPUT-04 Share URLs MUST use correct encoding. User content MUST not inject additional share parameters.
SEC-INPUT-05 State-changing requests MUST use the platform's appropriate cross-site request protection.
SEC-INPUT-06 Error responses MUST not expose stack traces, credentials, local paths, or internal connection details to end users.
14.3 Live metadata fetch safety
Metadata enrichment is a server-side request to a user-provided URL. The implementation must reduce server-side request forgery risk.
SEC-FETCH-01 The fetcher MUST allow only HTTP and HTTPS.
SEC-FETCH-02 The fetcher MUST reject URLs with embedded credentials.
SEC-FETCH-03 The fetcher MUST reject destinations that resolve to:
Loopback addresses
Private network ranges
Link-local ranges
Multicast ranges
Unspecified or reserved ranges
Cloud instance metadata addresses
SEC-FETCH-04 The fetcher MUST validate all resolved addresses before connection.
SEC-FETCH-05 The fetcher MUST repeat scheme, host, and address validation after every redirect.
SEC-FETCH-06 The fetcher MUST use a redirect limit of five or fewer.
SEC-FETCH-07 DNS rebinding protection MUST ensure that the connected address remains an allowed public address.
SEC-FETCH-08 The complete enrichment network operation, including redirects and body reading, MUST stop no later than 10 seconds after it starts.
SEC-FETCH-09 The fetcher MUST limit downloaded content. A maximum response body of 2 MiB or less is acceptable.
SEC-FETCH-10 The fetcher SHOULD accept only HTML or XHTML content for document parsing.
SEC-FETCH-11 The fetcher MUST not forward application cookies, authorization headers, or user credentials to the destination.
SEC-FETCH-12 Metadata text and URLs MUST receive the same output-safety treatment as direct user input.
14.4 Privacy
SEC-PRIV-01 Anonymous public lists MUST not store a hidden browser identity or account owner.
SEC-PRIV-02 Deleted tombstones MUST not expose deleted content or owner details.
SEC-PRIV-03 The mock provider MUST use fictional test identities.
SEC-PRIV-04 Documentation MUST state that link metadata fetching sends a server request to the submitted destination.
15. Accessibility requirements
The evaluated user journeys must conform to WCAG 2.2 AA.
15.1 Structure and names
A11Y-01 Each page MUST have one descriptive level-one heading.
A11Y-02 Headings MUST follow a logical hierarchy.
A11Y-03 Every form control and icon-only button MUST have an accessible name.
A11Y-04 Form errors MUST be programmatically associated with their controls.
A11Y-05 Required and invalid states MUST be available to assistive technology.
A11Y-06 Images MUST have useful alternative text or empty alternative text when decorative.
15.2 Keyboard and focus
A11Y-07 All actions MUST work without a pointer.
A11Y-08 Keyboard focus MUST be visible in all themes.
A11Y-09 Focus order MUST follow the visual and reading order.
A11Y-10 Link reordering MUST provide keyboard controls, such as Move up and Move down.
A11Y-11 A modal MUST:
Move focus to itself when opened.
Keep focus within the modal while open.
Close on Escape when cancellation is allowed.
Return focus to the control that opened it.
Have an accessible title and modal semantics.
A11Y-12 After link deletion or reordering, focus MUST move to a logical nearby control.
15.3 Status and presentation
A11Y-13 Loading, metadata, save, publish, copy, and error status changes MUST be announced when necessary.
A11Y-14 Color MUST not be the only way to communicate state.
A11Y-15 Text and meaningful controls MUST meet WCAG 2.2 AA contrast.
A11Y-16 The interface MUST remain usable at 200% browser zoom.
A11Y-17 Reflow MUST not require two-dimensional page scrolling at a 320 CSS-pixel viewport, except for content that inherently needs it. No evaluated content inherently needs it.
A11Y-18 Pointer targets SHOULD meet the WCAG 2.2 target-size guidance.
A11Y-19 Motion MUST respect prefers-reduced-motion.
16. Responsive requirements
The implementation must support current Chromium at:
A desktop viewport
A mobile-width viewport down to 320 CSS pixels
The exact breakpoints are implementation-specific.
RESP-01 Desktop navigation can be horizontal.
RESP-02 Mobile navigation can collapse into a labeled menu.
RESP-03 The list-detail fields and publication control can share a desktop row, but MUST stack at a mobile width.
RESP-04 Editable and public link cards MUST not clip the title, URL, primary actions, or keyboard reorder controls.
RESP-05 A link image MAY become smaller or move at a mobile width.
RESP-06 My Lists cards MUST change from a multi-column grid to fewer columns or one column as space decreases.
RESP-07 Modals MUST fit the viewport and permit internal scrolling when necessary.
RESP-08 Share and view controls MUST remain available at a mobile width.
17. Information architecture
17.1 Home
The home page introduces the product and has the fastest path to a new list. The primary control is the first-link URL field.
Required content:
Brand and global navigation
Product heading and short explanatory copy
First-link URL field
Submit action
URL validation feedback
Optional decorative illustration
17.2 New list
The new-list page is the main composition workspace.
Required content:
Alias field with guidance and availability state
Optional list description
Publish control and blocking reason
Add-link URL field
Ordered editable link cards
Per-link metadata state
Delete and keyboard reorder controls
17.3 Edit list
The edit page uses the same composition workspace with these differences:
The alias is read-only.
The list loads from persistent storage by alias.
The primary action is Save.
The page provides Delete list.
Only the owner can enter this page.
17.4 My Lists
Required content:
Create new list
Active list section
Deleted lists section
Alias, description, and link count on active summaries
Restore action on deleted summaries
Empty and loading states
17.5 Public list
Required content:
List heading
Copy and platform-share controls
Links/QR view selector
Ordered link cards or QR code
Public loading, not-found, and deleted states
18. Low-fidelity wireframes
Wireframes define information order and important controls. They do not define colors, fonts, exact dimensions, or component libraries.
18.1 Desktop home
+--------------------------------------------------------------------------------+
| THE URLIST New Theme Login / User menu |
+--------------------------------------------------------------------------------+
| |
| Group links, save and share them [ optional brand illustration ] |
| with the world. |
| |
| Add links to a list and share it |
| with one simple URL. |
| |
+--------------------------------------------------------------------------------+
| Get Started |
| |
| Link URL |
| [ https://example.com...................................................... ] |
| [ validation or help text ] [ Add link ] |
+--------------------------------------------------------------------------------+
18.2 Mobile home
+--------------------------------------+
| THE URLIST [Menu] |
+--------------------------------------+
| Group links, save and share them |
| with the world. |
| |
| Add links to a list and share it |
| with one simple URL. |
| |
| Get Started |
| Link URL |
| [ https://example.com............. ] |
| [ validation or help text ] |
| [ Add link ] |
+--------------------------------------+
18.3 Desktop new or edit list
+--------------------------------------------------------------------------------+
| THE URLIST New My Lists Theme User menu |
+--------------------------------------------------------------------------------+
| Alias Description Primary action |
| [ burke/links.............. ] [ Useful web resources...... ] [ Publish / Save ] |
| [ availability or error ] |
+--------------------------------------------------------------------------------+
| Add a link |
| [ https://destination.example................................ ] [ Add link ] |
| |
| Links Drag or use buttons |
| +----------------------------------------------------------------------------+ |
| | [handle] [image] [ Title................................................. ] | |
| | [ Description........................................... ] | |
| | https://destination.example [Pending/Succeeded/Failed] | |
| | [Move up] [Move down] [Delete] | |
| +----------------------------------------------------------------------------+ |
| +----------------------------------------------------------------------------+ |
| | [handle] [image] [ Title................................................. ] | |
| | [ Description........................................... ] | |
| | https://another.example [Succeeded] | |
| | [Move up] [Move down] [Delete] | |
| +----------------------------------------------------------------------------+ |
| |
| [ Delete list ] (edit) |
+--------------------------------------------------------------------------------+
+--------------------------------------------------------------+
| We could not find this Urlist. |
| |
| The alias "burke/links" is available. |
| |
| [ Create a list with this alias ] |
+--------------------------------------------------------------+
18.9 Deleted tombstone
+--------------------------------------------------------------+
| This list was deleted. |
| |
| [ Restore ] <- visible only to the signed-in owner |
+--------------------------------------------------------------+
18.10 Mock login modal
+--------------------------------------------------------------+
| Sign in with local mock GitHub [X] |
| |
| [avatar] Mock GitHub User One [ Continue as User One ]|
| [avatar] Mock GitHub User Two [ Continue as User Two ]|
| |
| [ Cancel ] |
+--------------------------------------------------------------+
18.11 Anonymous publication confirmation
+--------------------------------------------------------------+
| Publish this list permanently? |
| |
| You are not signed in. After publication, you cannot edit |
| or delete this list. Its alias stays reserved permanently. |
| |
| [ Publish permanently ] [ Cancel ] |
+--------------------------------------------------------------+
18.12 Delete confirmation
+--------------------------------------------------------------+
| Delete this list? |
| |
| The public page will show a deleted message. You can restore |
| the list later from My Lists. |
| |
| [ Delete list ] [ Cancel ] |
+--------------------------------------------------------------+
19. Benchmark execution contract
19.1 Repository deliverables
The model-produced repository must contain:
Complete application source
Dependency manifests and lock files where the ecosystem supports them
Database schema and migrations or an equivalent repeatable initializer
Automated tests
A README with setup and operation instructions
A documented test reset mechanism
No required access to the original source repository
Generated build output and installed dependency folders should not be committed unless the selected ecosystem normally requires them.
19.2 Setup flexibility
The benchmark does not prescribe one startup command or Docker.
The README must state:
Supported operating system or runtime assumptions
Required tool versions
Dependency installation steps
Storage initialization steps
Application startup steps
The local base URL
How to select each mock GitHub user
How to reset and seed benchmark data
How to run automated tests
Any environment variables, with safe example values
The application must not require paid infrastructure or private credentials.
19.3 Local operation
BENCH-RUN-01 The complete application MUST run on a local machine.
BENCH-RUN-02 A real cloud database, real OAuth application, or deployed server MUST NOT be required.
BENCH-RUN-03 The implementation MAY use a local database, embedded database, container, or persistent files.
BENCH-RUN-04 The implementation MUST fetch live public websites for metadata enrichment. Internet access is therefore required for those scenarios.
BENCH-RUN-05 If the application has separate client and server processes, the README MUST explain how to start both.
19.4 Test-only reset and seed
The implementation must provide a development/test-only control that:
Deletes all published and deleted benchmark lists
Clears server-side sessions when practical
Restores the two stable mock GitHub identities
Returns the application to a known clean server state
Can run repeatedly with the same result
The preferred contract is:
POST /__test/reset
Expected success:
204 No Content
An implementation can use a different mechanism only if it is scriptable, documented, and does not require manual database work.
BENCH-RESET-01 The reset mechanism MUST be enabled in development or test mode.
BENCH-RESET-02 The reset mechanism MUST be disabled or strongly protected in production mode.
BENCH-RESET-03 The README MUST explain how the browser harness can also clear browser storage and cookies.
BENCH-RESET-04 The two user identities MUST be deterministic across resets.
19.5 Stable automation surfaces
The implementation must keep these visible labels or equivalent accessible names:
New
My Lists
Login
Log out
Add link
Publish
Save
Delete list
Restore
Copy link
Links
QR code
Light
Dark
System
Move up
Move down
Continue as {display name}
The implementation should use semantic HTML. Test-only data-* attributes are permitted, but tests should prefer roles and accessible names.
The mock identity list must use deterministic order. The first control selects benchmark user A and the second selects benchmark user B.
19.6 Evaluator inputs
This document tells the model which behaviors are tested. It does not provide the exact evaluator values.
The evaluator can keep these values private:
Mock user names and IDs, if the implementation lets the evaluator configure them
Valid and invalid aliases
Reserved-path probes
Live public metadata URLs
Metadata documents and expected extracted values
Hostile content strings
Ownership-isolation sequence
Restart timing and storage location
The evaluator must not test an undisclosed product category. Hidden values and edge cases must still follow this document.
19.7 Live website evaluation note
Live websites can change or become unavailable. The evaluator should select stable, public test pages under evaluator control when possible. These pages must be reached through public internet DNS and HTTP or HTTPS. They must not use a local fixture server.
The evaluator should provide pages for:
Open Graph metadata
Twitter Card fallback metadata
Standard HTML fallback metadata
Relative image resolution
A slow response that exceeds 10 seconds
A failed HTTP response
The evaluator must record the target URL and expected document content with the benchmark result.
A scenario earns its listed points only when all required assertions pass, unless the scenario defines partial credit.
The evaluator must start each independent scenario from a documented state.
The evaluator can combine scenarios to reduce runtime.
The evaluator must use implementation-neutral browser and HTTP behavior.
A crash, data corruption, authorization bypass, or test-reset failure can affect all dependent scenarios.
Exact test values remain private.
20.2 Category summary
Category
Points
A. Local operation, reset, identity, and restart persistence
6
B. Draft, links, and metadata
15
C. Alias and publication rules
13
D. Account ownership and lifecycle
14
E. Public viewing, sharing, and QR code
12
F. Theme, responsive behavior, and accessibility
10
G. Failure handling and security probes
5
Automated total
75
20.3 A. Local operation, reset, identity, and restart persistence: 6 points
ID
Pts
Preconditions and actions
Expected result
A1
1
Follow the README on a clean supported environment. Start the application.
The application starts without private credentials. The documented base URL serves the home page.
A2
1
Create data, run the documented reset-and-seed mechanism twice, and clear browser state.
Both resets succeed. All list data is gone. The application returns to the same clean state.
A3
2
Open Login. Select mock GitHub user A. Reload. Log out. Select user B.
Two distinct local GitHub identities are available. Login survives reload. Logout works. The visible identity changes correctly.
A4
2
Publish one account-owned list, one anonymous list, and soft-delete another account-owned list. Fully stop and restart the application without reset.
Active, anonymous, deleted, ownership, alias, and tombstone state all survive restart.
20.4 B. Draft, links, and metadata: 15 points
ID
Pts
Preconditions and actions
Expected result
B1
1
Signed out, enter a valid first link on /.
The app opens /s/new, creates one link, retains the URL, and starts enrichment.
B2
2
Submit empty, relative, non-HTTP, credential-bearing, malformed, and valid HTTP/HTTPS inputs. If scheme completion exists, use a domain-like input.
Invalid values are rejected with associated messages. Valid HTTP and HTTPS values work. Any completed scheme is shown.
B3
3
Add live public pages that exercise Open Graph, Twitter Card, standard HTML, and relative-image cases.
The app uses the required precedence, follows allowed redirects, resolves relative images against the final URL, and shows extracted metadata.
B4
2
Add one slow live URL and one failing live URL.
The network operation stops no later than 10 seconds, and each link shows failed within 11 seconds. The links remain. The user sees failure and can edit title and description.
B5
1
Try to publish or save while enrichment is pending.
The action is blocked with a visible reason. It becomes available after every request succeeds or fails.
B6
2
Add a link, then inspect and edit it.
Destination URL is readable but immutable. Title and description are editable. Image is not directly editable. Manual title and description values persist.
B7
1
Add the same destination twice and give the entries different display metadata.
Both independent entries remain and retain separate metadata.
B8
2
Add at least three links. Delete one. Reorder the others with pointer input and then with keyboard controls.
Membership and order update correctly. Keyboard controls are operable and named.
B9
1
Create a non-empty draft. Reload and navigate away and back. Select New and cancel the discard confirmation. Then confirm it.
The draft survives reload/navigation. Cancel preserves it. Confirm starts a clean draft.
20.5 C. Alias and publication rules: 13 points
ID
Pts
Preconditions and actions
Expected result
C1
2
Enter a mixed-case valid multi-segment alias. Publish.
The app normalizes it to lowercase, stores it once, and serves the list at the nested root path.
Values outside the defined grammar are rejected by both product behavior and direct server requests. Boundary-valid values are accepted.
C3
1
Try aliases under each minimum reserved first segment.
The aliases are rejected and application routes remain reachable.
C4
1
Leave the alias blank and publish a valid list.
The server allocates an available seven-character lowercase alphanumeric alias.
C5
2
Make two near-simultaneous publication requests for the same normalized alias.
Exactly one succeeds. The other reports unavailability or conflict. No data is overwritten.
C6
1
Try to publish an empty list and a list with one valid terminal-state link.
Empty publication is blocked or rejected. One-link publication succeeds.
C7
1
Signed out, select Publish, then cancel and retry.
A blocking irreversible-publication warning appears. Cancel preserves the draft.
C8
2
Confirm anonymous publication. Then try normal edit, delete, claim, and direct mutation paths as anonymous and signed in.
The list remains public, immutable, non-deletable, unclaimed, and permanently reserved.
C9
1
Sign in and publish a new list.
Publication is account-owned without an anonymous/account choice. It appears in that user's My Lists.
20.6 D. Account ownership and lifecycle: 14 points
ID
Pts
Preconditions and actions
Expected result
D1
2
As user A, publish multiple lists and open My Lists. Also sign in as user B.
User A sees only A's active summaries with alias, optional description, and correct link count. User B does not see them. Empty states are clear.
D2
2
As owner, directly open and reload /s/edit/{multi-segment-alias}.
The correct persistent list loads. Alias is read-only. A non-owner cannot enter an editable state.
D3
2
As owner, change description, titles, descriptions, membership, and order, then save or wait for explicit autosave. Reload public and edit pages.
All permitted changes persist. Public rendering uses the new content and order.
D4
1
Try to change the published alias through the interface and a direct request.
The alias cannot be changed. The original path remains canonical.
D5
3
As user B, issue direct edit, save, delete, and restore requests for user A's list.
Every mutation is denied. The list and ownership remain unchanged. No client-supplied owner value bypasses the check.
D6
2
As owner, select Delete list, cancel once, then confirm. Open My Lists and the public path.
Cancel changes nothing. Confirm soft-deletes. The list moves to Deleted lists. The public path shows a neutral tombstone.
D7
2
Restore the list from Deleted lists. Delete it again and restore it from the owner-visible tombstone.
Both restore paths reactivate the same alias, content, link order, and ownership. There is no permanent-delete product action.
20.7 E. Public viewing, sharing, and QR code: 12 points
ID
Pts
Preconditions and actions
Expected result
E1
2
Open public lists with and without list descriptions, link titles, descriptions, and images.
Public access needs no login. Saved order is correct. Heading and card fallbacks follow the specification. Missing optional content does not break layout.
E2
1
Activate a public link card with pointer and keyboard. Inspect the opened target behavior.
Switch to QR view and decode the rendered code. Test both themes.
The code decodes to the exact canonical absolute public URL and remains usable in each theme.
E4
1
Select Copy link and read the clipboard. Also simulate clipboard failure when supported by the harness.
The canonical absolute URL is copied. Success or failure is announced.
E5
2
Inspect and open X/Twitter, Facebook, and LinkedIn share controls for a list with reserved characters in its heading and path.
Each target contains the correctly encoded canonical URL and, where supported, heading. No parameter injection occurs.
E6
2
Open a valid alias that was never used. Select its create action with an empty draft, then repeat with a non-empty draft.
The page says not found and offers the alias. The empty draft receives the alias. Existing draft content is not silently overwritten.
E7
2
Open a deleted path signed out, as a non-owner, and as the owner.
All see only the neutral deleted message. Only the owner sees Restore. Old content and owner details are absent.
20.8 F. Theme, responsive behavior, and accessibility: 10 points
ID
Pts
Preconditions and actions
Expected result
F1
2
Select Light, Dark, and System in turn. Reload after each selection and change the emulated OS preference in System mode.
Choice persists. System follows OS preference. Controls and content remain readable.
F2
2
Exercise home, new/edit, My Lists, public list, QR, menus, and modals at desktop and 320 CSS-pixel widths.
Content reflows without page-level two-dimensional scrolling. Primary controls remain visible and usable.
F3
2
Complete create, login, edit, reorder, publish, delete, restore, view toggle, copy, and logout journeys with keyboard only.
Every action works. Focus is visible and follows a logical order. Reorder does not require drag-and-drop.
F4
2
Trigger URL, alias, metadata, publication, copy, and server errors. Open and close each modal with keyboard.
Controls have names. Errors are associated. statuses are announced. Modal focus is trapped and restored. Escape cancels when allowed.
F5
2
Run an automated accessibility scanner on evaluated pages and inspect headings, labels, selected states, and contrast in both themes.
There are no critical or serious WCAG 2.2 A/AA findings in application-owned UI. Required semantics and contrast pass.
20.9 G. Failure handling and security probes: 5 points
ID
Pts
Preconditions and actions
Expected result
G1
2
Cause a publication or save server failure after entering valid content. Retry after recovery.
The app reports failure, does not show false success, retains input, and succeeds on a valid retry without duplicate corruption.
G2
2
Submit metadata URLs for loopback, private, link-local, metadata-service, redirect-to-private, and DNS-rebinding-style targets supported by the harness.
The server rejects unsafe targets and does not connect to protected addresses. Safe public targets still work.
G3
1
Put HTML, script, event-handler, and share-parameter payloads in user-editable and remotely enriched text. View public, My Lists, edit, tombstone, and share surfaces.
Payloads render safely as text or are safely omitted. No script runs and no share parameter is injected.
21. Human-review scorecard: 25 points
21.1 Review method
Human review contributes 25 points. Reviewers must cite short evidence for each deduction. Reviewers should judge the submitted implementation, not personal framework preferences.
Use these anchors:
Full points: Complete, coherent work with no material problem.
About half points: The main intent is present, but important roughness or risk remains.
Zero points: Missing, unusable, unsafe, or fundamentally incorrect.
Intermediate integer scores are allowed.
21.2 Category summary
Category
Points
H1. UX coherence and responsive usability
5
H2. Accessibility quality
4
H3. Security and privacy
5
H4. Maintainability and architecture
4
H5. Automated test quality
4
H6. Setup and operational documentation
3
Human total
25
21.3 H1. UX coherence and responsive usability: 5 points
5 points
Journeys are easy to understand without repository knowledge.
Primary and destructive actions have clear hierarchy.
Pending, failed, empty, deleted, and success states are useful.
Desktop and mobile layouts feel intentionally designed.
Anonymous permanence is clear before publication.
About 2–3 points
Core flows work, but labels, feedback, layout, or state transitions cause confusion.
Mobile behavior is functional but rough.
0 points
Important flows are unusable or misleading.
Destructive or permanent actions are not understandable.
21.4 H2. Accessibility quality: 4 points
4 points
Semantic structure is strong.
Keyboard and focus behavior are predictable.
Announcements are useful and not noisy.
The design remains usable with zoom, reflow, reduced motion, and both themes.
No important issue remains after automated checks.
About 2 points
Basic keyboard and labeling work, but focus, announcements, reflow, or semantics have notable gaps.
0 points
A primary journey cannot be completed with a keyboard or assistive technology.
21.5 H3. Security and privacy: 5 points
5 points
Authorization is centralized and server-enforced.
Anonymous and account lifecycle boundaries are correct.
Live fetching has credible SSRF defenses at resolution, connection, and redirect stages.
User and remote content is safely rendered.
Errors and logs avoid secrets and sensitive internals.
Test-only controls are isolated from production mode.
About 2–3 points
Main authorization and output safety are present, but fetch hardening or environment isolation is incomplete.
0 points
There is a practical ownership bypass, stored script execution, unsafe private-network fetch, exposed credential, or production data-reset path.
Critical cap: A confirmed practical authorization bypass or server-side request forgery vulnerability caps the total benchmark score at 50 until fixed.
21.6 H4. Maintainability and architecture: 4 points
4 points
Product, persistence, identity, enrichment, and presentation concerns have clear boundaries.
Types and validation are consistent across client and server boundaries.
Code avoids unnecessary duplication and hidden coupling.
Error handling is explicit.
The design can replace the mock identity adapter without changing ownership logic.
About 2 points
The code is understandable, but some duplication, coupling, broad error handling, or weak types increase change risk.
0 points
The implementation is largely hardcoded, tangled, or unsafe to change.
Tests are deterministic except for clearly isolated live-network checks.
Unit, integration, and end-to-end coverage are selected appropriately.
Test names explain behavior.
About 2 points
Useful happy-path tests exist, but lifecycle, authorization, or failure paths have major gaps.
0 points
Tests are absent, trivial, consistently failing, or only assert implementation details.
21.8 H6. Setup and operational documentation: 3 points
3 points
A new reviewer can install, initialize, start, reset, seed, test, and restart the application from the README.
Required versions and environment variables are clear.
Live metadata behavior and its privacy/security limits are explained.
Troubleshooting covers likely local failures.
About 1–2 points
Setup works with inference or minor repair, but important steps are unclear.
0 points
The reviewer cannot run the application from the documentation.
22. Final score
Final score = automated score (0–75) + human-review score (0–25)
Maximum = 100
Suggested interpretation:
Score
Interpretation
90–100
Comprehensive and production-minded implementation
75–89
Strong implementation with limited gaps
60–74
Functional core with important omissions
40–59
Partial implementation or serious quality defects
0–39
Incomplete or unsafe implementation
The score ranges are descriptive. Benchmark reports must also show category scores and failed scenario IDs.
23. Requirement-to-evaluation traceability
This table shows where required behavior is evaluated. It does not reveal exact test values.
Requirement area
Primary automated scenarios
Human review
Local operation and documentation
A1, A2
H6
Persistent server data
A4
H4, H6
Browser-local draft
B1, B9
H1
URL validation and immutability
B2, B6
H1, H3
Link creation, duplicates, deletion, and order
B7, B8, D3
H1, H2
Live metadata extraction
B3, B4, B5
H3, H4
Metadata fetch security
G2
H3
Alias grammar and allocation
C1–C5
H3, H4
Anonymous publication
C6–C8
H1, H3
Mock GitHub login
A3, C9
H1, H4
Account ownership and isolation
D1–D5
H3, H4
Delete, tombstone, and restore
D6, D7, E7
H1, H3
My Lists
D1, D6, D7
H1, H2
Public list rendering
E1, E2
H1, H2
Sharing and clipboard
E4, E5
H1, H2, H3
QR code
E3
H1, H2
Never-used alias
E6
H1
Themes
F1
H1, H2
Responsive layout
F2
H1, H2
Keyboard, focus, labels, and status
F3–F5
H2
Failure recovery
G1
H1, H4
Content and parameter injection
G3
H3
Code organization and tests
Not black-box scored
H4, H5
Requirements marked SHOULD, repository organization, code clarity, test depth, and documentation quality are mainly human-reviewed. Concurrent-edit behavior and performance are intentionally not scored.
24. Evaluator report template
Each benchmark result should include:
Model:
Model version:
Benchmark document version:
Run date:
Allowed work time:
Environment:
Application commit:
Automated:
A Local/reset/identity/persistence: __ / 6
B Draft/links/metadata: __ / 15
C Alias/publication: __ / 13
D Ownership/lifecycle: __ / 14
E Public/share/QR: __ / 12
F Theme/responsive/accessibility: __ / 10
G Failure/security: __ / 5
Automated subtotal: __ / 75
Human:
H1 UX: __ / 5
H2 Accessibility: __ / 4
H3 Security/privacy: __ / 5
H4 Maintainability: __ / 4
H5 Tests: __ / 4
H6 Documentation: __ / 3
Human subtotal: __ / 25
Critical score cap applied: Yes / No
Final score: __ / 100
Failed scenario IDs:
Reviewer evidence:
Live metadata targets and captured expectations:
Known evaluator incidents:
An evaluator incident is an infrastructure or live-website problem that is not caused by the implementation. The report must separate such incidents from product failures.
25. Source reconciliation and intentional deviations
This standalone specification is based on the product behavior of the reference project. It resolves incomplete, contradictory, or legacy behavior as follows.
Reference behavior or issue
Canonical benchmark requirement
The product copy says anonymous creation is possible, but the reference publish control and server require login.
Anonymous users can publish after a permanent-action confirmation.
Anonymous ownership and later editing are not safely defined.
Anonymous publication is immutable, non-deletable, non-claimable, and reserves the alias permanently.
The reference client allows only letters, digits, and hyphens, while the server suggests nested path aliases.
Multi-segment aliases are required with one defined grammar and lowercase normalization.
The reference can hard-delete a list and release its alias.
Account deletion is a permanent soft-delete state with indefinite restoration and a reserved alias.
The reference edit route depends on selected client state.
/s/edit/{alias} loads directly from persistent storage and survives reload.
Social-share markup contains residue from another UI framework and may not work.
Copy link and three correctly encoded platform share links must work.
Twitter/X migration depends on a legacy external service.
Migration is excluded.
The reference has an email-based report link.
Reporting is excluded.
The reference includes a long Terms page, empty Privacy page, and external About link.
Legal and informational pages are excluded.
The reference metadata title precedence can favor HTML title before Open Graph.
Open Graph, then Twitter Card, then standard HTML fallback is canonical.
The reference allows publication while asynchronous enrichment can still run.
Publish and save wait until each request succeeds or fails.
The reference uses a 20-second client cancellation period.
Each complete enrichment attempt has a 10-second limit.
The reference permits destination URL editing after enrichment.
Destination URL is immutable after link creation. Delete and re-add to change it.
The reference uses real hosted OAuth providers.
A local mock GitHub provider with two identities is required.
The reference architecture uses Blazor WebAssembly, Azure Functions, and Cosmos DB.
Technology is not prescribed. Observable behavior is prescribed.
The reference provides light, dark, and system themes.
Theme behavior remains required with a small score weight.
The reference supports QR rendering for the list URL.
A scannable public-list QR code remains required.
These decisions are part of the benchmark. An implementation must follow this document instead of trying to reproduce a conflicting reference behavior.
26. Implementation guidance that is not scored directly
These patterns can reduce implementation risk:
Use one canonical alias normalization function in both availability and write paths.
Put authorization in the server-side list service or mutation boundary.
Store ownership type separately from owner ID.
Use a soft-delete status instead of moving deleted rows to an unrelated store.
Use stable link IDs and explicit positions.
Separate metadata retrieval from metadata parsing.
Put outbound request validation in a dedicated fetch policy.
Abort metadata work when its 10-second deadline expires.
Use a real QR library rather than a decorative QR-like image.
Keep mock authentication behind an interface or adapter.
Use accessible sortable controls in addition to pointer drag-and-drop.
Treat local draft persistence errors as visible product errors when they prevent retention.
An implementation can use other patterns if all requirements pass.
27. Definition of done
The model-produced application is complete when:
The application runs locally from its README.
The product journeys in section 8 work.
All MUST requirements are implemented.
Published and deleted data survives a full restart.
Two mock GitHub identities work.
Reset and seed are repeatable.
Live metadata success, failure, timeout, fallback, and safety behavior work.
Anonymous and account lifecycle rules cannot be bypassed through direct requests.
Root and nested aliases route correctly.
Public share and QR controls produce the canonical URL.
Evaluated journeys work at desktop and mobile widths.
Evaluated journeys meet WCAG 2.2 AA.
Automated tests run from the documented command.
The repository contains no required secret.
The implementation does not depend on the original repository.
28. Benchmark limitations
Live internet metadata tests can vary because websites and networks change. Evaluators must record their targets and distinguish target incidents from implementation failures.
Human scores contain judgment. Anchors and written evidence reduce, but do not remove, reviewer variation.
This benchmark does not measure high-load behavior, large-scale storage, production deployment, or concurrent editing.
The mock identity provider tests ownership logic, not OAuth protocol compliance.
WCAG conformance applies to evaluated journeys and application-owned content. It does not assert full legal conformance for every possible page or third-party browser surface.
29. End of specification
This document is the only product input required for the benchmark. A model must not need the original repository, its issue tracker, its hosted deployment, or external design files to implement The Urlist.
This profile fixes the technical stack for The Urlist benchmark. It makes model results easier to compare.
The product PRD is the authority for product behavior. This profile is the authority for technology choices. If the documents appear to conflict:
Follow the PRD for user-visible behavior and evaluation.
Follow this profile for the implementation stack.
Document any remaining assumption and continue.
Do not use or inspect the original the-urlist/blazor-static-web-apps repository.
2. Required stack
Use:
Next.js with the App Router
React through Next.js
TypeScript with strict type checking
Node.js
npm
SQLite
Direct SQL through better-sqlite3
Vitest for unit and integration tests
Playwright for browser end-to-end tests
Do not use:
An ORM
A real OAuth provider
A cloud database
A required paid service
A second application framework
Static fixture metadata in place of the required live HTTP fetch
Use current stable, non-prerelease package versions when the project is created. Commit package-lock.json. The lock file is the version record for the run.
3. Repository and application setup
The model starts from a repository that contains benchmark documents and minimal repository metadata. It must scaffold the application.
The completed repository must:
Run as one Next.js application.
Use the Next.js App Router.
Keep application source, tests, SQL, and documentation in clear locations.
Include all required configuration.
Include .env.example with safe example values.
Exclude runtime database files, secrets, build output, and installed dependencies from Git.
Include a README that satisfies PRD section 19.2.
The model can choose the source directory layout. A src/ directory is recommended but not required.
4. Next.js requirements
4.1 Router
Use App Router pages and route handlers.
The route design must support:
Static application routes such as /s/new and /s/mylists
Reloadable edit routes with multi-segment aliases
Root-level public aliases with one or more segments
Exact alias lookup, including independent prefix-related aliases
Reserved application paths
Use a catch-all route only where it does not intercept required static routes. Normalize and validate aliases in application code. Do not rely on filesystem routing as the only alias validation.
4.2 Server runtime
Code that uses better-sqlite3, the file system, server sessions, or metadata retrieval must run in the Node.js runtime. It must not use the Edge runtime.
Do not expose the SQLite database or direct SQL helpers to client bundles.
4.3 Rendering and caching
The implementation can use server components, client components, route handlers, and server actions.
It must prevent stale product behavior:
A published list must become visible after publication.
Saved edits must appear on the public page.
A deleted list must show its tombstone.
A restored list must become active.
My Lists must show current persistent data.
Use dynamic rendering, explicit cache invalidation, or another correct Next.js mechanism. Do not depend on a process restart to refresh data.
4.4 Mutations
All product mutations must cross a server authorization boundary. A client component must not write directly to SQLite.
Server actions and route handlers are both permitted. The server must repeat validation and authorization.
5. TypeScript requirements
Enable strict mode.
The implementation must:
Avoid any unless an external untyped boundary makes it necessary.
Validate untrusted runtime input.
Use shared domain types or schemas where useful.
Model list ownership and list state explicitly.
Model metadata state explicitly.
Keep nullable and optional values intentional.
Avoid unsafe type assertions that bypass validation.
The model can select a small runtime validation library or implement focused validation without one.
6. SQLite requirements
6.1 Driver and SQL
Use better-sqlite3.
Use direct parameterized SQL. Do not use Prisma, Drizzle, Sequelize, TypeORM, or another ORM.
6.2 Schema management
Provide one of:
Ordered SQL migration files and a migration runner
An idempotent schema initializer with a schema-version table
The process must be repeatable on an empty database and an existing database.
The database must enforce important invariants where practical. These include:
Unique normalized alias
Stable list identity
Explicit ownership type
Nullable owner only for anonymous ownership
Active or deleted state
Stable ordered links
Foreign-key relationships
Enable SQLite foreign keys for every connection.
Use transactions for multi-row publication, save, delete, restore, and reset operations.
6.3 Database path
Use a documented environment variable for the database path. Provide a safe local default in development.
The database file must:
Persist across normal application restarts.
Be outside generated build output.
Be excluded from Git.
Be replaceable with a temporary path during tests.
6.4 Concurrency and uniqueness
Use a database uniqueness constraint as the final alias collision control. A preflight availability check is not sufficient.
Handle a uniqueness conflict as a normal product error. Do not overwrite an existing list.
7. Mock authentication requirements
Implement the two mock GitHub users in the application.
Use a server-verifiable session, such as a signed or opaque HTTP-only cookie. Do not trust a client-provided user ID without server verification.
The implementation must:
Keep the two users stable across reset.
List user A first and user B second.
Use the accessible control name required by the PRD.
Persist login across page reload.
End the session on logout.
Keep authorization checks on the server.
Do not call GitHub or implement OAuth.
8. Live metadata requirements
Fetch metadata on the server. Do not fetch and parse arbitrary destinations only in the browser.
The implementation must meet all PRD extraction, timeout, redirect, and SSRF rules.
Structure the code so these concerns can be tested separately:
URL validation
DNS and network-address policy
Redirect policy
HTTP request limits
HTML parsing
Metadata precedence
Relative URL resolution
Safe error mapping
Tests can mock lower-level network boundaries for unit and integration coverage. Product operation and scored metadata scenarios must use live HTTP.
9. Required npm scripts
package.json must provide:
Script
Purpose
dev
Start the local development application.
build
Create a production build.
start
Start the production build.
lint
Run the configured linter.
typecheck
Run TypeScript without emitting build output.
test
Run Vitest once in non-watch mode.
test:e2e
Run Playwright tests once.
db:init
Initialize or migrate the configured SQLite database.
db:reset
Reset development or test data safely.
The model can add scripts.
Scripts must return a nonzero status on failure. Test scripts must not start in watch mode.
10. Test requirements
10.1 Vitest
Use Vitest for focused tests of:
URL and alias validation
Alias normalization
Metadata precedence and relative URL handling
SSRF address policy
Ownership and mutation rules
SQLite repository behavior
Publication, delete, and restore transactions
Share URL construction
Use a temporary SQLite database for tests. Tests must not alter the normal development database.
10.2 Playwright
Use Playwright for core browser journeys:
Anonymous draft and publication
Mock login and logout
Account publication and My Lists
Owner edit, delete, tombstone, and restore
Non-owner control isolation
Public link and QR views
Theme persistence
Keyboard operation
Mobile-width layout
The repository test suite does not have to duplicate every hidden evaluator case. It must cover the connected product lifecycle.
10.3 Test isolation
Tests must:
Use a separate database.
Reset deterministic state.
Avoid order dependence.
Clean up processes they start.
Make live-network tests identifiable.
Avoid requiring private credentials.
11. Code quality and security
The implementation must:
Use parameterized SQL.
Centralize repeated validation and authorization.
Escape user and remote content.
Keep secrets and database files out of Git.
Use explicit errors. Do not silently convert failures into success.
Apply CSRF protection appropriate to the chosen mutation design.
Keep test reset controls unavailable in production mode.
Follow the PRD's SSRF requirements.
Do not weaken a product rule to make a test easier.
12. Required documentation
The README must include:
Prerequisites and supported Node.js version
Install command
Environment setup
Database initialization
Development startup
Production build and startup
Unit and integration tests
Browser tests
Mock user selection
Test reset
Database persistence location
Live metadata behavior
Troubleshooting
Document all assumptions that the PRD and profile do not decide.
13. Technical completion checklist
Before declaring completion, the model must:
Install from the committed lock file.
Initialize a clean database.
Run lint.
Run strict type checking.
Run Vitest.
Run Playwright.
Create a production build.
Start the production build and confirm the home page responds.
Check that published and deleted data survives restart.
Re-read the PRD and this profile.
Audit all acceptance categories A through G.
Report commands and results accurately.
Passing the repository's own tests does not replace the PRD acceptance requirements.