Standard collaboration patterns for all squad agents — worktree awareness, decisions, cross-agent communication
日本語の概要は準備中です。原文の説明を表示しています。
Add temporary ID support to safe-output jobs end to end.
インストール方法を見るインストールする前に、エージェントに与えられる指示の中身を確認できます。
Use this implementation plan for temporary ID support in safe output jobs. Temporary IDs let agents reference newly created issues in the same run before real issue numbers exist.
When an agent creates a parent issue and immediately links sub-issues in the same run, it does not know the real issue number until create_issue completes. Temporary IDs bridge this gap with placeholders resolved at execution time.
Temporary IDs follow the pattern aw_[A-Za-z0-9]{3,8} where:
aw_ is a fixed prefix identifying agentic workflow temporary IDsXXXXXXXX is a 3-8 character alphanumeric string (A-Za-z0-9)Example: aw_abc, aw_abc123, aw_Test123
temporary_id.cjsLocation: actions/setup/js/temporary_id.cjs
This module provides shared utilities for temporary ID handling:
// Core functions
generateTemporaryId() // Generate new temporary ID
isTemporaryId(value) // Check if value is a temporary ID
normalizeTemporaryId(tempId) // Normalize to lowercase for map lookups
loadTemporaryIdMap() // Load map from GH_AW_TEMPORARY_ID_MAP env var
resolveIssueNumber(value, map) // Resolve value to issue number (supports temp IDs)
replaceTemporaryIdReferences(text, map) // Replace #aw_XXX references in text
create_issueThe create_issue job outputs a temporary ID map that other jobs can consume:
Go changes (pkg/workflow/create_issue.go):
temporary_id_mapJavaScript changes (actions/setup/js/create_issue.cjs):
temporary_id -> issue_numbercore.setOutput("temporary_id_map", JSON.stringify(map))For each safe output job that needs to resolve temporary IDs:
In pkg/workflow/<job_name>.go:
createIssueJobName parameter to the build function:func (c *Compiler) build<JobName>Job(data *WorkflowData, mainJobName string, createIssueJobName string) (*Job, error) {
if createIssueJobName != "" {
customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_TEMPORARY_ID_MAP: ${{ needs.%s.outputs.temporary_id_map }}\n", createIssueJobName))
}
create_issue to the job's needs array:needs := []string{mainJobName}
if createIssueJobName != "" {
needs = append(needs, createIssueJobName)
}
SafeOutputJobConfig to use the dynamic needs:return c.buildSafeOutputJob(data, SafeOutputJobConfig{
// ...
Needs: needs,
// ...
})
In pkg/workflow/compiler_jobs.go:
Pass the createIssueJobName when building the job:
job, err := c.build<JobName>Job(data, mainJobName, createIssueJobName)
In pkg/workflow/js/<job_name>.cjs:
const { loadTemporaryIdMap, resolveIssueNumber } = require("./temporary_id.cjs");
const temporaryIdMap = loadTemporaryIdMap();
if (temporaryIdMap.size > 0) {
core.info(`Loaded temporary ID map with ${temporaryIdMap.size} entries`);
}
resolveIssueNumber() to resolve issue numbers:const resolved = resolveIssueNumber(item.issue_number, temporaryIdMap);
if (resolved.errorMessage) {
core.warning(`Failed to resolve issue: ${resolved.errorMessage}`);
continue;
}
const issueNumber = resolved.resolved;
if (resolved.wasTemporaryId) {
core.info(`Resolved temporary ID '${item.issue_number}' to issue #${issueNumber}`);
}
In actions/setup/js/collect_ndjson_output.cjs:
Add validation for fields that accept temporary IDs:
function isValidIssueNumberOrTemporaryId(value) {
if (typeof value === "number" && Number.isInteger(value) && value > 0) {
return true;
}
if (typeof value === "string" && /^aw_[0-9a-f]{12}$/i.test(value)) {
return true;
}
return false;
}
Use this validation for fields like parent_issue_number, sub_issue_number, etc.
When temporary ID resolution fails, the job should:
core.warning() instead of failing with core.setFailed()This ensures that:
safe-outputs:
create-issue:
title-prefix: "[Parent] "
labels: [tracking]
max: 3
link-sub-issue:
max: 10
{"type": "create_issue", "temporary_id": "aw_abc123", "title": "Parent: Feature X", "body": "..."}
{"type": "link_sub_issue", "parent_issue_number": "aw_abc123", "sub_issue_number": 42}
{"type": "link_sub_issue", "parent_issue_number": "aw_abc123", "sub_issue_number": 43}
main job: Agent generates output with temporary ID aw_abc123create_issue job: Creates issue #100, outputs {"aw_abc123": 100}link_sub_issue job:
aw_abc123 → 100| Job | Field(s) | Status |
|---|---|---|
link_sub_issue | parent_issue_number, sub_issue_number | ✅ Implemented |
add_comment | issue_number (via text replacement) | ✅ Implemented |
update_issue | issue_number | 🔄 Can be added |
close_pull_request | - | N/A (uses PR numbers) |
Add tests in actions/setup/js/temporary_id.test.cjs for:
isTemporaryId() with valid and invalid inputsresolveIssueNumber() with temporary IDs and regular numbersloadTemporaryIdMap() with various JSON inputsAdd tests in pkg/workflow/<job_name>_dependencies_test.go to verify:
create_issue in needs when configuredGH_AW_TEMPORARY_ID_MAP env var is set correctlycreate_issue dependencycreateIssueJobName parameterGH_AW_TEMPORARY_ID_MAP environment variablecreate_issue conditionallycreateIssueJobNameresolveIssueNumber() for issue number fieldscollect_ndjson_output.cjs if neededまだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Standard collaboration patterns for all squad agents — worktree awareness, decisions, cross-agent communication
日本語の概要は準備中です。原文の説明を表示しています。
Shared hard rules enforced across all squad agents
日本語の概要は準備中です。原文の説明を表示しています。
Route gh-aw design, creation, diagnosis, patching, active debugging, and upgrade requests to the right strategies.
日本語の概要は準備中です。原文の説明を表示しています。
How to write comprehensive architectural proposals that drive alignment before code is written
日本語の概要は準備中です。原文の説明を表示しています。
Upgrade gh-aw to latest gh-aw-firewall release and identify follow-up spec tasks.
日本語の概要は準備中です。原文の説明を表示しています。
Review code that performs git or gh operations against repository checkouts in gh-aw, checking that the right credentials are available at the right time and that sparseness, shallowness and credential-free factors are properly considered.
日本語の概要は準備中です。原文の説明を表示しています。