Feature: Read = Own surfaces of the roles-sync design (group 14) As a person whose role reads only their own content I want the editor, the Articles list and the entry list to say what I can see So that hidden items are not hinted at and the counts match what I can open Background: Given the backend contract of features/roles_permissions_content_scope.feature: a caller with content.read=own gets online articles plus their own drafts, and only the entries they created, with counts, total, page and size computed over the visible set And the spec of record is docs/design/screens/roles.md group 14, its table "Read = Own: what each surface returns", and docs/design/change-log-roles-sync.md section 4 And the SPA never computes visibility: every count, total and pager value shown comes from the API (GET /v1/article counts and total, GET /v1/content-type/{key}/entry total) And the SPA knows a person reads Own through scopeOf("content.read", type) of stores/permissions.ts And Update or Delete set to Own keep the "View only" rows of slice 5; only Read = Own hides rows And the SPA lives in web/src, Nuxt UI only, design tokens only, EN and FR in i18n/messages.ts, no comments in code Rule: Role editor Scenario: Info alert when Read is Own Given the editor shows a role where Read is Own on at least one type row Then an info alert under the grid reads "Read: Own · Articles show online articles plus the person's own drafts. Custom content types show only entries the person created. Status counts follow the same rule." And in FR "Lecture : Les siennes · Les articles affichent les articles en ligne et les brouillons de la personne. Les types de contenu personnalisés n'affichent que les entrées créées par la personne. Les compteurs de statut suivent la même règle." And it is absent when no Read cell is Own, and it appears and disappears live as the cell changes Scenario Outline: Type-specific preview sentences Given the Read cell of is Own Then the preview line for reads Examples: | row | sentence | | Articles | Can read online articles and their own drafts, create entries and edit only their own. | | a custom type (Events) | Can read only entries they created, create entries and edit only their own. | | All content types | one line per kind of type: the Articles sentence and the custom-type sentence | And "read only their own" is gone from the preview And a row with Read All still reads "Can read any entry, ..." as before Scenario: Read-only editor Given the person holds roles.view only and opens a role whose Read is Own Then the alert and the sentences render the same way, with no Save bar Rule: Articles list Scenario: Read = Own with drafts of their own Given the person is Pedro Lima, Junior writer, with content.read=own And GET /v1/article answers 3 online articles by others and 2 own drafts, counts all 5, online 3, draft 2 When the person opens /articles Then the header reads "Articles" with "Online articles and the drafts you created." And a banner reads "Drafts by others are hidden · Your role reads online articles and the drafts you created. The counts follow the same rule." And the tabs read All 5, Online 3, Draft 2, taken from the counts of the answer And "New article" is enabled when content.create allows it Scenario: No drafts of their own Given GET /v1/article?status=draft answers no items and counts all 3, online 3, draft 0 When the person opens the Draft tab Then the empty state reads "You have no drafts · Drafts you create appear here. Your role can't see drafts by other people." with "New article" And the tabs read All 3, Online 3, Draft 0 Scenario Outline: The banner and the empty state depend on Read being Own Given the person has content.read= Then the banner "Drafts by others are hidden" is And an empty Draft tab shows Examples: | scope | banner | empty | | own | shown | "You have no drafts" | | all | absent | the existing empty state of the articles list | Rule: Entry list of a custom type Scenario: Read = Own with entries of their own Given content.read=own on Events and GET /v1/content-type/events/entry answers 3 items, total 3 When the person opens /content/events Then the header reads "Events" with "Your role shows only entries you created." And a banner reads "Entries by others aren't shown · Your role reads only entries you created. Ask an owner or admin if you need to see more." And the count line reads "3 entries" from total, and no pager shows when total fits one page And "New entry" is enabled when content.create allows it Scenario: No entries of their own Given the answer has no items and total 0 Then the empty state reads "You haven't created an event yet · Your role shows only entries you created, so other people's events aren't listed here. Use New entry to add one." with "New entry" And nothing hints that other people's entries exist Scenario Outline: The singular noun is derived from the type name Given the content type is named Then the empty state title reads And the body reads "Your role shows only entries you created, so other people's <plural> aren't listed here. Use New entry to add one." Examples: | name | title | plural | | Events | You haven't created an event yet | events | | Recipes | You haven't created a recipe yet | recipes | | Press mentions | You haven't created a press mention yet | press mentions | | Categories | You haven't created a category yet | categories | And the derivation reuses the helper that already singularises type names for the relation sentences (lib/relationSentences.ts), lowercased And irregular names (for example "People", "Series") are a design gap of the qa Scenario: Direct link to a hidden item Given GET /v1/content-type/events/entry/1 answers 404 entry_not_found Then the existing "Entry not found" page shows, with no hint that the entry exists And GET /v1/article/{id} of someone else's draft answers 404 and shows the existing article-not-found page Rule: Scope of the change Scenario: The SPA does not recompute Given the API answers counts all 2, online 2, draft 0 for a reader with Read = Own Then the tabs read exactly those numbers whatever the person's scope