Drop the unused project description field entirely

It never got a UI home on the frontend -- removed from ProjectView a
few sessions back and never restored anywhere -- so it was a fully
live field (validated, stored, returned by the API, covered by tests)
with no consumer.

- Migration 011: ALTER TABLE projects DROP COLUMN description.
- ProjectRepository: description dropped from ProjectRow, SELECT,
  create() and update() -- update() is now just a rename (string, not
  a $fields array; there was never more than one editable field once
  this left).
- ProjectController: store()/update() no longer accept or validate
  it; update() drops the "provide at least one of title, description"
  branch, since title is unconditionally the only field now.
- Frontend Project type, root README's API docs and curl example.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 01:25:53 +01:00
co-authored by Claude Sonnet 5
parent 367a98308a
commit fb59a54938
7 changed files with 22 additions and 50 deletions
+2 -6
View File
@@ -15,15 +15,11 @@ final class ProjectTest extends ApiTestCase
{
$auth = $this->authHeader();
$created = $this->request('POST', '/api/projects', [
'title' => ' Groceries ',
'description' => 'Weekly shop',
], $auth);
$created = $this->request('POST', '/api/projects', ['title' => ' Groceries '], $auth);
self::assertSame(201, $created->getStatusCode());
$project = $this->decode($created)['project'];
self::assertSame('Groceries', $project['title']);
self::assertSame('Weekly shop', $project['description']);
self::assertSame(0, $project['card_count']);
$index = $this->decode($this->request('GET', '/api/projects', null, $auth));
@@ -63,7 +59,7 @@ final class ProjectTest extends ApiTestCase
public function test_project_creation_validates_title(): void
{
$response = $this->request('POST', '/api/projects', ['description' => 'no title'], $this->authHeader());
$response = $this->request('POST', '/api/projects', [], $this->authHeader());
self::assertSame(422, $response->getStatusCode());
self::assertArrayHasKey('title', $this->decode($response)['error']['details']);