| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Complete agent-assisted development workflow for Edge repositories: slash skills, companion scripts, coding standards, an autonomous Asana-to-PR orchestration system with deterministic enforcement hooks, a post-hoc eval suite, and meta-tooling for maintaining the workflow itself.
The distributable content lives under .cursor/. This repo is the versioned home for those skills, rules, scripts, and docs, plus the portable orchestration trees a second machine bootstraps from.
The .cursor/ path is historical, not a commitment: the system is built to sync across agent harnesses, not just Cursor. Claude Code is the primary consumer today (~/.claude/skills symlinks to the canonical tree, ~/.claude/CLAUDE.md is generated from the always-apply rules, and the enforcement hooks are Claude Code hooks); OpenCode gets generated mirrors via tool-sync.sh. Other harnesses are untested, but the content is plain markdown and shell, so most of it should carry in theory; the hook layer is the Claude-specific part.
The canonical local doc lives at ~/.cursor/README.md. During /convention-sync, that file is mirrored to edge-dev-agents/README.md, and the repo copy should not keep a second .cursor/README.md.
Fresh machine (one command): clone this repo and run the bootstrap. It installs everything (cursor skills/rules, the orchestration system, hook registrations, workflows, and shared memories) into your home dir, seeds credentials.json from the example, and links skills + shared memory:
git clone <this-repo> ~/git/edge-dev-agents && cd ~/git/edge-dev-agents && ./bootstrap.sh
# then edit ~/.config/agent-watcher/credentials.json with your real asana_tokenFor incremental onboarding instead of the full bootstrap:
1. Set the required env var in your ~/.zshrc:
export GIT_BRANCH_PREFIX=yourname # e.g. jon, paul, samThis drives branch naming and PR discovery across the workflow.
2. Sync the repo copy into ~/.cursor/:
This repo treats ~/.cursor/ as the canonical working copy. Use /convention-sync to move local changes into edge-dev-agents, or run the companion script directly when onboarding:
~/.cursor/skills/convention-sync/scripts/convention-sync.sh \
--repo-to-user --stage3. Verify prerequisites:
The orchestration system runs Asana tasks to PRs autonomously: a watcher picks up Pending tasks, spawns one isolated agent session per task, and a watchdog tends the live sessions. Post-hoc evals grade what each run did.
At a glance:
flowchart TD
A["Asana project (Pending tasks)"] -->|"watcher tick 120s"| B{"guardrail and cap OK?"}
B -- no --> A
B -- yes --> C["allocate slot: worktree + cloned sim + Metro port"]
C --> D["spawn tmux claude-asana-GID (claude --rc --yolo /one-shot)"]
D --> E["/one-shot 7 phases: Planning, Developing, Reviewing, Testing"]
E --> F{"finalize-gate: CI green + bots clean + 0 unresolved threads"}
F -- "not green" --> E
F -- green --> G["agent_status = Complete"]
G -->|"watchdog completion sweep"| H["retire to done-asana-GID; free sim, Metro, slot; claude kept alive"]
H -->|"operator sets Pending (revisit resumes with memory)"| A
H -->|"beyond keep_completed_sessions"| I["reaped"]
agent-watcher/asana-watcher.js, launchd every 120s, polls the project for agent_status = Pending.
/one-shot --yolo, a single agent turn: seven phases with agent_status advanced via update-status.sh at each boundary. Planning (/asana-plan), Developing (/im), Testing (/build-and-test, on-sim verification), Reviewing (/pr-create through the CI + reviewer-bot watch), Complete. Status LEADS the work: the phase status is set when that kind of work starts, never as a side effect of a terminal action. The agent runs hands-off: no interactive prompts, no self-respawn, every wait a bounded blocking in-turn call. The full decision graph, including followup, concession, landing, and cheese branches, is in the /one-shot decision flowchart below.
Complete requires the finalize gate: every primary PR CI-green, every reviewer bot run-and-concluded clean on the ready HEAD, zero unresolved review threads. At green, landability is decided FIRST: a PR with a human APPROVED review (or the task's Force Land field) lands via /pr-land and the Build field is ignored. Only a non-landable green run kicks a cheese build, pinning the task's own unpublished dep PRs when the deliverable requires them.
agent-watcher/session-watchdog.js, launchd every 120s, tends live sessions:
It does NOT re-engage finished tasks: that is the watcher's job (Pending resumes), so watchdog and watcher stay decoupled.
Every agent is an INTERACTIVE claude --rc process in a detached tmux session, never a headless claude -p. The pane is part of the machinery, not just a viewport.
Every run ends by attaching ONE structured run report to the Asana task (agent-run-report-NN-<slug>.md). The report is more than documentation: its attachment timestamp is the followup-scope WATERMARK. Comments newer than the newest report are undischarged scope for the next run, so every comment a run owes posts BEFORE the attach, and a comment that must land later forces a re-attach so the watermark is last again. The attach boundary is gated (see require-clean-run-report.sh below): template form, prose lint, traceability frontmatter, one report doc per segment, and resolvable GitHub citations are all checked mechanically.
Post-hoc, per run or per cohort. See Evals.
The full decision flow of an orchestrated /one-shot --yolo run, including the followup, concession, landing, and cheese branches. Rule ids in brackets name the governing one-shot/cheese/build-and-test rules.
flowchart TD
START["/one-shot --yolo task-url"] --> REFIRE{"re-fire? task already
ran in this session"}
REFIRE -- "no (fresh or resumed-new)" --> PLAN
REFIRE -- "yes, still mid-run" --> CONT["continue current phase
[ignore-refired-one-shot]"]
REFIRE -- "yes, previously FINISHED" --> SCOPE["LIVE scope check:
check-followup-scope.sh
(never from memory)"]
SCOPE -- "operator asks newer
than report watermark" --> FOLLOWUP["deliver the new scope
[followup-scope-is-the-deliverable]"]
FOLLOWUP --> DEV
SCOPE -- "0 newer comments" --> GATE
PLAN["Planning: /asana-plan, plan doc
(confirmation waived in yolo)"] --> DEV
DEV["Developing: /im contract
(lint-warnings, lint-commit,
clean history)"] --> TEST
TEST["Testing: slot-preflight -> obey PLAN/INVOKE
-> build -> drive the REAL action on sim
(log-attempt every drive, pixel-verify proofs)
[preflight-before-build-decisions]"] --> WALL{"hit a wall?"}
WALL -- no --> PR
WALL -- yes --> ATTEMPT["log the attempt
(failed:/blocked:/loss:)"] --> VALID{"concession-validator
verdict [yolo-true-blockers]"}
VALID -- "legitimate: true" --> BLOCKED["blocked completion:
Complete --blocked yes (one-line
comment, report attached as normal)"]
VALID -- "legitimate: false" --> RETRY["do what_to_try, continue"] --> TEST
PR["Reviewing: /pr-create (verify green, clean tree,
template, evidence; Asana attach; multi-repo
subtasks; draft dep PRs excluded from gate)"] --> WATCH
WATCH["watch-pr bounded poll; bots must be
SUCCESS (NEUTRAL = findings -> /bugbot);
fixes via amend + force-with-lease"] --> GATE
GATE{"finalize-gate green:
CI + every bot clean +
0 unresolved bot threads
on EVERY primary PR"}
GATE -- "not green" --> WATCH
GATE -- green --> LAND{"landable? human APPROVED
review (any point in history)
OR Force Land field
[land-on-approval]"}
LAND -- yes --> PRLAND["/pr-land with TASK URL
(dep ordering: merge dep -> publish ->
bump -> gui; npm OTP parks at
operator boundary). Build field IGNORED
-> NO cheese push"] --> REPORT
LAND -- no --> BUILDF{"Build field?
[cheese-build-on-green]"}
BUILDF -- none --> REPORT
BUILDF -- staging --> REPORT
BUILDF -- "cheese (feta/gouda/...)" --> PINQ{"gui deliverable requires
unpublished dep PRs?"}
PINQ -- yes --> PINNED["/cheese --pin each dep
at ITS PR head
[cheese:orch-pins-required]"] --> REPORT
PINQ -- no --> POINTER["/cheese pointer reset
test-branch -> PR head"] --> REPORT
REPORT["RE-READ report template -> write report
-> require-clean-run-report lint at attach
-> set tested field from THIS run's evidence"] --> COMPLETE
COMPLETE["agent_status = Complete
(gated: fresh followup-scope check
required by hook)"]
Status discipline throughout: the phase status is set when that KIND of work starts (status leads the work), never as a side effect of a terminal action.
The hands-off contract and the quality bars are enforced by deterministic Claude Code hooks, not merely documented. Registrations live in ~/.claude/settings.json and are distributed as the claude-settings/hooks.json projection (see Distribution); the scripts live in agent-watcher/hooks/. Hook BODIES are re-read from disk on every fire, so a script fix reaches every live session immediately; only registration changes need a session restart or settings reload.
Most gates no-op unless AGENT_TASK_GID is set (orchestrated sessions only). The prose gates and the Asana authorship marker run everywhere, because interactive sessions post PRs and Slack messages too.
The dominant compliance failure across audited runs is cross-file-read skipping: rules INSIDE the prompt a session holds are followed almost universally, while obligations that require reading ANOTHER skill file mid-flow get skipped or satisfied with a partial slice. The enforcement stack therefore never trusts "go read X". A contract reaches a run's context in exactly one of three ways, all of which stamp the same per-segment marker, and the marker is what the read-gate checks before letting any companion script execute:
Markers are evidence about what is IN CONTEXT, so they expire when the context does: startup/resume (a new segment) kills all of them plus the ingestion marker; compact/clear kills the read markers, because compaction keeps a paraphrase and drops the rules; headless claude -p children (the no-slop judge) inherit the gid but are ignored entirely. Re-arming is cheap by design — the gate re-delivers lazily, only for skills the run actually touches again.
flowchart TB
SPAWN["segment boundary:<br/>planning contracts injected whole"]
READ["agent reads it whole:<br/>full Read / bare cat / Skill tool<br/>(sed slices earn nothing)"]
GATE["gate denies, message = full SKILL.md<br/>(deny-with-body)"]
M[("per-segment marker<br/>/tmp/agent-skill-read-<gid>-<skill>")]
CALL{"companion-script call:<br/>owning skill's marker present?"}
RUN["script executes"]
PTR["deny with read-in-full pointer,<br/>no marker until the full read"]
EXP["expiry: startup/resume → all markers;<br/>compact/clear → read markers;<br/>claude -p children ignored"]
SPAWN --> M
READ --> M
GATE --> M
M -.attests.-> CALL
CALL -->|yes| RUN
CALL -->|"no, body ≤ 50KB"| GATE
GATE -->|retry| CALL
CALL -->|"no, body > 50KB (one-shot, pr-land)"| PTR
EXP -.expires.-> M
The gate closes one half of the substitution failure class (a sanctioned script run contract-blind); the raw-API blocks (block-raw-asana-api.sh, block-raw-gh-writes.sh, block-raw-thread-resolve.sh) close the other half (an improvised replacement for the script), and the status gates check outcome evidence at phase boundaries regardless of how the work was done.
| Group | Hook | Enforces |
|---|---|---|
| Status gates | require-plan-before-developing.sh | No Developing until ingestion evidence (asana-get-context.sh ran, attachments downloaded) AND the plan doc exist |
| require-concession-validation.sh | A block or a downgrade-finalize needs a fresh concession-validator verdict bound to the exact reason | |
| require-followup-scope-on-complete.sh | Complete needs a fresh live scope check: no newer operator comments unaddressed, zero blocking threads, reviewer bots concluded, watermark last | |
| require-continuation-or-block.sh (Stop) | A turn may not end except at Complete or a validated block | |
| require-tdd-current.sh | TDD-flagged tasks keep the design doc current before finalize | |
| PR / git gates | git-history-gate.sh | Commits go through lint-commit.sh; no raw git commit, no --no-verify |
| pre-pr-gate.sh | PR creation needs test evidence (proof frames or a justified blocker note) and runs a duplicate-utility scan | |
| require-subtasks-for-multi-repo-pr.sh | Multi-repo PR sets attach subtask-per-PR, never flat onto the main task | |
| require-clean-run-report.sh | Report attach: template form, prose lint (with judge), traceability frontmatter auto-fill, stable ordinals, one doc per segment, no dead GitHub citations | |
| block-raw-thread-resolve.sh | Review threads resolve through the reply-first scripts, never raw GraphQL | |
| block-raw-gh-writes.sh | Raw gh pr create (non-draft), gh pr comment/review, and gh api comment/review writes go through the linted companion scripts | |
| block-upfront-conflict-probe.sh | PR mergeability is a landing-time concern; no upfront probes | |
| ensure-tdd-pr-link.sh | PR bodies carry the TDD link when one is owed | |
| no-push-after-complete.sh | No branch/PR mutation once the task is Complete (post-Complete rework must re-arm) | |
| Sim / testing gates | require-playbook-before-drive.sh | The sim-testing playbook must be read before the first drive; injects the corePlugins working-set contract once per run |
| require-maestro-device.sh | Drives name an explicit --device (concurrent sims make defaults ambiguous) | |
| block-simctl-booted.sh | No simctl ... booted in slot sessions | |
| block-coordinate-taps.sh | No blind coordinate taps; drive by accessibility ids or text | |
| block-sim-wipe.sh | No sim erase/wipe (pooled sims carry funded test accounts) | |
| require-bundle-triage.sh | Stale-bundle symptoms get triaged before deeper debugging | |
| Prose gates | lint-md-on-write.sh | Mechanical no-slop lint on markdown written outside the internal allowlist (full on Write, fragment on Edit/heredoc) |
| slack-prose-gate.sh | Outbound Slack text passes the shared lint with the judge tier; brevity nudge over ~900 chars | |
| Hygiene / injectors | no-interactive-prompt.sh | No AskUserQuestion in hands-off runs; pick the defensible default |
| no-self-respawn.sh | No ScheduleWakeup/CronCreate/claude --resume self-respawn | |
| block-piped-watcher-scripts.sh | Watcher status scripts run bare (pipes silently masked their exit codes); gated-claim commands hard-block instead of rewriting | |
| mark-agent-authored-asana.sh | In-flight-run Asana prose carries the 🥋/👊 authorship markers; operator-context text stays unmarked | |
| require-agents-md-skill.sh + mark-agents-md-skill-read.sh | AGENTS.md edits load the authoring skill first | |
| require-skill-read-for-scripts.sh + mark-skill-read.sh | A skill's companion script runs only after its SKILL.md FULLY entered context; the deny message delivers the complete body itself (deny-with-body) and writes the marker, so the retry passes educated. Marking is strict: full Read (no offset/limit), bare cat, Skill tool, or gate/session-start injection; partial reads (sed slices, cat piped to head) earn nothing. Bodies over 50KB (one-shot, pr-land) fall back to a read-in-full pointer without a marker | |
| mark-playbook-read.sh | Records the playbook read the drive gate requires | |
| nudge-asana-mcp.sh | Steers bulk Asana reads to the cheaper script path | |
| block-raw-asana-api.sh | Raw Asana API calls go through the sanctioned scripts (ingestion with attachment download, field reads, writes, scope checks) | |
| inject-run-context.sh, inject-no-slop-reminder.sh, inject-no-slop-line.sh | Session-start run context, plus the asana-plan + task-review bodies on every fresh segment (startup/resume, and compact while unplanned); a fresh segment (startup/resume) expires the prior segment's ingestion + skill-read markers, and compact/clear expire skill-read markers too, since compaction destroys the in-context text the marker attests to (the read-gate then re-delivers bodies lazily); headless claude -p children (no-slop judge etc.) inherit the gid but are ignored, since a child's startup is not a run segment; no-slop refresh at session start and every prompt | |
| Shared helpers | strip-cmd-mentions.sh | Blanks quoted/heredoc spans so hooks trigger on commands, not on text that merely mentions them |
| cmd-executes.sh | Command-position matching, so naming a script in a grep never fires the gate that guards executing it |
require-block-validation.sh is an unregistered legacy kept for history; the concession gate replaced it.
All outward prose (PR bodies and comments, commit messages, Asana text, run reports, Slack, docs that leave the team, and chat replies) follows the /no-slop rules: banned vocabulary, no em dashes, no courtesy enders, no structure announcements, no count-announcement openers, plain copulas. The full pattern list is published with this repo, so review comments can cite it instead of private config paths.
Enforcement is layered, one shared implementation per rule class (no-slop/scripts/no-slop-lint.sh is the single lint every boundary calls):
Where each tier runs:
| Boundary | Tier | Enforced by |
|---|---|---|
| Markdown file writes (outside internal allowlist) | mechanical | lint-md-on-write.sh hook |
| PR body at create | mechanical + judge | pr-create.sh |
| PR replies, mark-addressed, standalone comments | mechanical + judge | pr-address.sh |
| Review submits (top-level + inline bodies) | mechanical + judge | github-pr-review.sh |
| Slack sends, drafts, canvases | mechanical + judge | slack-prose-gate.sh hook |
| Run-report attach | mechanical + judge (em dashes auto-rewritten in place) | require-clean-run-report.sh hook |
| TDD docs | mechanical | tdd-lint.sh |
| Commit messages | scrub (session trailers/URLs stripped) | lint-commit.sh |
The file-write hook exists because posted prose travels as --body-file/$(cat file) per the file-over-args convention, so a command-string hook literally cannot see it; the bytes are visible when the file is written and when the poster script assembles the final body, and both points are covered. Known residuals: raw gh api posting that bypasses the scripts is unlinted, and Asana comments get the authorship marker but no prose lint today.
/build-and-test owns verification. For edge-react-gui and its dependency repos, verification means driving the REAL user action on a booted simulator (maestro), not just green unit tests: a dep change is not done until it runs in the app.
The eval suite grades finished runs against explicit rubrics, with every BAD finding carrying a citation an auditor can open.
Beyond cursor skills/rules, this repo mirrors portable trees so a second Mac is reproducible from a single clone + ./bootstrap.sh:
/convention-sync keeps all of the above in sync (home to repo) and hard-blocks staging when the remote is ahead, the branch is wrong, or the sync would delete or revert canonical files authored elsewhere (the fix is a repo-to-user pass first). bootstrap.sh does the reverse (repo to home) on a new machine.
The repo's remote side is plain git (normal pull/push on the checkout). The sync machinery exists for the other hop, home to checkout, and the honest rationale splits into structural reasons and historical ones:
Net: the settings-key projection and unattended conflict handling are why the scripts stay; the file-copying part is the replaceable bit if the relocation cost is ever paid.
edge-dev-agents/
├── README.md # Synced copy of ~/.cursor/README.md
├── bootstrap.sh # Fresh-machine installer (repo -> home)
├── agent-watcher/ # Orchestration system incl. hooks/ (-> ~/.config/agent-watcher)
├── claude-settings/ # hooks.json registration projection (-> ~/.claude/settings.json .hooks)
├── claude-workflows/ # Workflow scripts (-> ~/.claude/workflows)
├── memory-shared/ # Shared Claude memory notes (-> ~/.claude/memory-shared)
├── bin/ # link-shared-memory.sh
└── .cursor/
├── skills/ # Slash skills (*/SKILL.md) + companion scripts
├── scripts/ # Shared portability and dashboard scripts
├── commands/ # Minimal command wrappers
└── rules/ # Coding and workflow standards (.mdc)
Separation of concerns:
All GitHub API work uses gh CLI. Deterministic git operations should live in scripts, not be re-described independently across skills.
| Skill | Description |
|---|---|
| /one-shot | End-to-end task flow: plan, implement, test, PR, finalize; the skill orchestrated runs execute |
| /asana-plan | Build an implementation plan from Asana or ad-hoc requirements |
| /task-review | Fetch Asana task context, summarize, and resolve the target repo by code evidence |
| /im | Implement with clean, structured commits (lint-warnings, lint-commit, history discipline) |
| /build-and-test | Build and verify: real on-sim maestro drives for GUI work, playbook + flow library |
| /pr-create | Create a PR with repo-aligned title/body, evidence, and Asana attach |
| /bugbot | Address Cursor Bugbot findings until the PR is actually clean |
| /pr-address | Address PR feedback: fixups, reply-then-resolve, mark-addressed |
| /pr-review | Review a PR: deep multi-agent pass by default, Edge-specific checklist |
| /pr-land | Land approved PRs: prepare, merge, publish, GUI dep bumps, staging cherry-picks, Asana updates |
| /develop-staging | Cut a staging release: bump the version, merge develop into staging, gate on develop/staging parity |
| /staging-cherry-pick | Cherry-pick landed staging-targeted commits onto staging |
| /cheese | Push a test-branch build, pinning unpublished dep PRs when required |
| /changelog | Update CHANGELOG entries using repo conventions |
| /dep-pr | Create dependent Asana tasks and downstream PR work in another repo |
| /tdd | Write or update a technical design document for shipped work |
| Skill | Description |
|---|---|
| /concession-validator | Judge whether delivering less than the prescribed bar is legitimate; deny-on-sight taxonomy |
| /blocker-validator | Judge whether a proposed block is a true blocker or a premature yield |
| /no-slop | The prose rules; its scripts are the shared lint + judge every boundary calls |
| Skill | Description |
|---|---|
| /eval-run | Orchestrate cohort evals (report-eval default, transcript-eval on escalation) with an operator Actions checklist |
| /agent-eval | Grade one run's process compliance and outcome honesty against the rubric |
| /orch-eval | Grade one run's infrastructure health |
| /resolve-run | Build the per-run evidence manifest evals consume |
| /chat-audit | Audit chat sessions for waste, drift, and workflow gaps |
| Skill | Description |
|---|---|
| /asana-task-update | Generic Asana mutations: attach PR, assign, status, fields |
| /asana-task-create | Create Edge dev tasks on the standard boards with the right fields |
| /kanban-categorize | Sweep a kanban board and populate Category fields |
| /convention-sync | Sync ~/.cursor/ + portable trees with this repo; mirror this README; update the PR description |
| /author | Create, revise, and debug skills, scripts, and rules |
| /agents-md | Write or revise a repo's AGENTS.md agent-context file |
| /q | Answer questions before taking action |
| /local-research | Multi-agent research over the local filesystem with citation-backed reports |
| /resume-session | Find and resume the right past claude session |
| /debugger | Inspect runtime state in a running React Native app |
| /fix-eslint | Apply documented fixes for recurring ESLint warnings |
| /coinhub | Maintain the Coinhub white-label build |
| /obsidian | Manage notes in the local Obsidian vault |
| /drunk-claude | Novelty persona skill |
The banana image-generation skill exists locally but is excluded from sync (third-party, local-only by request).
Scripts live beside the skill that owns them (<skill>/scripts/); shared scripts live at skills/ top level. The ones most worth knowing:
| Script | What it does |
|---|---|
| pr-create.sh | Create the PR: verify, template body, prose lint (with judge), evidence, Asana attach |
| pr-address.sh | Fetch unresolved feedback (with an obligation trailer so filtered JSON cannot hide review bodies), reply, resolve, mark addressed; outbound bodies linted |
| github-pr-review.sh | Fetch PR context and submit reviews; review bodies linted at submit |
| pr-finalize-fixups.sh | Finalize fixup commits before the ready flip |
| git-branch-ops.sh | Shared deterministic autosquash and push operations |
| Script | Phase |
|---|---|
| pr-land-discover.sh | Find relevant PRs and approval state |
| pr-land-comments.sh | Detect unresolved inline, review-body, and top-level comments |
| pr-land-prepare.sh | Autosquash, rebase, detect conflicts, verify |
| pr-land-merge.sh | Rebase again, verify, merge sequentially |
| pr-land-publish.sh | Version bump, changelog, commit, tag |
| upgrade-dep.sh | Bump one package on the current branch and commit lockfile updates |
| staging-cherry-pick.sh | Cherry-pick staging-qualified commits |
| staging-release-merge.sh | Bump, merge develop into staging in a throwaway worktree, gate parity, push |
| changelog-union-merge.sh | Mechanical CHANGELOG conflict resolution at land time, and whole-section merging for the develop-into-staging release merge (--release-merge) |
| verify-repo.sh | Run changelog and code verification |
| Script | What it does |
|---|---|
| lint-commit.sh | Lint-assisted commits; scrubs session trailers/URLs from messages |
| lint-warnings.sh | Auto-fix and summarize remaining TypeScript/ESLint warnings |
| no-slop-lint.sh | The shared prose lint: mechanical tier + --semantic judge + --fragment mode |
| no-slop-judge.sh | The haiku judge stage (cached, fail-open) |
| tdd-lint.sh | TDD form lint (calls the shared prose lint) |
| install-deps.sh | Install dependencies and run project prepare steps |
| rubric-drift.sh | Anchor tracking between eval rubrics and the rules/scripts they grade against |
| Script | What it does |
|---|---|
| asana-get-context.sh | Fetch task details, comments, subtasks, attachments |
| asana-task-update.sh | Reusable Asana mutations (the report-attach path is hook-gated) |
| asana-field-value.sh, asana-build-field.sh, asana-force-land.sh | Live single-field reads the finalize gate consumes |
| update-status.sh | The gated agent_status write every phase transition goes through |
| check-followup-scope.sh | The live followup-scope + watermark check backing the Complete gate |
| log-attempt.sh | Append truthful attempt-log entries |
| set-tested.sh | Set the task's tested field from run evidence |
| convention-sync.sh | Bidirectional sync with cross-machine safety blocks |
| generate-claude-md.sh | Regenerate ~/.claude/CLAUDE.md from always-apply rules |
| Rule | Purpose |
|---|---|
| act-autonomously.mdc | Run it and investigate yourself first; ask only what is genuinely undeterminable |
| answer-questions-first.mdc | Answer user questions before editing or mutating state |
| workflow-halt-on-error.mdc | Stop on skill-script failures; fix the workflow definition before workarounds; slash-command detection |
| writing-style.mdc | Prose destinations and enforcement: em-dash scoping, no-slop, Slack conventions, link discipline |
| diagram-escalation.mdc | One diagram when an explanation covers ordering, races, or state machines |
| load-standards-by-filetype.mdc | Load language standards before editing |
| no-format-lint.mdc | No manual formatting; the commit script owns it |
| typescript-standards.mdc | TypeScript and React editing standards |
| review-standards.mdc | Review-specific bug patterns and conventions |
| eslint-warnings.mdc | Documented fixes for recurring ESLint warnings |
| Back | FazBrowse Home | New Git URL |