Compare commits

..

No commits in common. "master" and "v0.2.67" have entirely different histories.

2 changed files with 23 additions and 17 deletions

View File

@ -2,20 +2,20 @@
All notable changes to TFTSR are documented here. All notable changes to TFTSR are documented here.
Commit types shown: feat, fix, perf, docs, refactor. Commit types shown: feat, fix, perf, docs, refactor.
CI, chore, and build changes are excluded. CI, chore, and build changes are excluded unless they affect developer workflow.
## [Unreleased] ## [0.2.66] — 2026-04-20
### Bug Fixes
- Harden timeline event input validation and atomic writes
### Documentation
- Update wiki for timeline events and incident response methodology
### Features ### Features
- Add timeline_events table, model, and CRUD commands - Integrate incident response methodology into all 17 domain prompts
- Populate RCA and postmortem docs with real timeline data - Add timeline_events table for UTC timestamp tracking during triage
- Wire incident response methodology into AI and record triage events - Populate RCA and postmortem documents with real timeline data
### Bug Fixes
- **ci**: Switch PR review from Ollama to liteLLM (qwen2.5-72b)
### Security
- Harden timeline event input validation and atomic writes
## [0.2.65] — 2026-04-15 ## [0.2.65] — 2026-04-15

View File

@ -42,8 +42,11 @@ describe("Audit Log", () => {
it("displays audit entries", async () => { it("displays audit entries", async () => {
render(<Security />); render(<Security />);
// Wait for table to appear after async audit data loads // Wait for audit log to load
const table = await screen.findByRole("table"); await screen.findByText("Audit Log");
// Check that the table has rows (header + data rows)
const table = screen.getByRole("table");
expect(table).toBeInTheDocument(); expect(table).toBeInTheDocument();
const rows = screen.getAllByRole("row"); const rows = screen.getAllByRole("row");
@ -53,7 +56,9 @@ describe("Audit Log", () => {
it("provides way to view transmitted data details", async () => { it("provides way to view transmitted data details", async () => {
render(<Security />); render(<Security />);
// Wait for async data to load and render the table await screen.findByText("Audit Log");
// Should have View/Hide buttons for expanding details
const viewButtons = await screen.findAllByRole("button", { name: /View/i }); const viewButtons = await screen.findAllByRole("button", { name: /View/i });
expect(viewButtons.length).toBeGreaterThan(0); expect(viewButtons.length).toBeGreaterThan(0);
}); });
@ -61,13 +66,14 @@ describe("Audit Log", () => {
it("details column or button exists for viewing data", async () => { it("details column or button exists for viewing data", async () => {
render(<Security />); render(<Security />);
// Wait for async data to load and render the table await screen.findByText("Audit Log");
await screen.findByRole("table");
// The audit log should have a Details column header
const detailsHeader = screen.getByText("Details"); const detailsHeader = screen.getByText("Details");
expect(detailsHeader).toBeInTheDocument(); expect(detailsHeader).toBeInTheDocument();
const viewButtons = screen.getAllByRole("button", { name: /View/i }); // Should have view buttons
const viewButtons = await screen.findAllByRole("button", { name: /View/i });
expect(viewButtons.length).toBe(2); // One for each mock entry expect(viewButtons.length).toBe(2); // One for each mock entry
}); });
}); });