Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
docs(skills): correct six false mechanism claims in the published pm-dispatch template by huangyiirene · Pull Request #13891 · objectstack-ai/objectstack · GitHub
Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(skills): correct six false mechanism claims in the published pm-dispatch template by huangyiirene · Pull Request #13891 · objectstack-ai/objectstack · GitHub
Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(skills): correct six false mechanism claims in the published pm-dispatch template by huangyiirene · Pull Request #13891 · objectstack-ai/objectstack · GitHub
Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' docs(skills): correct six false mechanism claims in the published pm-dispatch template by huangyiirene · Pull Request #13891 · objectstack-ai/objectstack · GitHub
Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(skills): correct six false mechanism claims in the published pm-dispatch template by huangyiirene · Pull Request #13891 · objectstack-ai/objectstack · GitHub
Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(skills): correct six false mechanism claims in the published pm-dispatch template by huangyiirene · Pull Request #13891 · objectstack-ai/objectstack · GitHub
Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); docs(skills): correct six false mechanism claims in the published pm-dispatch template by huangyiirene · Pull Request #13891 · objectstack-ai/objectstack · GitHub
Skip to content
Merged
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
25 changes: 12 additions & 13 deletions skills/objectstack-pm-dispatch/SKILL.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,7 +143,7 @@ write state only through these signals:
| label `pm:dispatched` | dispatched by this loop (the claim comment records the round) |
| label `needs-user-decision` | waiting on the maintainer — **never dispatch**, never auto-answer |
| open PR referencing the issue | implemented, in review |
| merged PR with `Fixes #n` | done (GitHub closes the issue) |
| merged PR with `Fixes #n` | done GitHub closes it, same repo only |

**One-time label setup** (idempotent — run at the start of the first round for
every entry in `repos`):
Expand DownExpand Up@@ -406,8 +406,7 @@ Non-negotiables for this dispatch:
in a DEDICATED worktree of that repository.
- {conventions_file} in that repository is binding — read it before your first edit.
- The issue is already claimed; do not touch its assignee.
- Deliver a DRAFT PR in {target_repo} whose body starts with
"Fixes {backlog_repo}#{n}". Never merge anything.
- Deliver a DRAFT PR in {target_repo}. Never merge anything.
- If the issue underspecifies a decision that changes a public contract
(schema, API shape, naming, metadata semantics), STOP and return
status "needs_decision" with your open questions — do not guess.
Expand DownExpand Up@@ -466,8 +465,8 @@ that is absent, say so and fall back to `mode:subagent`.
An independent session cannot return a message to the PM, so the dispatch
prompt must be **fully standalone** (it starts with zero conversation context)
and must instruct the agent to **post the JSON report as a comment on the
issue**, prefixed with a machine-findable marker such as
`<!-- dev-report -->`, in addition to opening the draft PR.
issue**, prefixed with a machine-findable PLAIN-TEXT marker such as
`dev-report`, in addition to opening the draft PR.

### 6. Collect

Expand DownExpand Up@@ -521,7 +520,7 @@ PR, over a handful of comparable cards — and treat it as local. Two same-day
samples from this repo's loop show why no single number can be inherited: four
text-only documentation cards landed at 93 / 96 / ~95 / ~110 min, while four
mixed cards from the same day spanned ~64 min to ~2 h 50 min (the two long ones
waiting on CI). Nine cards, one day, one toolchain, a spread from about an hour
waiting on CI). Eight cards, one day, one toolchain, a spread from about an hour
to nearly three. **Silence inside the baseline is not evidence**, and a check-in
threshold having passed twice is evidence only that time passed. This is the
same failure as inferring an abort from symptoms: until you know the baseline,
Expand DownExpand Up@@ -738,7 +737,7 @@ first edit. It overrides this template wherever they disagree. The rules that
most often get missed:

1. Worktree-first. Before any edit:
git worktree add ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
git worktree add --no-track ../<repo>-issue-<n> -b claude/issue-<n>-<slug> origin/{default_branch}
then cd there and install dependencies. Never edit a shared checkout —
other agents switch its HEAD under you. One worktree PER REPOSITORY if the
change spans siblings.
Expand DownExpand Up@@ -800,8 +799,8 @@ Definition of done, in order:
user-visible change (e.g. a changeset entry).
- Pushed: git push -u origin claude/issue-<n>-<slug> (retry on network failure
with backoff).
- A DRAFT PR to the default branch, body starting "Fixes {backlog_repo}#<n>",
written in the language the repository's PRs use.
- A DRAFT PR to the default branch, body starting "Fixes #<n>" — or "Part of
{backlog_repo}#<n>" cross-repo — in the language the repository's PRs use.
- Tear down anything you started (dev servers, temporary processes) by PID.

Rejection-class tests assert the envelope, not the throw. For any test whose
Expand DownExpand Up@@ -873,9 +872,9 @@ Final message — exactly this JSON, no prose around it:
Use "rework" for a partial result you know is incomplete (say why in summary).

Practical trap when filing issues or PRs through the GitHub API: the body
sanitizer strips "<" followed by a letter as an HTML tag AT REST, which
destroys TypeScript generics. Write a space after each "<" and read the stored
body back to verify when a snippet is load-bearing.
sanitizer deletes tag-shaped spans AT REST — "<" plus a letter (killing
TypeScript generics) and HTML comments alike. Write a space after each "<"
and read the stored body back when a snippet is load-bearing.
````

---
Expand DownExpand Up@@ -1068,7 +1067,7 @@ them into every dispatch:
| Test / typecheck / lint commands per package | conventions file |
| How the shared heavy-verify lock is taken (wrapper, lock path, acquisition budget) | conventions file |
| Merge policy (merge queue, serial merge, maintainer-only) | conventions file |
| Capability-expansion stance the business-need axis reads (tight by default, or permissive) | conventions file |
| Capability-expansion stance axis reads (tight by default, or permissive) | conventions file |
| Which repositories exist and which is the backlog | `.claude/pm-dispatch.json` |
| Recorded architecture decisions the escalation bar defers to | the project's ADR directory |

Expand Down
Loading