{"owner":"basecamp","repo":"fizzy","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# Fizzy\n\nFizzy is a kanban-style project management and issue tracker: cards move\nacross columns on boards, with comments, mentions, and assignments.\n\nThese instructions are defaults with reasons, not law — when the code in\nfront of you disagrees, take the better path and flag the conflict; invariants\n(data loss, security, CI gates) are surfaced, not overridden. Attack your own\ndiff before calling it done.\n\n## Deploy\n\nDefault branch: `main`\n\nSelf-hosted deploys run Kamal against `config/deploy.yml` — see `docs/kamal-deployment.md`.\n\n## SaaS mode\n\nFor local agent work, `tmp/saas.txt` is the checkout-level SaaS switch used by `bin/setup`. When present, read `saas/AGENTS.md` before continuing. Otherwise, do not apply its instructions.\n\n## Multi-tenancy is URL-based\n\nAccounts get a decimal `external_account_id` URL prefix (`/{account_id}/boards/...`).\n`AccountSlug::Extractor` middleware sets `Current.account` and moves the slug\nfrom `PATH_INFO` to `SCRIPT_NAME`, so Rails behaves as if mounted at that\npath — route helpers and request specs that assume a bare root will mislead\nyou. Domain records are account-scoped; identity, session, and authentication\nrecords are the global exceptions. Background jobs serialize and restore\n`Current.account` themselves.\n\nA global `Identity` (email-based) can hold `Users` in multiple accounts, so\nan email address is not a single account membership. Board access is per-user\n`Access` records.\n\n## UUID primary keys\n\nAll tables use UUIDv7 keys, base36-encoded to 25 characters. Fixture UUIDs\nare generated to sort older than any runtime record, so `.first`/`.last`\nstay deterministic in tests — don't \"fix\" ordering by comparing insertion\norder to id order.\n\n## Search is sharded on MySQL, single-index on SQLite\n\nFull-text search runs in the database, not Elasticsearch. On MySQL it is\nsharded 16 ways by CRC32 of the account ID (`Search::Record::Trilogy`); on\nSQLite it is a single FTS5 index (`Search::Record::SQLite`). Don't assume the\nsharded shape when working under SQLite. Models in `app/models/search/`.\n\n## Imports and exports\n\nData transfer between instances (`app/models/account/data_transfer/`,\n`app/models/zip_file`) must work against both local and S3 storage, and\narchives can exceed hundreds of gigabytes — stream, never buffer a whole\nfile.\n\n## Coding style\n\nBefore editing or reviewing code, read STYLE.md.\n"},"files":{"AGENTS.md":"# Fizzy\n\nFizzy is a kanban-style project management and issue tracker: cards move\nacross columns on boards, with comments, mentions, and assignments.\n\nThese instructions are defaults with reasons, not law — when the code in\nfront of you disagrees, take the better path and flag the conflict; invariants\n(data loss, security, CI gates) are surfaced, not overridden. Attack your own\ndiff before calling it done.\n\n## Deploy\n\nDefault branch: `main`\n\nSelf-hosted deploys run Kamal against `config/deploy.yml` — see `docs/kamal-deployment.md`.\n\n## SaaS mode\n\nFor local agent work, `tmp/saas.txt` is the checkout-level SaaS switch used by `bin/setup`. When present, read `saas/AGENTS.md` before continuing. Otherwise, do not apply its instructions.\n\n## Multi-tenancy is URL-based\n\nAccounts get a decimal `external_account_id` URL prefix (`/{account_id}/boards/...`).\n`AccountSlug::Extractor` middleware sets `Current.account` and moves the slug\nfrom `PATH_INFO` to `SCRIPT_NAME`, so Rails behaves as if mounted at that\npath — route helpers and request specs that assume a bare root will mislead\nyou. Domain records are account-scoped; identity, session, and authentication\nrecords are the global exceptions. Background jobs serialize and restore\n`Current.account` themselves.\n\nA global `Identity` (email-based) can hold `Users` in multiple accounts, so\nan email address is not a single account membership. Board access is per-user\n`Access` records.\n\n## UUID primary keys\n\nAll tables use UUIDv7 keys, base36-encoded to 25 characters. Fixture UUIDs\nare generated to sort older than any runtime record, so `.first`/`.last`\nstay deterministic in tests — don't \"fix\" ordering by comparing insertion\norder to id order.\n\n## Search is sharded on MySQL, single-index on SQLite\n\nFull-text search runs in the database, not Elasticsearch. On MySQL it is\nsharded 16 ways by CRC32 of the account ID (`Search::Record::Trilogy`); on\nSQLite it is a single FTS5 index (`Search::Record::SQLite`). Don't assume the\nsharded shape when working under SQLite. Models in `app/models/search/`.\n\n## Imports and exports\n\nData transfer between instances (`app/models/account/data_transfer/`,\n`app/models/zip_file`) must work against both local and S3 storage, and\narchives can exceed hundreds of gigabytes — stream, never buffer a whole\nfile.\n\n## Coding style\n\nBefore editing or reviewing code, read STYLE.md.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# Fizzy\n\nFizzy is a kanban-style project management and issue tracker: cards move\nacross columns on boards, with comments, mentions, and assignments.\n\nThese instructions are defaults with reasons, not law — when the code in\nfront of you disagrees, take the better path and flag the conflict; invariants\n(data loss, security, CI gates) are surfaced, not overridden. Attack your own\ndiff before calling it done.\n\n## Deploy\n\nDefault branch: `main`\n\nSelf-hosted deploys run Kamal against `config/deploy.yml` — see `docs/kamal-deployment.md`.\n\n## SaaS mode\n\nFor local agent work, `tmp/saas.txt` is the checkout-level SaaS switch used by `bin/setup`. When present, read `saas/AGENTS.md` before continuing. Otherwise, do not apply its instructions.\n\n## Multi-tenancy is URL-based\n\nAccounts get a decimal `external_account_id` URL prefix (`/{account_id}/boards/...`).\n`AccountSlug::Extractor` middleware sets `Current.account` and moves the slug\nfrom `PATH_INFO` to `SCRIPT_NAME`, so Rails behaves as if mounted at that\npath — route helpers and request specs that assume a bare root will mislead\nyou. Domain records are account-scoped; identity, session, and authentication\nrecords are the global exceptions. Background jobs serialize and restore\n`Current.account` themselves.\n\nA global `Identity` (email-based) can hold `Users` in multiple accounts, so\nan email address is not a single account membership. Board access is per-user\n`Access` records.\n\n## UUID primary keys\n\nAll tables use UUIDv7 keys, base36-encoded to 25 characters. Fixture UUIDs\nare generated to sort older than any runtime record, so `.first`/`.last`\nstay deterministic in tests — don't \"fix\" ordering by comparing insertion\norder to id order.\n\n## Search is sharded on MySQL, single-index on SQLite\n\nFull-text search runs in the database, not Elasticsearch. On MySQL it is\nsharded 16 ways by CRC32 of the account ID (`Search::Record::Trilogy`); on\nSQLite it is a single FTS5 index (`Search::Record::SQLite`). Don't assume the\nsharded shape when working under SQLite. Models in `app/models/search/`.\n\n## Imports and exports\n\nData transfer between instances (`app/models/account/data_transfer/`,\n`app/models/zip_file`) must work against both local and S3 storage, and\narchives can exceed hundreds of gigabytes — stream, never buffer a whole\nfile.\n\n## Coding style\n\nBefore editing or reviewing code, read STYLE.md.\n","category":"root","tokens":594}]}