feat(security): add GIT_AUTHOR_EMAIL per agent type
Some checks failed
CI / Check for .beads changes (pull_request) Successful in 6s
CI / Check embedded formulas (pull_request) Failing after 10s
CI / Test (pull_request) Failing after 1m18s
CI / Lint (pull_request) Failing after 14s
CI / Integration Tests (pull_request) Successful in 1m21s
Integration Tests / Integration Tests (pull_request) Successful in 1m20s
CI / Coverage Report (pull_request) Has been skipped
CI / Check for .beads changes (push) Has been skipped
CI / Check embedded formulas (push) Failing after 11s
CI / Test (push) Failing after 1m29s
CI / Lint (push) Failing after 15s
CI / Integration Tests (push) Successful in 1m19s
CI / Coverage Report (push) Has been skipped
Some checks failed
CI / Check for .beads changes (pull_request) Successful in 6s
CI / Check embedded formulas (pull_request) Failing after 10s
CI / Test (pull_request) Failing after 1m18s
CI / Lint (pull_request) Failing after 14s
CI / Integration Tests (pull_request) Successful in 1m21s
Integration Tests / Integration Tests (pull_request) Successful in 1m20s
CI / Coverage Report (pull_request) Has been skipped
CI / Check for .beads changes (push) Has been skipped
CI / Check embedded formulas (push) Failing after 11s
CI / Test (push) Failing after 1m29s
CI / Lint (push) Failing after 15s
CI / Integration Tests (push) Successful in 1m19s
CI / Coverage Report (push) Has been skipped
Phase 1 of agent security model: Set distinct email addresses for each
agent type to improve audit trail clarity.
Email format:
- Town-level: {role}@gastown.local (mayor, deacon, boot)
- Rig-level: {rig}-{role}@gastown.local (witness, refinery)
- Named agents: {rig}-{role}-{name}@gastown.local (polecat, crew)
This makes git log filtering by agent type trivial and provides a
foundation for per-agent key separation in future phases.
Refs: hq-biot
This commit was merged in pull request #3.
This commit is contained in:
@@ -49,36 +49,43 @@ func AgentEnv(cfg AgentEnvConfig) map[string]string {
|
|||||||
case "mayor":
|
case "mayor":
|
||||||
env["BD_ACTOR"] = "mayor"
|
env["BD_ACTOR"] = "mayor"
|
||||||
env["GIT_AUTHOR_NAME"] = "mayor"
|
env["GIT_AUTHOR_NAME"] = "mayor"
|
||||||
|
env["GIT_AUTHOR_EMAIL"] = "mayor@gastown.local"
|
||||||
|
|
||||||
case "deacon":
|
case "deacon":
|
||||||
env["BD_ACTOR"] = "deacon"
|
env["BD_ACTOR"] = "deacon"
|
||||||
env["GIT_AUTHOR_NAME"] = "deacon"
|
env["GIT_AUTHOR_NAME"] = "deacon"
|
||||||
|
env["GIT_AUTHOR_EMAIL"] = "deacon@gastown.local"
|
||||||
|
|
||||||
case "boot":
|
case "boot":
|
||||||
env["BD_ACTOR"] = "deacon-boot"
|
env["BD_ACTOR"] = "deacon-boot"
|
||||||
env["GIT_AUTHOR_NAME"] = "boot"
|
env["GIT_AUTHOR_NAME"] = "boot"
|
||||||
|
env["GIT_AUTHOR_EMAIL"] = "boot@gastown.local"
|
||||||
|
|
||||||
case "witness":
|
case "witness":
|
||||||
env["GT_RIG"] = cfg.Rig
|
env["GT_RIG"] = cfg.Rig
|
||||||
env["BD_ACTOR"] = fmt.Sprintf("%s/witness", cfg.Rig)
|
env["BD_ACTOR"] = fmt.Sprintf("%s/witness", cfg.Rig)
|
||||||
env["GIT_AUTHOR_NAME"] = fmt.Sprintf("%s/witness", cfg.Rig)
|
env["GIT_AUTHOR_NAME"] = fmt.Sprintf("%s/witness", cfg.Rig)
|
||||||
|
env["GIT_AUTHOR_EMAIL"] = fmt.Sprintf("%s-witness@gastown.local", cfg.Rig)
|
||||||
|
|
||||||
case "refinery":
|
case "refinery":
|
||||||
env["GT_RIG"] = cfg.Rig
|
env["GT_RIG"] = cfg.Rig
|
||||||
env["BD_ACTOR"] = fmt.Sprintf("%s/refinery", cfg.Rig)
|
env["BD_ACTOR"] = fmt.Sprintf("%s/refinery", cfg.Rig)
|
||||||
env["GIT_AUTHOR_NAME"] = fmt.Sprintf("%s/refinery", cfg.Rig)
|
env["GIT_AUTHOR_NAME"] = fmt.Sprintf("%s/refinery", cfg.Rig)
|
||||||
|
env["GIT_AUTHOR_EMAIL"] = fmt.Sprintf("%s-refinery@gastown.local", cfg.Rig)
|
||||||
|
|
||||||
case "polecat":
|
case "polecat":
|
||||||
env["GT_RIG"] = cfg.Rig
|
env["GT_RIG"] = cfg.Rig
|
||||||
env["GT_POLECAT"] = cfg.AgentName
|
env["GT_POLECAT"] = cfg.AgentName
|
||||||
env["BD_ACTOR"] = fmt.Sprintf("%s/polecats/%s", cfg.Rig, cfg.AgentName)
|
env["BD_ACTOR"] = fmt.Sprintf("%s/polecats/%s", cfg.Rig, cfg.AgentName)
|
||||||
env["GIT_AUTHOR_NAME"] = cfg.AgentName
|
env["GIT_AUTHOR_NAME"] = cfg.AgentName
|
||||||
|
env["GIT_AUTHOR_EMAIL"] = fmt.Sprintf("%s-polecat-%s@gastown.local", cfg.Rig, cfg.AgentName)
|
||||||
|
|
||||||
case "crew":
|
case "crew":
|
||||||
env["GT_RIG"] = cfg.Rig
|
env["GT_RIG"] = cfg.Rig
|
||||||
env["GT_CREW"] = cfg.AgentName
|
env["GT_CREW"] = cfg.AgentName
|
||||||
env["BD_ACTOR"] = fmt.Sprintf("%s/crew/%s", cfg.Rig, cfg.AgentName)
|
env["BD_ACTOR"] = fmt.Sprintf("%s/crew/%s", cfg.Rig, cfg.AgentName)
|
||||||
env["GIT_AUTHOR_NAME"] = cfg.AgentName
|
env["GIT_AUTHOR_NAME"] = cfg.AgentName
|
||||||
|
env["GIT_AUTHOR_EMAIL"] = fmt.Sprintf("%s-crew-%s@gastown.local", cfg.Rig, cfg.AgentName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only set GT_ROOT if provided
|
// Only set GT_ROOT if provided
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ func TestAgentEnv_Mayor(t *testing.T) {
|
|||||||
assertEnv(t, env, "GT_ROLE", "mayor")
|
assertEnv(t, env, "GT_ROLE", "mayor")
|
||||||
assertEnv(t, env, "BD_ACTOR", "mayor")
|
assertEnv(t, env, "BD_ACTOR", "mayor")
|
||||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "mayor")
|
assertEnv(t, env, "GIT_AUTHOR_NAME", "mayor")
|
||||||
|
assertEnv(t, env, "GIT_AUTHOR_EMAIL", "mayor@gastown.local")
|
||||||
assertEnv(t, env, "GT_ROOT", "/town")
|
assertEnv(t, env, "GT_ROOT", "/town")
|
||||||
assertNotSet(t, env, "GT_RIG")
|
assertNotSet(t, env, "GT_RIG")
|
||||||
assertNotSet(t, env, "BEADS_NO_DAEMON")
|
assertNotSet(t, env, "BEADS_NO_DAEMON")
|
||||||
@@ -31,6 +32,7 @@ func TestAgentEnv_Witness(t *testing.T) {
|
|||||||
assertEnv(t, env, "GT_RIG", "myrig")
|
assertEnv(t, env, "GT_RIG", "myrig")
|
||||||
assertEnv(t, env, "BD_ACTOR", "myrig/witness")
|
assertEnv(t, env, "BD_ACTOR", "myrig/witness")
|
||||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "myrig/witness")
|
assertEnv(t, env, "GIT_AUTHOR_NAME", "myrig/witness")
|
||||||
|
assertEnv(t, env, "GIT_AUTHOR_EMAIL", "myrig-witness@gastown.local")
|
||||||
assertEnv(t, env, "GT_ROOT", "/town")
|
assertEnv(t, env, "GT_ROOT", "/town")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,6 +51,7 @@ func TestAgentEnv_Polecat(t *testing.T) {
|
|||||||
assertEnv(t, env, "GT_POLECAT", "Toast")
|
assertEnv(t, env, "GT_POLECAT", "Toast")
|
||||||
assertEnv(t, env, "BD_ACTOR", "myrig/polecats/Toast")
|
assertEnv(t, env, "BD_ACTOR", "myrig/polecats/Toast")
|
||||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "Toast")
|
assertEnv(t, env, "GIT_AUTHOR_NAME", "Toast")
|
||||||
|
assertEnv(t, env, "GIT_AUTHOR_EMAIL", "myrig-polecat-Toast@gastown.local")
|
||||||
assertEnv(t, env, "BEADS_AGENT_NAME", "myrig/Toast")
|
assertEnv(t, env, "BEADS_AGENT_NAME", "myrig/Toast")
|
||||||
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
||||||
}
|
}
|
||||||
@@ -68,6 +71,7 @@ func TestAgentEnv_Crew(t *testing.T) {
|
|||||||
assertEnv(t, env, "GT_CREW", "emma")
|
assertEnv(t, env, "GT_CREW", "emma")
|
||||||
assertEnv(t, env, "BD_ACTOR", "myrig/crew/emma")
|
assertEnv(t, env, "BD_ACTOR", "myrig/crew/emma")
|
||||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "emma")
|
assertEnv(t, env, "GIT_AUTHOR_NAME", "emma")
|
||||||
|
assertEnv(t, env, "GIT_AUTHOR_EMAIL", "myrig-crew-emma@gastown.local")
|
||||||
assertEnv(t, env, "BEADS_AGENT_NAME", "myrig/emma")
|
assertEnv(t, env, "BEADS_AGENT_NAME", "myrig/emma")
|
||||||
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
||||||
}
|
}
|
||||||
@@ -85,6 +89,7 @@ func TestAgentEnv_Refinery(t *testing.T) {
|
|||||||
assertEnv(t, env, "GT_RIG", "myrig")
|
assertEnv(t, env, "GT_RIG", "myrig")
|
||||||
assertEnv(t, env, "BD_ACTOR", "myrig/refinery")
|
assertEnv(t, env, "BD_ACTOR", "myrig/refinery")
|
||||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "myrig/refinery")
|
assertEnv(t, env, "GIT_AUTHOR_NAME", "myrig/refinery")
|
||||||
|
assertEnv(t, env, "GIT_AUTHOR_EMAIL", "myrig-refinery@gastown.local")
|
||||||
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +103,7 @@ func TestAgentEnv_Deacon(t *testing.T) {
|
|||||||
assertEnv(t, env, "GT_ROLE", "deacon")
|
assertEnv(t, env, "GT_ROLE", "deacon")
|
||||||
assertEnv(t, env, "BD_ACTOR", "deacon")
|
assertEnv(t, env, "BD_ACTOR", "deacon")
|
||||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "deacon")
|
assertEnv(t, env, "GIT_AUTHOR_NAME", "deacon")
|
||||||
|
assertEnv(t, env, "GIT_AUTHOR_EMAIL", "deacon@gastown.local")
|
||||||
assertEnv(t, env, "GT_ROOT", "/town")
|
assertEnv(t, env, "GT_ROOT", "/town")
|
||||||
assertNotSet(t, env, "GT_RIG")
|
assertNotSet(t, env, "GT_RIG")
|
||||||
assertNotSet(t, env, "BEADS_NO_DAEMON")
|
assertNotSet(t, env, "BEADS_NO_DAEMON")
|
||||||
@@ -113,6 +119,7 @@ func TestAgentEnv_Boot(t *testing.T) {
|
|||||||
assertEnv(t, env, "GT_ROLE", "boot")
|
assertEnv(t, env, "GT_ROLE", "boot")
|
||||||
assertEnv(t, env, "BD_ACTOR", "deacon-boot")
|
assertEnv(t, env, "BD_ACTOR", "deacon-boot")
|
||||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "boot")
|
assertEnv(t, env, "GIT_AUTHOR_NAME", "boot")
|
||||||
|
assertEnv(t, env, "GIT_AUTHOR_EMAIL", "boot@gastown.local")
|
||||||
assertEnv(t, env, "GT_ROOT", "/town")
|
assertEnv(t, env, "GT_ROOT", "/town")
|
||||||
assertNotSet(t, env, "GT_RIG")
|
assertNotSet(t, env, "GT_RIG")
|
||||||
assertNotSet(t, env, "BEADS_NO_DAEMON")
|
assertNotSet(t, env, "BEADS_NO_DAEMON")
|
||||||
|
|||||||
Reference in New Issue
Block a user