Manual verification checklist for tb-solid-pod. Assume features are broken until verified.
Items are ordered by dependency: if an early item fails, skip dependent items below it.
- Levels 0-3: Foundational (app loads, store works, navigation, CLI)
- Levels 4-10: Features (personas → contacts → groups → files → settings → type indexes → WebID)
- Level 11: Future work (not implemented)
Within each level, items are grouped hierarchically (CLI, UI, Data) where it makes sense. You can verify a level's CLI commands, then its UI, then its data integrity—or work through all three together. Use whatever flow makes sense for what you're verifying.
- Start from the top and work down
- If an item fails, note it and skip items that depend on it
- Check boxes as you verify each item works
- Uncheck boxes when something breaks
- Add
[BROKEN]notes for known issues - Within a level, verify CLI/UI/Data in any order that makes sense
If these fail, nothing else can be tested.
- App loads without console errors
- Browser tab title contains "tb-solid-pod"
- Main UI renders (not blank page)
Foundation for all features.
- TinyBase store initializes
- Data persists after page refresh
- LocalStorage contains app data
- Export produces JSON file
- Import loads JSON and populates store
Must work to access features.
- Tab bar visible (Data Browser, Personas, Contacts, Groups, Terminal)
- Clicking each tab shows correct view
- Active tab is visually indicated
- Terminal tab shows CLI prompt
Required for CLI-based features. The same CLI runs in the browser (Terminal tab) and in Node (npm run cli). BDD tests cover both (Scenario Outline: browser | terminal).
- CLI prompt accepts input
-
helpcommand shows available commands -
clearcommand clears terminal - Command history (up arrow) works
- Unknown command shows error message
-
exitcommand quits Node CLI; in browser shows message that exit is terminal-only - In Node:
exportprints JSON;export --downloadwrites file to cwd
Foundation for identity. Required for contacts and authorship.
-
persona listshows personas (or empty message) -
persona create <name>creates a persona -
persona show <id>displays persona details -
persona edit <id>modifies persona -
persona delete <id>removes persona -
persona set-default <id>sets default persona
- Personas tab shows list of personas
- "Create" button opens PersonaForm
- PersonaForm saves new persona
- Clicking persona opens edit form
- Delete button removes persona
- Default persona indicator visible
- "Create random" button populates form with sample data
- Persona data validates against PersonaSchema
- Persona has
@id,@type,foaf:name - Default persona ID stored in values
Depends on: Personas (for linking)
-
contact listshows contacts (or empty message) -
contact add <name>creates a contact -
contact show <id>displays contact details -
contact edit <id>modifies contact -
contact delete <id>removes contact -
contact search <query>finds contacts by name/email
- Contacts tab shows list of contacts
- Search/filter field filters contact list
- "Create" button opens ContactForm
- ContactForm saves new contact
- Can toggle between person and agent type
- Clicking contact opens edit form
- Delete button removes contact
- "Create random" button populates form with sample data
- Contact data validates against ContactSchema
- Contact has
@id,@type,vcard:fn - Agent contacts have agent-specific fields
Depends on: Contacts (for membership), Personas (for membership)
-
group listshows groups (or empty message) -
group create <name>creates a group -
group show <id>displays group details -
group edit <id>modifies group -
group delete <id>removes group -
group add-member <group> <contact>adds member -
group remove-member <group> <contact>removes member -
group list-members <group>shows members
- Groups tab shows list of groups
- Type filter (All/Organizations/Teams/Groups) works
- "Create" button opens GroupForm
- GroupForm saves new group with type selection
- Clicking group opens edit form
- MembershipManager opens from group
- Can add contacts as members
- Can add personas as members
- Can remove members
- Member count displayed on group list
- "Create random" button populates form with sample data
- Group data validates against GroupSchema
- Group has
@id,@type,vcard:fn - Membership stored correctly
Depends on: Personas (for author attribution)
-
lslists files/folders -
cd <path>changes directory -
pwdshows current path -
mkdir <name>creates folder -
touch <name>creates file -
cat <file>shows file content -
rm <path>removes file/folder -
file info <path>shows metadata -
file set-title <path> <title>sets title -
file set-author <path> <persona>sets author -
file set-description <path> <desc>sets description
- Data Browser shows file/folder tree
- Clicking folder navigates into it
- Clicking file shows content
- FileMetadataPanel shows title, description, author
- Can edit metadata fields
- Author dropdown shows personas
- Resources stored in
resourcestable - Files have
type,body,contentType,parentId - Folders have
type: ldp:Container
Depends on: Core infrastructure
-
config listshows all settings -
config get <key>shows setting value -
config set <key> <value>changes setting -
config resetresets to defaults -
config reset <key>resets specific setting
- Settings stored in TinyBase values (not tables)
-
defaultPersonaIdsetting works -
themesetting works -
cliHistorySizesetting works
Depends on: Personas (for type index links)
-
typeindex listshows registrations -
typeindex show publicshows public index -
typeindex show privateshows private index -
typeindex register <type> <location>adds registration -
typeindex unregister <type>removes registration
- Type indexes stored in
typeIndexestable - Default registrations seeded on first load
- Persona schema includes type index links
Depends on: Personas, Type Indexes
-
persona show <id> --fullshows full WebID JSON -
persona set-inbox <id> <url>sets inbox -
persona set-typeindex <id> <url>sets public type index -
persona set-typeindex <id> <url> --privatesets private type index
- PersonaForm has collapsible "WebID / Solid profile" section
- Can set OIDC issuer
- Can set inbox URL
- Can set preferences file URL
- Can set public/private type index URLs
- Persona includes
ldp:inboxwhen set - Persona includes
pim:preferencesFilewhen set - Persona includes
solid:publicTypeIndexwhen set - Persona includes
solid:privateTypeIndexwhen set
- ACL schema exists
-
acl show <path>works -
acl grant/acl revokework - ACLPanel UI exists
- Can connect to external Solid pod
- Initial sync pushes local data
- Ongoing sync works
- Authority mode selectable
-
npm testruns without errors - 392+ tests passing
- Coverage meets 80% threshold
-
npm run storybookstarts without errors - PersonaList/Form stories render
- ContactList/Form stories render
- GroupList/Form/MembershipManager stories render
- FileMetadataPanel stories render
-
npm run test:e2eruns (dev server required for browser scenarios; terminal scenarios run Node CLI) - App shell scenarios pass
- CLI contact scenarios pass (browser and terminal)
- CLI persona scenarios pass (browser and terminal)
- CLI navigation scenarios pass (browser and terminal)
Date: ____________
Verified by: ____________
Notes: