Skip to content
Open
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
13 changes: 1 addition & 12 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,12 @@ env:
NO_COLOR: "1"

agents:
queue: "linux-small"
queue: "macos-medium"

steps:
- label: ":git: Git 2.50.1"
key: "git-toolchain"
command: "bash .buildkite/scripts/build-modern-git.sh"
if: build.pull_request.id != null || build.env("TABELLIO_BUILD_CONTEXT") == "preflight" || build.branch == pipeline.default_branch
timeout_in_minutes: 15
artifact_paths:
- ".artifacts/toolchain/git-2.50.1-linux-amd64.tar.gz"

- label: ":test_tube: Repository check"
key: "repository-check"
command: "bash .buildkite/scripts/tests.sh"
depends_on: "git-toolchain"
if: build.pull_request.id != null || build.env("TABELLIO_BUILD_CONTEXT") == "preflight" || build.branch == pipeline.default_branch
timeout_in_minutes: 10
artifact_paths:
Expand All @@ -29,7 +20,6 @@ steps:
- label: ":mag: Fallow changed-code"
key: "fallow"
command: "bash .buildkite/scripts/fallow.sh"
depends_on: "git-toolchain"
if: build.pull_request.id != null || build.env("TABELLIO_BUILD_CONTEXT") == "preflight" || build.branch == pipeline.default_branch
timeout_in_minutes: 10
artifact_paths:
Expand All @@ -52,7 +42,6 @@ steps:
- label: ":shield: Product validation"
key: "product-validation"
command: "bash .buildkite/scripts/product-validation.sh"
depends_on: "git-toolchain"
if: build.pull_request.id != null || build.env("TABELLIO_BUILD_CONTEXT") == "preflight" || build.branch == pipeline.default_branch
timeout_in_minutes: 50
artifact_paths:
Expand Down
74 changes: 0 additions & 74 deletions .buildkite/scripts/build-modern-git.sh

This file was deleted.

33 changes: 22 additions & 11 deletions .buildkite/scripts/use-modern-git.sh
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
#!/usr/bin/env bash
set -euo pipefail

version="2.50.1"
artifact=".artifacts/toolchain/git-${version}-linux-amd64.tar.gz"
install_root="/tmp/intelip-tabellio-git-${version}"
required_version="2.50.1"
actual_version="$(git version | awk '{print $3}')"

buildkite-agent artifact download "$artifact" .
rm -rf "$install_root"
mkdir -p "$install_root"
tar -C "$install_root" -xzf "$artifact"
if ! awk -v actual="$actual_version" -v required="$required_version" '
BEGIN {
split(actual, actual_parts, ".")
split(required, required_parts, ".")
for (part_index = 1; part_index <= 3; part_index++) {
actual_part = actual_parts[part_index] + 0
required_part = required_parts[part_index] + 0
if (actual_part > required_part) {
exit 0
}
if (actual_part < required_part) {
exit 1
}
}
exit 0
}
'; then
printf 'Git %s or newer is required; found %s.\n' "$required_version" "$actual_version" >&2
exit 1
fi

export PATH="${install_root}/bin:${PATH}"
export GIT_EXEC_PATH="${install_root}/libexec/git-core"
export GIT_TEMPLATE_DIR="${install_root}/share/git-core/templates"
export GITPERLLIB="${install_root}/share/perl5"
git --version
36 changes: 36 additions & 0 deletions .tabellio/validators.json
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,42 @@
"metrics": [{"name": "baseline_integration_security_pass", "unit": "boolean", "passValue": 1, "failValue": 0}],
"cost": {"telemetry": "available", "usd": 0, "modelCalls": 0, "toolCalls": 0},
"summary": "Packaged artifact completeness and private-evidence boundaries"
},
"v060-identity-static": {
"commands": [["node", "--test", "tests/runner-identity.test.mjs", "tests/validation-runner.test.mjs"]],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Ship tests used by identity validators

Fresh evidence after the registry was added: npm pack --dry-run --json now includes .tabellio/validators.json, but it still includes no tests/** files, while this packaged profile invokes tests/runner-identity.test.mjs and tests/validation-runner.test.mjs. Extracting the package and running this profile produces failed evidence (Could not find 'tests/runner-identity.test.mjs, tests/validation-runner.test.mjs'), so the focused v0.6 identity validation shipped in the npm package cannot pass from a packaged install unless the tests are shipped or these profiles are changed to use packaged checks.

Useful? React with 👍 / 👎.

"metrics": [{"name": "runner_identity_static_pass", "unit": "boolean", "passValue": 1, "failValue": 0}],
"cost": {"telemetry": "available", "usd": 0, "modelCalls": 0, "toolCalls": 0},
"summary": "Runner identity implementation and validation-result compatibility"
},
"v060-identity-schema": {
"commands": [["node", "--test", "--test-name-pattern", "runner identity schema|stable schema identifiers", "tests/runner-identity.test.mjs", "tests/context-and-evidence.test.mjs"]],
"metrics": [{"name": "runner_identity_schema_pass", "unit": "boolean", "passValue": 1, "failValue": 0}],
"cost": {"telemetry": "available", "usd": 0, "modelCalls": 0, "toolCalls": 0},
"summary": "v0.4 validation result and runner identity schema"
},
"v060-identity-semantic": {
"commands": [["node", "--test", "--test-name-pattern", "runner identity schema binds|typed validators enforce", "tests/runner-identity.test.mjs", "tests/validation-runner.test.mjs"]],
"metrics": [{"name": "runner_identity_semantic_pass", "unit": "boolean", "passValue": 1, "failValue": 0}],
"cost": {"telemetry": "available", "usd": 0, "modelCalls": 0, "toolCalls": 0},
"summary": "Package version, source commit, cleanliness, tag, and typed evidence semantics"
},
"v060-identity-workflow": {
"commands": [["node", "--test", "--test-name-pattern", "runner identity CLI workflow|typed validation distinguishes", "tests/runner-identity.test.mjs", "tests/validation-runner.test.mjs"]],
"metrics": [{"name": "runner_identity_workflow_pass", "unit": "boolean", "passValue": 1, "failValue": 0}],
"cost": {"telemetry": "available", "usd": 0, "modelCalls": 0, "toolCalls": 0},
"summary": "Machine-readable version query and validation evidence workflow"
},
"v060-identity-operational": {
"commands": [["node", "--test", "--test-name-pattern", "runner identity operational lookup", "tests/runner-identity.test.mjs"]],
"metrics": [{"name": "runner_identity_10x_duration_ms", "unit": "milliseconds", "pattern": "runner_identity_10x_duration_ms=([0-9.]+)"}],
"cost": {"telemetry": "available", "usd": 0, "modelCalls": 0, "toolCalls": 0},
"summary": "Bounded local runner identity resolution"
},
"v060-identity-security": {
"commands": [["node", "--test", "--test-name-pattern", "runner identity security reports|runner identity CLI workflow", "tests/runner-identity.test.mjs"]],
"metrics": [{"name": "runner_identity_security_pass", "unit": "boolean", "passValue": 1, "failValue": 0}],
"cost": {"telemetry": "available", "usd": 0, "modelCalls": 0, "toolCalls": 0},
"summary": "No private path disclosure and fail-closed expectation checks"
}
}
}
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,25 @@ All notable changes to Tabellio are recorded here.

## Unreleased

## 0.6.0 - release candidate

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Date the v0.6.0 changelog heading

When tabellio-release plan is used for this 0.6.0 candidate, the existing release planner rejects the current changelog because it specifically requires a heading matching ## 0.6.0 - YYYY-MM-DD before creating the release intent. Leaving this as release candidate means the documented release gates cannot pass for the version introduced here until this heading is converted to the dated release format.

Useful? React with 👍 / 👎.


### Added

- Machine-readable `tabellio-version` identity reporting for package version, exact source commit, source cleanliness, and matching release tag.
- Validation-result v0.4 runner provenance and focused INTB-279 product-validation evidence.

### Changed

- Typed validation evidence now binds the Tabellio package and exact runner source while retaining v0.1 through v0.3 reader compatibility.

### Release Gates

- `tabellio-preflight --profile release`
- `npm run check`
- Fallow whole-repository and changed-code scans
- `npm pack --dry-run --json`
- Exact candidate and merged-head Tabellio validation

## 0.5.0 - 2026-07-20

This is the first publication candidate after v0.2.0. Versions 0.3.0 and 0.4.0 were development milestones and were not tagged, released on GitHub, or published to npm.
Expand Down
14 changes: 12 additions & 2 deletions docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,16 @@ node scripts/tabellio-control-ref.mjs plan \

## Preflight And Release

Inspect the local runner identity before trusting a version claim:

```bash
npm run tabellio:version -- \
--expect-version 0.6.0 \
--expect-ref HEAD
```

Add `--require-clean` for an immutable candidate and `--require-release-tag` only after the approved, non-draft GitHub Release exists. The release check requires an annotated `origin` tag at the exact source commit; a local-only tag is insufficient.

Run preflight before agent work and again from clean merged `main`:

```bash
Expand Down Expand Up @@ -104,8 +114,8 @@ node scripts/tabellio-release.mjs plan \
--owner example \
--remote-repo repository \
--number 42 \
--version 0.5.0 \
--notes docs/releases/v0.5.0.md \
--version 0.6.0 \
--notes docs/releases/v0.6.0.md \
--out /tmp/tabellio-release-intent.json
```

Expand Down
35 changes: 35 additions & 0 deletions docs/intb-279-v060-execution-contract.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# INTB-279: Tabellio v0.6.0 Identity Contract

## Required outcomes

- `package.json`, the changelog, and release notes identify version `0.6.0`.
- `tabellio-version` emits JSON containing the package name and version, exact Git commit, source cleanliness, and matching release tag when one exists.
- New validation results use `tabellio-validation-result/v0.4` and bind the same runner identity.
- Readers continue to accept validation-result versions v0.1 through v0.3.

## Invariants

- Inspection is local and read-only.
- Unavailable Git identity remains `null`; it is never inferred.
- Dirty source remains visible as `sourceDirty: true`.
- No filesystem path or source content is included in runner identity.
- Every required validator has available zero-cost telemetry.

## Forbidden outcomes

- Package, evidence, and release-note versions diverge.
- A missing or mismatched tag is represented as released.
- A moved commit reuses earlier validation evidence.
- Release publication, merge, deployment, billing, DNS, or consumer-repository mutation occurs without its separate approval.

## Validation

The exact candidate commit must pass:

- `tabellio.v060-identity.validation.json`
- `tabellio.validation.json`
- repository checks and tests
- package dry-run inspection
- hosted CI and terminal review sync after push

The release is not shipped until a GitHub Release for tag `v0.6.0` exists. It is not deployed without an exact runtime receipt.
28 changes: 28 additions & 0 deletions docs/releases/v0.6.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Tabellio v0.6.0

Tabellio v0.6.0 makes the running control-plane version independently identifiable.

## Added

- `tabellio-version`, a machine-readable local identity command.
- Runner identity in validation-result v0.4: package name, package version, exact source commit, source cleanliness, and matching release tag.
- A focused product-validation manifest for the v0.6.0 identity contract.

## Compatibility

- Existing validation-result v0.1, v0.2, and v0.3 documents remain supported.
- Git commit pins remain the distribution mechanism for consumer repositories.

## Verification

```sh
tabellio-version \
--expect-version 0.6.0 \
--expect-ref HEAD \
--require-clean \
--require-release-tag
```

The release-tag requirement passes only when `v0.6.0` is an annotated tag on the
exact commit in the GitHub `origin` remote and a published, non-draft GitHub
Release exists for that tag. A local-only tag reports `tagged`, never `released`.
2 changes: 1 addition & 1 deletion docs/validation-runner.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ The runner:
7. Removes the worktree even after failure.
8. Writes an integrity-protected result to `refs/tabellio/validations` with compare-and-swap retries.

Command-manifest results use `tabellio-validation-result/v0.2`. Product-validation results use v0.3 and embed the acceptance digest, typed validator results, bounded evidence reports, total observed validation cost, and final policy decision. Both require `checkpointRevision` so checkpoint proof remains bound to the pull-request head when the validated revision is a later squash-merge commit. Runtime readers continue to accept legacy v0.1 and v0.2 results.
Command-manifest results use `tabellio-validation-result/v0.2`. Product-validation results use v0.4 and embed the acceptance digest, typed validator results, bounded evidence reports, total observed validation cost, final policy decision, and exact Tabellio runner identity when available. Both require `checkpointRevision` so checkpoint proof remains bound to the pull-request head when the validated revision is a later squash-merge commit. Runtime readers continue to accept v0.1 through v0.4 results.

Read the newest result for a commit:

Expand Down
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@intelip/tabellio",
"version": "0.5.0",
"version": "0.6.0",
"description": "Tabellio: GitHub-native context and evidence for agentic development.",
"type": "module",
"license": "Apache-2.0",
Expand All @@ -16,6 +16,7 @@
"tabellio-stack-operation": "scripts/tabellio-stack-operation.mjs",
"tabellio-review": "scripts/tabellio-review.mjs",
"tabellio-validate": "scripts/tabellio-validate.mjs",
"tabellio-version": "scripts/tabellio-version.mjs",
"tabellio-merge-ready": "scripts/tabellio-merge-ready.mjs",
"tabellio-validator": "scripts/tabellio-validator.mjs",
"tabellio-design-memory": "scripts/check-tabellio-design-memory.mjs",
Expand Down Expand Up @@ -51,6 +52,7 @@
"tabellio.platform.json",
"tabellio.validation.json",
"tabellio.*.validation.json",
".tabellio/validators.json",
"schemas",
"scripts",
"examples",
Expand All @@ -70,6 +72,7 @@
"tabellio:review": "node scripts/tabellio-review.mjs",
"tabellio:review:example:check": "node scripts/check-tabellio-review-cycle.mjs --cycle examples/tabellio-review/minimal-cycle.json && node scripts/check-tabellio-agent-review.mjs --review examples/tabellio-review/minimal-agent-review.json",
"tabellio:validate": "node scripts/tabellio-validate.mjs",
"tabellio:version": "node scripts/tabellio-version.mjs",
"tabellio:merge-ready": "node scripts/tabellio-merge-ready.mjs",
"tabellio:control-ref": "node scripts/tabellio-control-ref.mjs",
"tabellio:preflight": "node scripts/tabellio-preflight.mjs",
Expand Down
Loading
Loading