From 715a885cde2ec2aa4a6fb585f9d2cf50b327c771 Mon Sep 17 00:00:00 2001 From: hudsonaikins-crown Date: Fri, 9 Oct 2026 12:40:53 -0400 Subject: [PATCH 1/2] docs: rebrand GitHub presentation as WritSet --- .github/ISSUE_TEMPLATE/bug.yml | 4 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/pull_request_template.md | 2 +- AGENTS.md | 5 +- CONTRIBUTING.md | 9 +- NOTICE | 4 +- README.md | 154 ++++++-------------- SECURITY.md | 6 +- docs/README.md | 13 +- docs/agent-run-lifecycle.md | 2 +- docs/assets/fonts/space-grotesk-LICENSE.txt | 93 ++++++++++++ docs/assets/fonts/space-grotesk.woff2 | Bin 0 -> 22320 bytes docs/assets/writset-icon-dark.svg | 1 + docs/assets/writset-icon-inverse.svg | 1 + docs/assets/writset-icon.svg | 1 + docs/assets/writset-logo-dark.svg | 6 + docs/assets/writset-logo-light.svg | 6 + docs/brand.md | 62 ++++---- docs/getting-started.md | 10 +- docs/native-git-foundation.md | 2 +- docs/try-tabellio.md | 11 +- docs/workflow-model.md | 8 +- package.json | 31 ++-- templates/pull_request_template.md | 2 +- 24 files changed, 242 insertions(+), 193 deletions(-) create mode 100644 docs/assets/fonts/space-grotesk-LICENSE.txt create mode 100644 docs/assets/fonts/space-grotesk.woff2 create mode 100644 docs/assets/writset-icon-dark.svg create mode 100644 docs/assets/writset-icon-inverse.svg create mode 100644 docs/assets/writset-icon.svg create mode 100644 docs/assets/writset-logo-dark.svg create mode 100644 docs/assets/writset-logo-light.svg diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index cd182133..e3adda3f 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -1,10 +1,10 @@ name: Bug report -description: Report a reproducible problem with current Tabellio behavior. +description: Report a reproducible problem with current WritSet behavior. title: "[Bug]: " body: - type: markdown attributes: - value: "For vulnerabilities, use https://github.com/IntelIP/Tabellio/security/advisories/new. Do not include credentials, private sessions, provider bodies, or account data." + value: "For vulnerabilities, use https://github.com/IntelIP/WritSet/security/advisories/new. Do not include credentials, private sessions, provider bodies, or account data." - type: input id: version attributes: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 6a821bdd..aa159134 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - name: Private vulnerability report - url: https://github.com/IntelIP/Tabellio/security/advisories/new + url: https://github.com/IntelIP/WritSet/security/advisories/new about: Report security issues privately. Do not post vulnerability details in public issues. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6ae3c938..889c2257 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,7 +3,7 @@ Who benefits, what problem this solves, and the observable before/after behavior. List changed files, scope limits, and any unfinished work. -## Tabellio Evidence +## WritSet evidence - [ ] Evidence envelope generated - [ ] Evidence envelope validated diff --git a/AGENTS.md b/AGENTS.md index 4ad20336..aa916530 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,8 @@ # Agent entry point -Tabellio helps teams review AI-assisted code with evidence tied to the exact code -version. Serve teams trying and connecting Tabellio before adding operator detail. +WritSet helps teams understand and track context across coding-agent work. +Serve teams trying and connecting WritSet before adding operator detail. +The published package, CLI commands, and stored formats retain their Tabellio names. ## Find the right guide diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 80897f9d..641fbc0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -Help teams try Tabellio, connect one repository, and review code with clear evidence. +Help teams try WritSet, connect one repository, and understand their coding agents' context. Keep changes Git-native, agent-agnostic, dependency-light, deterministic before AI-assisted, and default-deny for protected external actions. @@ -10,11 +10,12 @@ Use Node.js 20 or later, npm, Git 2.38 or later, and Entire 0.7.7 or later. CI uses Node.js 22.23.1. PostgreSQL client/server binaries are required for the provenance integration suite; git-spice 0.18 or later is needed for stack work. The package has no runtime npm dependencies. Named npm scripts below belong to -this checkout; installed users start at [Try Tabellio](docs/try-tabellio.md). +this checkout; installed users start at [Try WritSet](docs/try-tabellio.md). +The published package and CLI commands still use the earlier Tabellio name. ```bash -git clone https://github.com/IntelIP/Tabellio.git -cd Tabellio +git clone https://github.com/IntelIP/WritSet.git +cd WritSet entire enable --agent codex --project --skip-push-sessions node scripts/tabellio-preflight.mjs --profile agent ``` diff --git a/NOTICE b/NOTICE index 3ad28cf4..5fb2f436 100644 --- a/NOTICE +++ b/NOTICE @@ -1,4 +1,4 @@ -Tabellio +WritSet (formerly Tabellio) Copyright 2026 IntelIP -This product includes software developed for the Tabellio project. +This product includes software developed for the WritSet project (formerly Tabellio). diff --git a/README.md b/README.md index 92f53014..4ba090f9 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,39 @@ -# Tabellio +

+ + + WritSet + +

-Tabellio helps teams review AI-assisted code by collecting what changed, what was checked, and which actions were approved for the exact code version. +

Context engineering for coding agents.

-![Tabellio product overview](docs/assets/tabellio-hero.svg) +

Understand what your agent worked from, what changed, and where to pick up next.

-**Published: [@intelip/tabellio 0.7.0](https://www.npmjs.com/package/@intelip/tabellio/v/0.7.0).** -This is an early project for evaluation on trusted workers. -Its local demo is repeatable; production adoption and performance are not established by that demo. +

+ Documentation · + Try the demo · + Releases · + Help +

-[Documentation](docs/README.md) · [Examples](examples/) · [Releases](https://github.com/IntelIP/Tabellio/releases) · [Help](https://github.com/IntelIP/Tabellio/issues) +WritSet keeps task context, code versions, checkpoints, and results connected across +coding-agent work. Start with a clear task, follow the changes, and keep a record +that the next session can use. -## Try the published package +## Keep the context connected -Start in a new directory. The demo needs: +- **Capture the starting point.** Record the task, Git base, changed files, and checkpoints. +- **Track what changed.** Tie results to the code version they describe; surface stale or missing evidence. +- **Carry work forward.** Keep run state, findings, and next actions available after an interruption. -- macOS or Linux, running as a regular user. -- Node.js 20 or later and npm. Repository CI uses Node.js 22.23.1. -- Git 2.38 or later. -- PostgreSQL client and server binaries on `PATH`: `psql`, `createdb`, `initdb`, and `pg_ctl`. - PostgreSQL 14.15 was used for the documented macOS run. +[Agent workflow](docs/agent-run-lifecycle.md) · [How context is stored](docs/native-git-foundation.md) -The demo creates its own temporary Git repository and private PostgreSQL cluster. -You do not need an existing database, provider account, token, Entire installation, -or git-spice installation for this sample. Internet access is needed to install the package. +## Try it locally + +**Requirements:** macOS or Linux, Node.js 20+, Git 2.38+, and PostgreSQL client/server +tools on `PATH`. See the [setup guide](docs/try-tabellio.md#requirements). + +In a new directory: ```bash npm install --save-dev @intelip/tabellio@0.7.0 @@ -30,103 +41,24 @@ npx tabellio-version --expect-version 0.7.0 npx tabellio-provenance-demo ``` -The version command checks the installed runner. The demo imports observations, -restarts the database, rebuilds its derived records, and checks review decisions. -It then stops its PostgreSQL server and removes its temporary files. -See [Try Tabellio](docs/try-tabellio.md) for setup, troubleshooting, and a saved receipt. - -## What you should see - -Both commands print JSON. Successful receipts include `ok: true` for the version -check and `status: "passed"` for the demo. Expected failure cases remain blocked. - -Actual terminal-output excerpt from a clean installed-package run on macOS: - -```json -{ - "status": "passed", - "checks": { - "sourceReplay": "passed", - "changedSourceReplay": "blocked", - "missingSecurity": "blocked", - "postgresServerRestart": "passed", - "deleteAndReplay": "passed", - "movedBase": "blocked" - }, - "cost": { "usd": 0, "modelCalls": 0, "cloudCalls": 0 }, - "cleanup": "passed" -} -``` - -This is an excerpt, not the full receipt; commit IDs and timing vary per run. -Git and PostgreSQL operations are real. Plane, Entire, GitHub, Buildkite, and -security observations are **synthetic fixtures**. GitHub status delivery uses a -local fake transport. Nothing in this sample is published to a provider. -The sample proves the local workflow, not live provider access or scanner effectiveness. - -## What Tabellio can do - -| Capability | Practical result | -| --- | --- | -| Capture exact Git context | A packet names the base, head, changed files, and checkpoint evidence. | -| Run committed validation commands | Results apply to one code version; later edits can invalidate readiness. | -| Keep durable review and run state | Work can resume with its checks, findings, and next action preserved. | -| Import safe source observations | Local PostgreSQL records keep source identity and replayable relationships. | -| Build candidate-scoped review packets | Missing, stale, conflicting, or failed evidence remains visible and blocking. | -| Record independent security evidence | Bounded scanner receipts remain separate from an agent's review claim. | -| Prepare approved status publication | Review results can be shared through an explicit, short-lived approval. | -| Join delivery evidence | Reports distinguish code, releases, deployments, and missing relationships. | - -The package also includes optional git-spice stack operations and a **legacy Plane -import capability**. IntelIP uses AgentShift for current project tracking; -Tabellio does not include an AgentShift adapter. - -## Connect a real repository - -Repository integration has extra requirements: a trusted Git checkout, genuine -Entire 0.7.7 or later checkpoints, and the committed platform and validation contracts. -Use git-spice 0.18 or later when working with stacked branches. PostgreSQL is -needed for the local provenance store; it is not needed for every Git-ref workflow. - -Start with [Connect a repository](docs/getting-started.md). -That guide separates installed CLI commands from source-checkout development. -Exported provider snapshots need explicit access and safe input handling. -Publishing statuses or sharing private control refs needs separate approval. - -## How the pieces fit - -```mermaid -flowchart LR - A[Git and safe source snapshots] --> B[Tabellio capture and checks] - B --> C[Local PostgreSQL projection] - C --> D[Review packet] - B --> E[Local Git evidence refs] - D --> F[Human review and decision] - E --> F -``` - -GitHub stores code and pull requests. Private checkpoint, validation, and review -state stays on customer-owned local storage by default. PostgreSQL stores a -derived evidence view; source observations and Git remain the recovery inputs. -See [Native Git foundation](docs/native-git-foundation.md) and -[Provenance operations](docs/provenance.md) for the detailed boundaries. +The demo records source observations, restarts its temporary database, and rebuilds +the stored context. A successful receipt ends with `status: "passed"` and +`cleanup: "passed"`. -## Material limits +**Naming transition:** WritSet was previously Tabellio. The published package and +commands still use the earlier name; the commands above are the supported install. -- Passing checks do not grant merge, release, deployment, or credential authority. -- Missing access is a blocker, not a successful or empty observation. -- Security checks cover their declared rules, not every possible vulnerability. -- Hosted exact-head validation needs genuine, privately provisioned checkpoint evidence. -- No autonomous production service, cloud provisioning, or automatic learning is included. +## Current scope -## Contribute, operate, and get help +WritSet is an early CLI toolkit for trusted local workers. Git and database operations +in the demo are real; external-service and security records are synthetic. +It does not prove production adoption, benchmark gains, or live-provider security. +Private context stays on customer-owned storage by default. External actions require +their own approval. -[Contributing](CONTRIBUTING.md) explains source setup, checks, and handoffs. -[Agent instructions](AGENTS.md) route coding agents to the same standards. -[Operate and release](docs/operate-and-release.md) covers protected operator procedures. +## Go further -Ask questions or report ordinary bugs through [GitHub Issues](https://github.com/IntelIP/Tabellio/issues). -Use [private vulnerability reporting](https://github.com/IntelIP/Tabellio/security/advisories/new) -for security reports; read the [security policy](SECURITY.md) first. +[Connect a repository](docs/getting-started.md) · [Examples](examples/) · +[Contribute](CONTRIBUTING.md) · [Security](SECURITY.md) · [Brand assets](docs/brand.md) -Tabellio is licensed under **Apache-2.0**. See [LICENSE](LICENSE) and [NOTICE](NOTICE). +Built by **IntelIP**. Licensed under [Apache-2.0](LICENSE). diff --git a/SECURITY.md b/SECURITY.md index 51e37e0b..09cc7785 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -8,10 +8,10 @@ version and source commit when available. ## Private vulnerability reporting -Use [GitHub's private report form](https://github.com/IntelIP/Tabellio/security/advisories/new). +Use [GitHub's private report form](https://github.com/IntelIP/WritSet/security/advisories/new). Do not file vulnerability details in a public issue. The private form is the project's reporting route; ordinary bugs and questions use -[GitHub Issues](https://github.com/IntelIP/Tabellio/issues). +[GitHub Issues](https://github.com/IntelIP/WritSet/issues). Include the affected version/file, minimal reproduction, expected and actual behavior, likely impact, and safe evidence references. Explain whether the issue @@ -41,7 +41,7 @@ configuration, disabled TLS verification, dynamic `eval`, and declared dependenc policy. Candidate ignore files cannot grant a pass. Remaining declared dependencies need vulnerability evidence. Read [scanner operations](docs/provenance.md) for limits. -Tabellio does not claim complete vulnerability detection, SLSA certification, +WritSet does not claim complete vulnerability detection, SLSA certification, in-toto verification, cryptographic evidence signing, complete supply-chain protection, or autonomous production safety. Synthetic security observations in the demo do not prove scanner effectiveness or live-provider security. diff --git a/docs/README.md b/docs/README.md index 82f701f4..7d54c105 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,11 +1,14 @@ -# Tabellio documentation +# WritSet documentation -Choose the outcome you need. Current guides describe behavior; validation and -review records establish passing evidence for a specific code version. +Understand and track the context behind coding-agent work: tasks, source versions, +checkpoints, results, and handoffs. Choose the outcome you need below. + +WritSet was previously Tabellio. The published package, CLI commands, configuration +files, and stored formats keep their existing names during this transition. | Route | Start here | Result | | --- | --- | --- | -| **Try Tabellio** | [Published-package demo](try-tabellio.md) | Run a local sample and understand which observations are synthetic. | +| **Try WritSet** | [Published-package demo](try-tabellio.md) | Run a local sample and understand which observations are synthetic. | | **Connect a repository** | [Integration setup](getting-started.md) | Add genuine checkpoints and repository-specific contracts. | | **Contribute** | [Contributor setup and handoffs](../CONTRIBUTING.md) | Finish one scoped change with the applicable checks. | | **Operate and release** | [Operator guide](operate-and-release.md) | Review protected sharing, validation, and release procedures. | @@ -34,7 +37,7 @@ review records establish passing evidence for a specific code version. - [Operations hardening](operations-hardening.md) and [checkpoint proof handoff](checkpoint-proof-handoff.md). - [Pilot acceptance](pilot/acceptance-plan.md) and [architecture and recovery](pilot/architecture-and-recovery.md). - [Release notes](releases/), [changelog](../CHANGELOG.md), and [v0.7.0 launch scope](gtm/v0.7.0-launch.md). -- [Security policy](../SECURITY.md) and [private reporting](https://github.com/IntelIP/Tabellio/security/advisories/new). +- [Security policy](../SECURITY.md) and [private reporting](https://github.com/IntelIP/WritSet/security/advisories/new). ## Previous work diff --git a/docs/agent-run-lifecycle.md b/docs/agent-run-lifecycle.md index 18646bd1..443ae25a 100644 --- a/docs/agent-run-lifecycle.md +++ b/docs/agent-run-lifecycle.md @@ -1,6 +1,6 @@ # Agent Run Lifecycle -Tabellio can run a complete local agent workflow without a GitHub API or proprietary code-storage service. State lives under a local run root; Git remains the code substrate. +WritSet can run a complete local agent workflow without a GitHub API or proprietary code-storage service. State lives under a local run root; Git remains the code substrate. ## State Machine diff --git a/docs/assets/fonts/space-grotesk-LICENSE.txt b/docs/assets/fonts/space-grotesk-LICENSE.txt new file mode 100644 index 00000000..d5666d70 --- /dev/null +++ b/docs/assets/fonts/space-grotesk-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Space Grotesk Project Authors (https://github.com/floriankarsten/space-grotesk) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/assets/fonts/space-grotesk.woff2 b/docs/assets/fonts/space-grotesk.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7b0e76a5c9bdfdb5ccc8c9ab44780b5ff788c6db GIT binary patch literal 22320 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 \ No newline at end of file diff --git a/docs/assets/writset-icon-inverse.svg b/docs/assets/writset-icon-inverse.svg new file mode 100644 index 00000000..17999562 --- /dev/null +++ b/docs/assets/writset-icon-inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/writset-icon.svg b/docs/assets/writset-icon.svg new file mode 100644 index 00000000..b04233ee --- /dev/null +++ b/docs/assets/writset-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/writset-logo-dark.svg b/docs/assets/writset-logo-dark.svg new file mode 100644 index 00000000..2dd20777 --- /dev/null +++ b/docs/assets/writset-logo-dark.svg @@ -0,0 +1,6 @@ + +WritSet +The Cursor W icon beside WritSet in Space Grotesk. Context engineering for coding agents. + + + diff --git a/docs/assets/writset-logo-light.svg b/docs/assets/writset-logo-light.svg new file mode 100644 index 00000000..3ea9e0c9 --- /dev/null +++ b/docs/assets/writset-logo-light.svg @@ -0,0 +1,6 @@ + +WritSet +The Cursor W icon beside WritSet in Space Grotesk. Context engineering for coding agents. + + + diff --git a/docs/brand.md b/docs/brand.md index 1c562dc5..3ee8e2b5 100644 --- a/docs/brand.md +++ b/docs/brand.md @@ -1,38 +1,44 @@ -# Brand System +# WritSet brand -Tabellio uses a notary-orange visual system: near-black surfaces, off-white text, and one warm accent for attestation, provenance, and approval states. +WritSet makes context engineering for coding agents easier to understand and track. +The identity pairs the Cursor W icon with a plain, single-color WritSet title. -## Logo +## Assets | Asset | Use | | --- | --- | -| `docs/assets/tabellio-mark.svg` | Square mark, favicon, social avatar, compact UI | -| `docs/assets/tabellio-logo.svg` | Full horizontal logo lockup | -| `docs/assets/tabellio-hero.svg` | README and product overview hero | +| [Cursor W](assets/writset-icon.svg) | Cobalt icon for light backgrounds | +| [Cursor W, dark surface](assets/writset-icon-dark.svg) | Light blue icon for dark backgrounds | +| [Cursor W, inverse](assets/writset-icon-inverse.svg) | White icon for cobalt backgrounds | +| [Light logo](assets/writset-logo-light.svg) | Icon and dark title on a light background | +| [Dark logo](assets/writset-logo-dark.svg) | Icon and light title on a dark background | -The mark combines three ideas: +The icon combines a bracket-shaped W with a terminal cursor. Use the approved +geometry as supplied. Keep the icon separate from the title; do not recolor parts +of the word, stretch the mark, or add letter spacing. -- a notarial seal for attestation -- a hidden `T` for Tabellio -- a connected path for Git provenance +## Typography -## Color Stack +Use **Space Grotesk** for headings, the title, and body copy. Use **JetBrains Mono** +for code and small technical labels. The logo title uses Space Grotesk at weight +500 with its natural spacing. SVG text is outlined so GitHub renders it without +requiring visitors to install a font. -| Token | Hex | Use | +The [Space Grotesk license](assets/fonts/space-grotesk-LICENSE.txt) and original +[font source](assets/fonts/space-grotesk.woff2) accompany the editable SVG assets. + +## Colors + +| Color | Value | Role | | --- | --- | --- | -| `base` | `#000000` | Page background | -| `surface` | `#111111` | Primary cards and logo field | -| `surface-muted` | `#191919` | Secondary panels and inputs | -| `border` | `#3A3A3A` | Rules, dividers, inactive outlines | -| `accent` | `#DA5C2C` | Attestation paths, active states, primary emphasis | -| `accent-soft` | `#F2B37B` | Node highlights and small warm details | -| `text` | `#EEEEEE` | Headings and logo text | -| `text-muted` | `#B4B4B4` | Supporting copy | - -## Usage Rules - -- Use orange as signal, not decoration. -- Keep surfaces mostly black and graphite. -- Prefer vector SVG for logos; export PNG only for compatibility. -- Keep radius low for product UI and cards. -- Avoid blue/teal gradients in Tabellio brand assets. +| Cobalt | `#2455CC` | Primary accent and light-background icon | +| Light blue | `#88B4FF` | Dark-background icon and active details | +| Ink | `#101B30` | Light-background title and text | +| Night | `#080E1C` | Dark page background | +| Paper | `#F4F7FC` | Dark-background title and light surfaces | +| Muted | `#96A4BF` | Secondary text on dark surfaces | + +The product name is **WritSet**. Use **WritSet** for the GitHub repository and +public-facing prose. The existing `@intelip/tabellio` package, CLI names, schemas, +Git refs, and stored records remain compatible during the transition. Historical +Tabellio assets and release records are retained as history, not current branding. diff --git a/docs/getting-started.md b/docs/getting-started.md index 043d3671..57b49a6d 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,7 +1,7 @@ # Connect a repository -Connect one trusted repository so reviewers can identify the exact code version, -its checks, checkpoint evidence, and any unresolved work. Try the +Connect one trusted repository to track the task, source version, checkpoints, +results, and unresolved work behind an agent session. Try the [credential-free demo](try-tabellio.md) first if you are evaluating the package. ## Integration requirements @@ -24,8 +24,8 @@ npx tabellio-version --expect-version 0.7.0 ``` Use installed CLIs with `npx`. Commands beginning `node scripts/` or `npm run` -in operator guides refer to a Tabellio source checkout. Source contributors use -[CONTRIBUTING.md](../CONTRIBUTING.md); do not copy Tabellio's development scripts +in operator guides refer to a WritSet source checkout. Source contributors use +[CONTRIBUTING.md](../CONTRIBUTING.md); do not copy WritSet's development scripts into an unrelated application. GitHub is the canonical code store through `origin`. Private transcripts, @@ -54,7 +54,7 @@ operator-approved repair step. Use the [platform boundary](github-code-storage-boundary.md) and [validation contract](validation-runner.md) to add `tabellio.platform.json` and `tabellio.validation.json` for your repository. Commit only the intended commands, -acceptance criteria, and data boundaries. Tabellio ships +acceptance criteria, and data boundaries. WritSet ships [examples](../examples/); copying a fixture does not establish passing evidence. Run the committed manifest against one exact candidate: diff --git a/docs/native-git-foundation.md b/docs/native-git-foundation.md index 601c6ceb..c457bea3 100644 --- a/docs/native-git-foundation.md +++ b/docs/native-git-foundation.md @@ -1,6 +1,6 @@ # Native Git Foundation -Tabellio's core works without a GitHub API or a proprietary code-storage service. It uses the installed Git executable, standard object storage, bare repositories, refs, notes, and worktrees. +WritSet's core works without a GitHub API or a proprietary code-storage service. It uses the installed Git executable, standard object storage, bare repositories, refs, notes, and worktrees. ## Architecture diff --git a/docs/try-tabellio.md b/docs/try-tabellio.md index 10caeda7..5706db8d 100644 --- a/docs/try-tabellio.md +++ b/docs/try-tabellio.md @@ -1,8 +1,11 @@ -# Try Tabellio +# Try WritSet -Run the published package in a new directory to see how a code review can retain -its source evidence and reject stale or missing proof. This sample needs no -provider account or credentials. +Run the published package in a new directory to see how source context is recorded, +rebuilt, and checked for stale or missing evidence. This sample needs no provider +account or credentials. + +WritSet was previously Tabellio. Version 0.7.0 remains published as +`@intelip/tabellio`; use the existing commands below during the naming transition. ## Requirements diff --git a/docs/workflow-model.md b/docs/workflow-model.md index dfd6dc5a..7a975aff 100644 --- a/docs/workflow-model.md +++ b/docs/workflow-model.md @@ -1,6 +1,6 @@ -# Tabellio Workflow Model +# WritSet Workflow Model -Tabellio turns an agentic coding run into a GitHub-bound context packet and, when wanted, a reviewable pull request packet. +WritSet turns an agentic coding run into a GitHub-bound context packet and, when wanted, a reviewable pull request packet. ## Core Objects @@ -25,7 +25,7 @@ Tabellio turns an agentic coding run into a GitHub-bound context packet and, whe | --- | --- | --- | | Git substrate | Standard Git CLI and bare repositories | Stores repositories, branches, commits, and patch state | | Session ledger | Entire; Git notes only for migration | Preserves checkpoint and agent-run context for later review | -| Evidence gate | Tabellio | Validates commands, checks, changed files, approvals, and side-effect policy | +| Evidence gate | WritSet | Validates commands, checks, changed files, approvals, and side-effect policy | | Stacked review | git-spice | Keeps related GitHub pull requests small, ordered, and reviewable | | Agent review | Codex review | Adds optional diff and evidence review by an agent | @@ -60,7 +60,7 @@ Each PR should expose: - external actions attempted or blocked - evidence artifact path -The context packet is usable without a pull request. GitHub is the review and code-distribution surface; Tabellio's evidence remains independently verifiable. +The context packet is usable without a pull request. GitHub is the review and code-distribution surface; WritSet's evidence remains independently verifiable. Raw evidence is not automatically a correctness claim. A typed validation decision proves that the exact committed evidence met the committed thresholds. Human review still owns product judgment outside the declared contract. diff --git a/package.json b/package.json index ffc1b971..336219ef 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "@intelip/tabellio", "version": "0.7.0", - "description": "Tabellio helps teams review AI-assisted code with evidence tied to the exact code version.", + "description": "WritSet helps teams understand and track context across coding-agent work.", "type": "module", "license": "Apache-2.0", "author": "IntelIP", - "homepage": "https://github.com/IntelIP/Tabellio/tree/main/docs", + "homepage": "https://github.com/IntelIP/WritSet/tree/main/docs", "repository": { "type": "git", - "url": "git+https://github.com/IntelIP/Tabellio.git" + "url": "git+https://github.com/IntelIP/WritSet.git" }, "bin": { "tabellio-run": "scripts/tabellio-run.mjs", @@ -41,7 +41,7 @@ "tabellio-checkpoint-proof": "scripts/tabellio-checkpoint-proof.mjs" }, "bugs": { - "url": "https://github.com/IntelIP/Tabellio/issues" + "url": "https://github.com/IntelIP/WritSet/issues" }, "private": false, "publishConfig": { @@ -129,22 +129,17 @@ "node": ">=20" }, "keywords": [ - "agentic", + "writset", + "context-engineering", + "coding-agents", + "agent-context", + "agent-memory", "git", - "native-git", - "bare-repository", - "worktree", - "pull-request", - "evidence", "provenance", - "ci", - "workflow", - "tabellio", - "json-schema", - "sarif", - "stacked-pr", - "git-spice", + "checkpoints", + "codex", "entire", - "codex" + "workflow", + "tabellio" ] } diff --git a/templates/pull_request_template.md b/templates/pull_request_template.md index 6ae3c938..889c2257 100644 --- a/templates/pull_request_template.md +++ b/templates/pull_request_template.md @@ -3,7 +3,7 @@ Who benefits, what problem this solves, and the observable before/after behavior. List changed files, scope limits, and any unfinished work. -## Tabellio Evidence +## WritSet evidence - [ ] Evidence envelope generated - [ ] Evidence envelope validated From f6db352dacaad9dbb72c0cd561ea95611d4f66b2 Mon Sep 17 00:00:00 2001 From: hudsonaikins-crown Date: Fri, 9 Oct 2026 16:15:29 -0400 Subject: [PATCH 2/2] chore: record WritSet checkpoint evidence Entire-Checkpoint: 1090543e680b