Problem class: nodejs-gitignored-build-artifact-mirror
Written to ~/solution-nodejs-gitignored-build-artifact-mirror.md. Here is the solution:
nodejs-gitignored-build-artifact-mirrorProblem class: nodejs-gitignored-build-artifact-mirror
Symptom: A worker brief instructs the agent to stage a second copy of a source file into a build output directory (here cli/app/custom-server.js). The brief claims a 4-file commit. In reality the path is gitignored and untracked, so it can never be staged without git add -f, and forcing it would commit generated build output.
The brief was written from a filesystem listing rather than from Git's index, and it mistook a build artifact for a tracked source file.
cli/.gitignore line 1 is app/* — everything under cli/app/ is ignored.cli/app/custom-server.js is produced by cli/scripts/build-cli.js, which copies it verbatim out of Next.js standalone output (.next/standalone/.../custom-server.js).Two failure modes follow:
| Attempt | Result |
|---|---|
git add cli/app/custom-server.js |
No-op; Git refuses ignored paths (looks like a missing edit, yields a 3-file commit). |
git add -f cli/app/custom-server.js |
Commits generated output the next build overwrites → history churn/drift. |
Correct handling: edit the artifact on disk for build/runtime consistency, but never stage it.
# Tracked? (non-empty = tracked; empty + exit 1 = untracked)
git ls-files -- cli/app/custom-server.js
# Ignored? (prints the matching rule)
git check-ignore -v -- cli/app/custom-server.js
# expected: cli/.gitignore:1:app/* cli/app/custom-server.js
Reusable guard:
classify_path() {
local p="$1"
if git ls-files --error-unmatch -- "$p" >/dev/null 2>&1; then echo "tracked"
elif git check-ignore -q -- "$p"; then echo "ignored"
else echo "untracked"
fi
}
classify_path cli/app/custom-server.js # -> ignored
| Classification | Action |
|---|---|
tracked |
Stage the edit normally. |
ignored |
Edit on disk if needed; never git add; expect absence from --cached. |
untracked (not ignored) |
New source file: stage deliberately. |
Any brief whose file count includes an ignored path is off by one.
git ls-files -- '*custom-server.js' # cli/app/custom-server.js will NOT appear
git add <source-1> <source-2> <source-3>
Prefer regeneration:
node cli/scripts/build-cli.js
# or: npm run build --workspace cli
Never:
git add -f cli/app/custom-server.js # NEVER
git update-index --add --force ... # NEVER
# removing 'app/*' from cli/.gitignore # NEVER
git status --short
git diff --cached --name-only # expected: 3 paths
git commit -m "fix: <change> (source only; cli/app is generated)"
#!/usr/bin/env bash
# scripts/lint-brief-paths.sh <path>...
set -euo pipefail
status=0
for p in "$@"; do
if git check-ignore -q -- "$p"; then
echo "BRIEF ERROR: '$p' is gitignored build output and must not be staged." >&2
git check-ignore -v -- "$p" >&2
status=1
fi
done
exit "$status"
# 1. Still ignored, with rule:
git check-ignore -v -- cli/app/custom-server.js
# expect: cli/.gitignore:1:app/* cli/app/custom-server.js
# 2. Not tracked (empty output, non-zero exit):
git ls-files --error-unmatch -- cli/app/custom-server.js; echo "exit=$?"
# expect: exit=1
# 3. Exactly 3 staged paths, none is the artifact:
git diff --cached --name-only
# 4. Artifact absent from the index:
git ls-files -- cli/app/custom-server.js
# expect: <no output>
# 5. Mirrored edit is consistent with regenerated output:
node cli/scripts/build-cli.js
git diff --no-index -- cli/app/custom-server.js .next/standalone/custom-server.js; echo "exit=$?"
# expect: exit=0 (or documented intentional diff)
# 6. Working tree clean of unintended changes:
git status --short
A clean run proves the artifact is ignored, untracked, unstaged, and still consistent with its source — i.e. the correct 3-file commit.
A path that
git check-ignoreflags is generated, not authored. Edit it on disk if the build needs it, but never stage it — and treat any brief whose file count includes it as off by one.
# Evidence - Problem class: nodejs-gitignored-build-artifact-mirror - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-11T17:25:52.677Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "9router worker brief asked to stage cli/app/custom-server.js as a second copy of custom-server.js. Resolution: cli/app/custom-server.js is GITIGNORED (cli/.gitignore line 1 = app/*) and untracked - it is a build artifact copied verbatim from .next/standalone by cli/scripts/build-cli.js. Correct handling: apply the equivalent edit on disk for consistency, do NOT git add -f build output, and expect a 3-file commit instead of the briefed 4. Detect before writing a brief: git ls-files <path> (empty = untracked) + git check-ignore -v <path>.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "nodejs-gitignored-build-artifact-mirror", "provider": "openrouter", "solved_at": "2026-09-11T17:25:52.678Z", "version": ""}Written to ~/solution-nodejs-gitignored-build-artifact-mirror.md. Here is the solution:
nodejs-gitignored-build-artifact-mirrorProblem class: nodejs-gitignored-build-artifact-mirror
Symptom: A worker brief instructs the agent to stage a second copy of a source file into a build output directory (here cli/app/custom-server.js). The brief claims a 4-file commit. In reality the path is gitignored and untracked, so it can never be staged without git add -f, and forcing it would commit generated build output.
The brief was written from a filesystem listing rather than from Git's index, and it mistook a build artifact for a tracked source file.
cli/.gitignore line 1 is app/* — everything under cli/app/ is ignored.cli/app/custom-server.js is produced by cli/scripts/build-cli.js, which copies it verbatim out of Next.js standalone output (.next/standalone/.../custom-server.js).Two failure modes follow:
| Attempt | Result |
|---|---|
git add cli/app/custom-server.js |
No-op; Git refuses ignored paths (looks like a missing edit, yields a 3-file commit). |
git add -f cli/app/custom-server.js |
Commits generated output the next build overwrites → history churn/drift. |
Correct handling: edit the artifact on disk for build/runtime consistency, but never stage it.
# Tracked? (non-empty = tracked; empty + exit 1 = untracked)
git ls-files -- cli/app/custom-server.js
# Ignored? (prints the matching rule)
git check-ignore -v -- cli/app/custom-server.js
# expected: cli/.gitignore:1:app/* cli/app/custom-server.js
Reusable guard:
classify_path() {
local p="$1"
if git ls-files --error-unmatch -- "$p" >/dev/null 2>&1; then echo "tracked"
elif git check-ignore -q -- "$p"; then echo "ignored"
else echo "untracked"
fi
}
classify_path cli/app/custom-server.js # -> ignored
| Classification | Action |
|---|---|
tracked |
Stage the edit normally. |
ignored |
Edit on disk if needed; never git add; expect absence from --cached. |
untracked (not ignored) |
New source file: stage deliberately. |
Any brief whose file count includes an ignored path is off by one.
git ls-files -- '*custom-server.js' # cli/app/custom-server.js will NOT appear
git add <source-1> <source-2> <source-3>
Prefer regeneration:
node cli/scripts/build-cli.js
# or: npm run build --workspace cli
Never:
git add -f cli/app/custom-server.js # NEVER
git update-index --add --force ... # NEVER
# removing 'app/*' from cli/.gitignore # NEVER
git status --short
git diff --cached --name-only # expected: 3 paths
git commit -m "fix: <change> (source only; cli/app is generated)"
#!/usr/bin/env bash
# scripts/lint-brief-paths.sh <path>...
set -euo pipefail
status=0
for p in "$@"; do
if git check-ignore -q -- "$p"; then
echo "BRIEF ERROR: '$p' is gitignored build output and must not be staged." >&2
git check-ignore -v -- "$p" >&2
status=1
fi
done
exit "$status"
# 1. Still ignored, with rule:
git check-ignore -v -- cli/app/custom-server.js
# expect: cli/.gitignore:1:app/* cli/app/custom-server.js
# 2. Not tracked (empty output, non-zero exit):
git ls-files --error-unmatch -- cli/app/custom-server.js; echo "exit=$?"
# expect: exit=1
# 3. Exactly 3 staged paths, none is the artifact:
git diff --cached --name-only
# 4. Artifact absent from the index:
git ls-files -- cli/app/custom-server.js
# expect: <no output>
# 5. Mirrored edit is consistent with regenerated output:
node cli/scripts/build-cli.js
git diff --no-index -- cli/app/custom-server.js .next/standalone/custom-server.js; echo "exit=$?"
# expect: exit=0 (or documented intentional diff)
# 6. Working tree clean of unintended changes:
git status --short
A clean run proves the artifact is ignored, untracked, unstaged, and still consistent with its source — i.e. the correct 3-file commit.
A path that
git check-ignoreflags is generated, not authored. Edit it on disk if the build needs it, but never stage it — and treat any brief whose file count includes it as off by one.
# Evidence - Problem class: nodejs-gitignored-build-artifact-mirror - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-11T17:25:52.677Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "9router worker brief asked to stage cli/app/custom-server.js as a second copy of custom-server.js. Resolution: cli/app/custom-server.js is GITIGNORED (cli/.gitignore line 1 = app/*) and untracked - it is a build artifact copied verbatim from .next/standalone by cli/scripts/build-cli.js. Correct handling: apply the equivalent edit on disk for consistency, do NOT git add -f build output, and expect a 3-file commit instead of the briefed 4. Detect before writing a brief: git ls-files <path> (empty = untracked) + git check-ignore -v <path>.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "nodejs-gitignored-build-artifact-mirror", "provider": "openrouter", "solved_at": "2026-09-11T17:25:52.678Z", "version": ""}