Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .fleet/design-review.json
Original file line number Diff line number Diff line change
@@ -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."
}
}
Binary file added .fleet/evidence/changelog/after-1440.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .fleet/evidence/changelog/after-390.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .fleet/evidence/changelog/after-768.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .fleet/evidence/changelog/before-1440.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions DESIGN.md
Original file line number Diff line number Diff line change
@@ -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.

38 changes: 38 additions & 0 deletions PRODUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Product

<!-- impeccable:product-schema 1 -->

## 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.

9 changes: 8 additions & 1 deletion PROJECT_STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -22,13 +22,17 @@ 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).

## Products

- 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)

Expand Down Expand Up @@ -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

Expand Down
2 changes: 2 additions & 0 deletions app/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -21,6 +22,7 @@ const PAGES = {
"/history": TracesPage,
"/traces": TracesPage,
"/settings": SettingsPage,
"/changelog": ChangelogPage,
} as const;

function NotFoundPage() {
Expand Down
2 changes: 2 additions & 0 deletions app/src/components/sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
History,
Settings,
TableProperties,
ScrollText,
} from "lucide-react";

const NAV = [
Expand All @@ -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() {
Expand Down
1 change: 1 addition & 0 deletions app/src/lib/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export const ROUTES = [
"/evals",
"/traces",
"/settings",
"/changelog",
] as const;

export type AppPath = (typeof ROUTES)[number];
Expand Down
124 changes: 124 additions & 0 deletions app/src/pages/changelog.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<>
<PageHeader
title="Changelog"
description="Verified changes to Private Agent Search and its operator surface"
action={
<div className="hidden items-center gap-2 md:flex">
<a
href={ROADMAP_URL}
target="_blank"
rel="noreferrer"
className="inline-flex min-h-9 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-muted"
>
Roadmap <ExternalLink className="size-3" />
</a>
<a
href={SOURCE_URL}
target="_blank"
rel="noreferrer"
className="inline-flex min-h-9 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-muted"
>
Source <ExternalLink className="size-3" />
</a>
</div>
}
/>

<main className="mx-auto flex w-full max-w-4xl flex-col gap-6 p-6">
<div className="max-w-2xl">
<p className="text-sm leading-6 text-muted-foreground">
This is the maintained product history. Open and planned work stays in GitHub Issues,
while each entry here reflects verified repository or deployment evidence.
</p>
<div className="mt-4 flex flex-wrap gap-2 md:hidden">
<a
href={ROADMAP_URL}
className="inline-flex min-h-11 items-center gap-2 rounded-md border border-border px-3 text-sm font-medium"
>
Roadmap <ExternalLink className="size-3.5" />
</a>
<a
href={SOURCE_URL}
className="inline-flex min-h-11 items-center gap-2 rounded-md border border-border px-3 text-sm font-medium"
>
Source <ExternalLink className="size-3.5" />
</a>
</div>
</div>

<section className="flex flex-col" aria-label="Knowledgebase releases">
{entries.map((entry) => (
<article
key={`${entry.date}-${entry.title}`}
className="grid gap-3 border-t border-border py-6 sm:grid-cols-[140px_minmax(0,1fr)] sm:gap-6"
>
<time
dateTime={entry.date}
className="font-mono text-xs font-medium text-muted-foreground"
>
{entry.label}
</time>
<Card className="p-5">
<h2 className="text-base font-semibold text-foreground">{entry.title}</h2>
<p className="mt-2 max-w-[70ch] text-sm leading-6 text-muted-foreground">
{entry.body}
</p>
<ul className="mt-4 flex flex-wrap gap-2" aria-label="Update categories">
{entry.tags.map((tag) => (
<li
key={tag}
className="rounded-full bg-primary/10 px-2.5 py-1 text-[11px] font-medium text-foreground"
>
{tag}
</li>
))}
</ul>
</Card>
</article>
))}
</section>
</main>
</>
);
}

Loading