Install any skill in seconds. Free to start, no credit card required.
Get Started Free →OverKill Hill P³ SharePoint List database architecture reviewer. Use when designing, reviewing, or hardening SharePoint Online Lists used as lightweight databases, controlled vocabularies, lookup-backed registries, or CMDB-lite data stores. Also activate when the user asks about list thresholds, indexed columns, lookup relationships, required fields, content types, attachments, offline sync, Quick Edit, SharePoint UI-only build constraints, or whether a SharePoint list setting is safe for databa
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 117% | 0% |
OverKill Hill P³ · overkillhill.com · github.com/OKHP3
Use this skill to review SharePoint Online Lists that are intentionally being used as governed, database-like structures. The goal is not to pretend SharePoint is a relational database. The goal is to keep a SharePoint UI-only build inside known limits while preserving governance, queryability, and migration sanity.
| In scope | Out of scope | |----------|-------------| | SharePoint Online Lists as controlled registries | SQL Server, Dataverse, ServiceNow, or full CMDB implementation | | List/column settings chosen through SharePoint UI | PowerShell, SPFx, PnP, Graph automation | | Indexing, lookup behavior, content types, Quick Edit, sync, attachments | Tenant security policy or legal records governance | | CMDB-lite and portfolio list patterns | Transactional app backends or high-write workloads |
schema/v2-build-cards.md, schema/schema-fields.md, schema/v2-build-runbook.md, and any relevant ADRs.must fix before data load, should fix before broad use, and acceptable deviation if logged.These are non-negotiable. No setting, admin override, or Microsoft support ticket changes them in SharePoint Online.
| Limit | Value | What breaks if exceeded | |---|---|---| | List View Threshold (LVT) | 5,000 items per view | View is blocked; users see throttle error | | Indexed columns per list | 20 (hard) | Cannot create index 21; silent until you try | | Complex columns per view | 12 (Lookup + Person/Group + Managed Metadata combined) | View render fails or drops columns | | Single line of text | 255 characters | Truncated silently on save | | Multi-line text (plain) | ~69,000 characters | Effectively unlimited for data use | | Enforce unique values | Requires one index slot | Counts against the 20-index budget | | Lookup columns per list | No hard limit on creation; 12 per view | View performance degrades; test before loading data | | Total user columns | No hard limit; performance degrades at 300–400 | Forms slow; view rendering degrades |
SharePoint applies these defaults silently. Every one requires deliberate action to correct on a database-pattern list.
Trap 1 — Choice columns default to multi-select (Checkboxes). When you create a Choice column — including via post-CSV-import conversion — SP sets "Display choices using" to "Checkboxes (allow multiple selections)". A Checkboxes field stores multiple values as a delimited string. Partition keys, status fields, and any single-value vocabulary field must be explicitly set to Drop-Down Menu. This is the most common silent misconfiguration in SP list builds.
Fix: Edit Column → Display choices using → Drop-Down Menu. Also set: Allow 'Fill-in' choices → No for all controlled vocabulary fields.
Trap 2 — Attachments are enabled by default. Database-pattern lists have no use for file attachments. Leaving them on creates ungoverned shadow storage. Fix: List Settings → Advanced Settings → Attachments → Disabled → OK. Do before any data entry (disabling deletes existing attachments).
Trap 3 — Automatic Index Management (AIM) is enabled by default. AIM starts auto-indexing columns when a list exceeds ~2,500 items. Auto-indexes consume the 20-index budget on columns SP picks, not columns you planned. Fix: List Settings → Advanced Settings → Allow automatic management of indices → No → OK. Disable on every list with a deliberate index plan before data load.
Trap 4 — Number columns default to Automatic decimal places. "Automatic" means SP decides the display format. An integer sort-order field may render as "10.00". Fix: Set Number of decimal places to 0 for integer fields; 2 for currency-style fields.
Trap 5 — Multi-line text sub-type is not visible in the column list. You cannot see whether a Multi-line field is Plain text, Rich text, or Enhanced rich text from the list settings column list. Rich text and Enhanced rich text store HTML in the field value (breaking CSV exports and API consumers). Fix: Verify and explicitly set Plain text in Edit Column for every Multi-line field.
Trap 6 — Lookup Restrict Delete is opt-in and hidden behind two checkboxes. "Enforce relationship behavior" is unchecked by default. Without it, deleting a parent item leaves orphaned child lookup values (empty, not cascaded). Fix: Edit Column → Relationship → Enforce relationship behavior → checked → Delete behavior → Restrict Delete. Never select Cascade Delete on production lists.
Trap 7 — "Allow management of content types" may be on. Adds a visible Content Type field to forms and complicates the column editing UI unnecessarily for single-content-type lists. Fix: List Settings → Advanced Settings → Allow management of content types → No.
Trap 8 — Append-Only text requires versioning enabled first. Setting Append Changes to Existing Text = Yes on a list without versioning enabled is silently ignored or throws an error depending on SP version. Fix: Enable versioning (List Settings → Versioning Settings → Yes) before setting any column to Append-Only.
| Need | Column type | Critical settings | |---|---|---| | Short identifier / code (≤ 255 chars) | Single line of text | Enforce unique values: Yes if globally unique | | Long text, notes, definition | Multiple lines of text | Text type: Plain text; Append-Only: No unless audit log | | Controlled single-value vocabulary | Choice | Display: Drop-Down Menu; Fill-in: No | | Boolean flag | Yes/No | Set default (Yes or No) explicitly | | Integer count / sort order | Number | Decimal places: 0 | | FK to another list (hard / required) | Lookup | Enforce relationship: Yes; Delete: Restrict Delete | | FK to another list (soft / enrichment) | Lookup | Enforce relationship: No (soft link, may go null) | | Self-referential hierarchy (parent) | Lookup → same list | Enforce: Yes; Delete: Restrict Delete | | Named person | Person (People only) | Do not use "People and Groups" unless groups needed | | URL | Hyperlink | Renders clickable in modern experience | | Migration provenance (hidden post-load) | Single line of text | Set Hidden = Yes after data load | | Time-stamped audit note | Multiple lines (Append-Only) | Versioning must be enabled first |
The only safe way to control SharePoint internal column names via the UI.
SharePoint locks internal column names at column creation time. A column created as "Reference Group" gets internal name Reference_x0020_Group permanently. You cannot change it without deleting and recreating the column.
The pattern:
ReferenceGroup, SortOrder, IsActive).Column naming rules: PascalCase, no spaces, no special chars, max 32 chars. Suffix Id for lookup columns (e.g., ParentOrgId). Suffix Date for date fields.
Use these rules as defaults unless the repo schema or an ADR says otherwise:
For this repo:
schema/v2-build-cards.md as the field-level build reference.schema/v2-build-runbook.md for sequence and gates.schema/v2-delta.md.SourceSystem and SourceRecordKey.ReferenceValues as a governed reference table. It should favor single-value choice fields, indexed filters, attachments off, no folders, and limited casual editing.BusinessCapabilities as large-list sensitive. Required indexes must exist before the 6,652-row load.references/sp-list-db-rules.md — exact limitations, Microsoft-source-backed rules, and per-setting guidance. Read when the task requires specific numbers, UI paths, or a decision about an individual Advanced Settings toggle.Read the reference file when: you need the exact navigation path to a setting, you are unsure about an edge case (e.g., whether a lookup index helps LVT), or you are producing a build card that needs to specify every option on a settings page.
Built by Jamie Hill · OverKill Hill P³ Published at github.com/OKHP3 Part of the OKHP3/skillz Agent Skill library. MIT License -- free to use, fork, and adapt. A nod to the source is appreciated.
Other measured skills in the registry, with their headline benchmark lift.