diff --git a/.fleet/design-review.json b/.fleet/design-review.json new file mode 100644 index 0000000..c7618c7 --- /dev/null +++ b/.fleet/design-review.json @@ -0,0 +1,66 @@ +{ + "$schema": "fleet.design-review.v1", + "version": 1, + "project": "knowledge-base", + "target": "Knowledgebase changelog", + "mode": "preserve", + "register": "product", + "context": { + "product": "PRODUCT.md", + "design": "DESIGN.md" + }, + "direction": { + "references": [], + "probes": [], + "selected": "existing-design", + "approval": "not-required", + "before": ".fleet/evidence/changelog/before-1440.png" + }, + "evidence": { + "screenshots": [ + { + "width": 390, + "path": ".fleet/evidence/changelog/after-390.png" + }, + { + "width": 768, + "path": ".fleet/evidence/changelog/after-768.png" + }, + { + "width": 1440, + "path": ".fleet/evidence/changelog/after-1440.png" + } + ], + "projectCheck": { + "command": "cd app && pnpm build", + "status": "pass" + }, + "critique": { + "score": 35, + "maximum": 40 + }, + "audit": { + "score": 19, + "maximum": 20 + }, + "unresolved": { + "p0": 0, + "p1": 0 + }, + "detector": { + "posture": "advisory", + "findings": [] + }, + "browserReview": { + "tool": "Playwright with mocked local read-only session/project responses", + "viewports": [390, 768, 1440], + "horizontalOverflow": false, + "consoleErrors": 0, + "note": "The Access-protected changelog was inspected at all required widths without production credentials. The existing icon-only mobile sidebar retains aria labels; the new content and links remain fully visible." + } + }, + "ownerFeedback": { + "decision": "delegated", + "note": "Owner explicitly delegated agents to build first-party changelogs across all projects." + } +} diff --git a/.fleet/evidence/changelog/after-1440.png b/.fleet/evidence/changelog/after-1440.png new file mode 100644 index 0000000..8970b55 Binary files /dev/null and b/.fleet/evidence/changelog/after-1440.png differ diff --git a/.fleet/evidence/changelog/after-390.png b/.fleet/evidence/changelog/after-390.png new file mode 100644 index 0000000..047f901 Binary files /dev/null and b/.fleet/evidence/changelog/after-390.png differ diff --git a/.fleet/evidence/changelog/after-768.png b/.fleet/evidence/changelog/after-768.png new file mode 100644 index 0000000..0f2f3ab Binary files /dev/null and b/.fleet/evidence/changelog/after-768.png differ diff --git a/.fleet/evidence/changelog/before-1440.png b/.fleet/evidence/changelog/before-1440.png new file mode 100644 index 0000000..9e003b1 Binary files /dev/null and b/.fleet/evidence/changelog/before-1440.png differ diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..7478a9f --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,13 @@ +# Design + +## Direction + +Preserve the Knowledgebase operator shell: dense dark workspace surfaces, restrained teal status accents, compact system typography, and project-scoped context in the persistent sidebar. + +## Rules + +- New operator routes use the existing PageHeader, Card, sidebar, and semantic tokens. +- Information density and source clarity outrank marketing expression. +- Mobile keeps the compact icon sidebar with accessible names. +- External project links are explicit and visually secondary to operator tasks. + diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 0000000..9135fd5 --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,38 @@ +# Product + + + +## Platform + +web + +## Users + +Fleet operators and agents that need cited retrieval over private, specialized corpora such as research papers, company information, filings, contracts, manuals, and notes. + +## Product Purpose + +Private Agent Search ingests structured and unstructured source material, retrieves scoped evidence, and returns grounded answers with file, page, and excerpt provenance. + +## Positioning + +The product’s invariant is “cited or it didn’t happen”: retrieval and answer workflows terminate in inspectable source evidence rather than unsupported model prose. + +## Capabilities and Constraints + +- The Cloudflare Worker is the only RAG runtime. +- Dashboard access is private and protected by Cloudflare Access. +- Tenant and project scope must remain explicit. +- Production deploys and migrations require human approval. + +## Evidence on Hand + +Current state lives in `STATUS.md`; historical product truth is archived under `docs/knowledge/archive/`; dashboard implementation lives in `app/`. + +## Product Principles + +- Preserve citation provenance. +- Keep private corpora private and scoped. +- Fail loudly when evidence or access is missing. +- Separate shipped history from the GitHub work queue. + diff --git a/PROJECT_STATUS.md b/PROJECT_STATUS.md index 79a0b44..ed99dbc 100644 --- a/PROJECT_STATUS.md +++ b/PROJECT_STATUS.md @@ -5,7 +5,7 @@ > Update this file when durable current or shipped product truth changes. Do > not let deploy-version snapshots accumulate here — put those in the archive. -Last updated: 2026-07-25 +Last updated: 2026-07-30 ## Why / What @@ -22,6 +22,9 @@ the non-negotiable product invariant. ## Timeline +- **2026-07-30** — Added a product-owned changelog to the operator dashboard + with verified release history and canonical Roadmap and Source links. + Historical milestones live in [`docs/knowledge/archive/project-status-2026-06-28.md`](docs/knowledge/archive/project-status-2026-06-28.md). @@ -29,6 +32,7 @@ Historical milestones live in - Worker RAG API and operator `/ui`. - Access-protected dashboard at `https://search.sassmaker.com`. +- Product-owned release history at `https://search.sassmaker.com/changelog`. ## Features (shipped) @@ -70,6 +74,9 @@ Historical milestones live in indexed profile memory. High Signal integration is cancelled: its current public-evidence workflow already has product-owned Git + D1 retrieval and does not need private-corpus search. +- **Owned release history:** the dashboard includes a same-origin `/changelog` + with verified editorial milestones. Planned work remains in GitHub Issues; + Source points to the canonical organization repository. ### Deploy fingerprint diff --git a/app/src/App.tsx b/app/src/App.tsx index 4347f56..2a484ac 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -10,6 +10,7 @@ import OverviewPage from "@/pages/overview"; import QueryPage from "@/pages/query"; import SettingsPage from "@/pages/settings"; import TracesPage from "@/pages/traces"; +import ChangelogPage from "@/pages/changelog"; const PAGES = { "/": OverviewPage, @@ -21,6 +22,7 @@ const PAGES = { "/history": TracesPage, "/traces": TracesPage, "/settings": SettingsPage, + "/changelog": ChangelogPage, } as const; function NotFoundPage() { diff --git a/app/src/components/sidebar.tsx b/app/src/components/sidebar.tsx index 24b76f9..9f111a6 100644 --- a/app/src/components/sidebar.tsx +++ b/app/src/components/sidebar.tsx @@ -13,6 +13,7 @@ import { History, Settings, TableProperties, + ScrollText, } from "lucide-react"; const NAV = [ @@ -24,6 +25,7 @@ const NAV = [ { href: "/ingest", label: "Ingest", icon: FileUp }, { href: "/evals", label: "Evals", icon: FlaskConical }, { href: "/settings", label: "Settings", icon: Settings }, + { href: "/changelog", label: "Changelog", icon: ScrollText }, ]; export function Sidebar() { diff --git a/app/src/lib/router.ts b/app/src/lib/router.ts index f86275e..80c5fde 100644 --- a/app/src/lib/router.ts +++ b/app/src/lib/router.ts @@ -10,6 +10,7 @@ export const ROUTES = [ "/evals", "/traces", "/settings", + "/changelog", ] as const; export type AppPath = (typeof ROUTES)[number]; diff --git a/app/src/pages/changelog.tsx b/app/src/pages/changelog.tsx new file mode 100644 index 0000000..40dda67 --- /dev/null +++ b/app/src/pages/changelog.tsx @@ -0,0 +1,124 @@ +import { Card } from "@/components/card"; +import { PageHeader } from "@/components/page-header"; +import { ExternalLink } from "lucide-react"; + +const SOURCE_URL = "https://github.com/sass-maker/knowledge-base"; +const ROADMAP_URL = `${SOURCE_URL}/issues`; + +const entries = [ + { + date: "2026-07-25", + label: "July 25, 2026", + title: "Private dashboard cut over to Cloudflare Pages", + body: "The operator dashboard moved to search.sassmaker.com behind Cloudflare Access. Same-origin proxying, direct deep links, and verified project switching now work without exposing Worker credentials to the browser.", + tags: ["Dashboard", "Access"], + }, + { + date: "2026-07-25", + label: "July 25, 2026", + title: "Project-scoped search became the default operator view", + body: "The dashboard now discovers Fleet project scopes, opens Research Papers by default, switches independently to Starboard, and hides demo and proof corpora unless an operator explicitly enables them.", + tags: ["Projects", "Privacy"], + }, + { + date: "2026-06-28", + label: "June 28, 2026", + title: "Embedding-model catalog release completed", + body: "Every advertised embedding dimension gained a matching Vectorize binding and model metadata. Release checks covered catalog parity, CRUD smoke tests, hosted UI readiness, and live OCR on the same Cloudflare-native runtime.", + tags: ["Retrieval", "Release"], + }, + { + date: "2026-06-23", + label: "June 23, 2026", + title: "A+ cited-search evidence shipped", + body: "The deployed proof covered readiness, scoped evaluation, lexical and semantic search, ingestion, observability, and the hosted operator UI. Citation and hit rates reached 1.0 in the recorded benchmark.", + tags: ["Evidence", "Evaluation"], + }, +] as const; + +export default function ChangelogPage() { + return ( + <> + + + Roadmap + + + Source + + + } + /> + +
+
+

+ This is the maintained product history. Open and planned work stays in GitHub Issues, + while each entry here reflects verified repository or deployment evidence. +

+
+ + Roadmap + + + Source + +
+
+ +
+ {entries.map((entry) => ( +
+ + +

{entry.title}

+

+ {entry.body} +

+
    + {entry.tags.map((tag) => ( +
  • + {tag} +
  • + ))} +
+
+
+ ))} +
+
+ + ); +} +