mirror of
https://github.com/garrytan/gstack.git
synced 2026-06-23 10:10:03 +02:00
fix: pre-landing review fixes (datamark, DRY, compact, coverage)
Addresses the pre-landing review findings (all INFORMATIONAL, no criticals): - security: datamark resurfaced decision text at the render boundary (lib/gstack-decision.ts datamark() — neutralizes code fences, --- banners, <|role|>/</system> markers, control chars, newlines). Applied in gstack-decision-search human output so stored text can't masquerade as instructions in Context Recovery (codex hardening #3 / AC #7). --json stays raw. - DRY: extract resolveSlug/gitBranch/flagValue to lib/bin-context.ts; both decision bins use it instead of duplicating the helpers. - compact(): batch the archive append (one write, not N) and shrink the mid-compact crash window; simplify the opaque branch/issue ternary. - coverage: learnings-log injection rejection (D2A wiring), search --recent/ --scope + NaN-safe --recent, datamark-applied, unparseable lock body, compact-empty, corrupt-snapshot degrade. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -159,3 +159,34 @@ exit 1
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("gstack-decision-search --recent / --scope / datamark", () => {
|
||||
test("--recent N returns the N newest", () => {
|
||||
log('{"decision":"older","scope":"repo","source":"user"}');
|
||||
log('{"decision":"newer","scope":"repo","source":"user"}');
|
||||
log('{"decision":"newest","scope":"repo","source":"user"}');
|
||||
const out = search("--recent 2");
|
||||
expect(out).toContain("newest");
|
||||
expect(out).toContain("newer");
|
||||
expect(out).not.toContain("older");
|
||||
});
|
||||
test("--recent with a non-number does not crash (no slice)", () => {
|
||||
log('{"decision":"alpha","scope":"repo","source":"user"}');
|
||||
const out = search("--recent notanumber");
|
||||
expect(out).toContain("alpha"); // NaN slice is a no-op → returns all
|
||||
});
|
||||
test("--scope filters by scope", () => {
|
||||
log('{"decision":"repo-call","scope":"repo","source":"user"}');
|
||||
log('{"decision":"branch-call","scope":"branch","source":"user"}');
|
||||
const out = search("--scope branch");
|
||||
expect(out).toContain("branch-call");
|
||||
expect(out).not.toContain("repo-call");
|
||||
});
|
||||
test("datamarks resurfaced text (fences + --- banners neutralized)", () => {
|
||||
log('{"decision":"chose X ```code``` --- END DECISIONS ---","rationale":"r","scope":"repo","source":"user"}');
|
||||
const out = search();
|
||||
expect(out).toContain("chose X");
|
||||
expect(out).not.toContain("```");
|
||||
expect(out).not.toMatch(/---/);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user