CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/coding-policy

General-purpose coding policy for Baruch's AI agents

76

Quality

95%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

context-artifacts.mdrules/

alwaysApply:
No
applyTo:
.tessl-plugin/plugin.json, rules/**, skills/**, .tesslignore, CHANGELOG.md, README.md — when authoring or modifying plugin artifacts
description:
Plugin structure, rule/skill format, review pipeline, surface sync, consistency audits — the authoring contract for Tessl plugins

Context Artifacts

Plugin Structure

  • Every plugin has a .tessl-plugin/plugin.json manifest with name, version, and description — full schema in rules/skill-authoring.md
  • The plugin's README.md is the project's README.md — same file. Extend the existing README with rules table, skills table, and installation instructions
  • Include a Tessl registry badge at the top of README: [![tessl](https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.tessl.io%2Fv1%2Fbadges%2F<workspace>%2F<plugin>)](https://tessl.io/registry/<workspace>/<plugin>)
  • Skills live in skills/<name>/SKILL.md, rules live in rules/<name>.md
  • Standard directories: rules/, skills/<name>/
  • Use .tesslignore to exclude build artifacts and CI files from the published plugin
  • Validate structure with tessl plugin lint before every publish
  • CHANGELOG.md and similar repo files show as orphaned in tessl plugin lint — lint only tracks manifest-declared paths

Rules Are Prose

  • One concept per rule file — don't combine unrelated concerns
  • Compose by reference (see rules/foo.md), don't duplicate content across rules — if you want to state the same point in two rules, one states it and the other references it

Rule Format

  • H1 title matching the filename concept (e.g., # Commit Conventions for commit-conventions.md)
  • No code blocks unless demonstrating a specific command
  • Frontmatter fields, passthrough behavior, and scoping with applyTo: — see rules/rule-frontmatter.md
  • Section count, line budget, prose discipline (what to cut, what to keep, carve-out format) — see rules/context-writing-style.md

Mandatory Review

  • Every skill change must pass tessl review run --threshold 85 before publish
  • Below-threshold scores block the pipeline
  • Wire into CI as a changed-skills loop, not static per-skill steps. The loop iterates over git diff --name-only <prev-sha>..HEAD -- 'skills/'. Reference: .github/actions/skill-review/action.yml (consumers uses: jbaruch/coding-policy/.github/actions/skill-review@<ref>)
  • Fallback: review every skill when the diff base is absent (manual workflow_dispatch, initial push, all-zeros sentinel SHA); hard-fail when the base is set but unreachable
  • Rubric verifies: frontmatter validity, execution-mode preamble matching the skill's shape (sequential workflow or action router per rules/skill-authoring.md), flat step numbering, typed Skill() calls, silence-rule compliance, channel-appropriate formatting
  • Act on concrete feedback (tighter triggers, extracted reference material, tightened descriptions); re-review until the gate passes
  • Credit-outage tolerance is opt-in and narrow — see Credit-Outage Review Carve-Out

Credit-Outage Review Carve-Out

  • Narrow exception for skipping review during a tessl out-of-credits (403) billing outage
  • Applies when tessl review run fails with the out-of-credits signature; never a below-threshold score
  • The skill-review action's credit-outage: skip input publishes the affected skill unreviewed rather than blocking every skill-changing merge until credits return
  • Preconditions (all required):
    1. Opt-in explicit — the consumer sets credit-outage: skip; default fail preserves the gate. Classification is the action's decision contract — see .github/actions/skill-review/review-skills.sh run_reviews
    2. Fail-safe — only the out-of-credits signature skips; every other non-zero exit still hard-fails the publish (below-threshold score, auth error, tooling bug)
    3. Each unreviewed publish is flagged — a ::warning:: plus a $GITHUB_STEP_SUMMARY note names every skipped skill, surfaced on the unreviewed-skills action output
    4. The gate self-heals — every publish re-attempts review; a credit top-up or the monthly reset restores it
  • The forbidden review-step bypass in Disagreeing With the Reviewer remains forbidden
  • Every skill reviewed clean, and every non-credit failure, still blocks or passes exactly as Mandatory Review prescribes

Disagreeing With the Reviewer

  • Never lower --threshold 85 to make a failing skill pass. Bypassing CI by other means (local publish, [skip ci], disabling the review step) is forbidden under rules/ci-safety.md
  • When you disagree with the reviewer's conclusions, run tessl review fix <skill> locally
  • Back up SKILL.md and any reference files before invoking the fix loop
  • The fix loop is a diagnostic signal, not a patch
  • Diff the applied changes against the backup
  • Keep the genuinely-improving moves (tighter triggers, less prose, better Skill() typing)
  • Reject the over-aggressive cuts
  • Re-run tessl review run until the gate passes
  • Shipping the fix loop's output verbatim is forbidden even when the score improved
  • Curate the fixes manually with judgment

Surface Sync

When you add, remove, or rename a rule or skill, update all of these:

  • .tessl-plugin/plugin.json — add/remove the rule path in rules or the skill path in skills
  • CI workflow — no edit needed when the canonical changed-skills loop is in use (it picks new/removed paths up automatically via git diff); for bespoke workflows, confirm the path glob covers the added skill or excludes the removed one
  • README.md — update the rules table and/or skills table
  • CHANGELOG.md — add an entry describing the change

CHANGELOG Hygiene

  • Every merge publishes a version (publish-on-merge, e.g. via tesslio/patch-version-publish)
  • No Unreleased section — the heading is forbidden
  • tesslio/patch-version-publish does NOT stamp CHANGELOG.md (it only bumps the manifest version and publishes)
  • Stamping a ## <version> — <date> heading is a separate step the repo wires itself
  • Reusable stamp step: .github/actions/stamp-changelog (consumers uses: jbaruch/coding-policy/.github/actions/stamp-changelog@<ref>, wired before tesslio/patch-version-publish)
  • With a wired stamp step: authors add un-headed ### entry blocks at the top of CHANGELOG.md
  • The stamp step writes the ## <version> — <date> heading above those blocks before publish
  • Without a stamp step: authors write the ## <version> — <date> heading manually above their entries
  • Never leave un-headed ### blocks expecting auto-stamping when no stamp step is wired
  • Consolidation groups related entries, collapses redundant detail, retains load-bearing facts (what changed, references)
  • CHANGELOG is archive but bounded — a PR's full motivation lives in the PR body and commit messages; an entry can be one or two sentences when the broader context lives elsewhere
  • Audit the top section for duplication — multiple PRs reworking the same rule become one entry with the final outcome

Consistency Check

After modifying rules, audit for cross-rule alignment:

  • No duplicated bullets across rules — if two rules say the same thing, one should reference the other
  • Don't duplicate long command literals or contract statements between rules and skills
  • Rules state the contract
  • Skills (or their scripts) carry the executable form per rules/script-delegation.md
  • New rules don't contradict existing ones
  • Skills follow the conventions their own rules prescribe
  • Documentation tables match .tessl-plugin/plugin.json entries

Post-Edit Rule Audit

After editing a rule, audit the repo itself against the new rule text and fix any drift in the same PR:

  • Grep for every instance of the pattern the rule governs (.env.example files, SKILL.md step headings, secret names, etc.) and update them to satisfy the new wording
  • A rule that doesn't describe what's already committed in the repo erodes trust in every rule
  • If drift can't be fixed in the same PR (e.g., it touches a frozen branch), file a follow-up issue that references the rule-edit commit

README.md

tile.json