From 659c721cac6c72337dfefe74e109152b9386147a Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:20:08 +0530
Subject: [PATCH 01/12] fix: connect launch check submit handler
---
js/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 5dc8d87..ccb58a5 100644
--- a/js/app.js
+++ b/js/app.js
@@ -91,7 +91,7 @@ const activityLog = document.getElementById("activityLog");
let checks = loadChecks();
let currentView = checks;
-form.addEventListener("submit", (event) => handleAddChek(event)); // Intentional bug: misspelled function name.
+form.addEventListener("submit", (event) => handleAddCheck(event)); // Intentional bug: misspelled function name.
searchInput.addEventListener("input", applyFilters);
statusFilter.addEventListener("change", applyFilters);
priorityFilter.addEventListener("change", applyFilters);
From cb5e55603d5f615f0a15fae86d9f1b8dc1d195d1 Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:20:24 +0530
Subject: [PATCH 02/12] fix: require title and category before adding checks
---
js/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index ccb58a5..991345e 100644
--- a/js/app.js
+++ b/js/app.js
@@ -132,7 +132,7 @@ function handleAddCheck(event) {
const owner = ownerInput.value.trim() || "Unassigned";
const dueDate = dueDateInput.value || new Date().toISOString().slice(0, 10);
- if (!title && !category) {
+ if (!title || !category) {
// Intentional bug: validation should stop when either required field is missing.
formMessage.textContent =
"Please enter a check title and choose a category.";
From 89a624bd6a7c13f40c8f85ecf19194b6f7f805c5 Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:20:41 +0530
Subject: [PATCH 03/12] fix: search across launch check fields
---
js/app.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 991345e..529ba3d 100644
--- a/js/app.js
+++ b/js/app.js
@@ -164,7 +164,11 @@ function applyFilters() {
const selectedPriority = priorityFilter.value;
let filtered = checks.filter((check) =>
- check.owner.toLowerCase().includes(searchTerm),
+ check.title.toLowerCase().includes(searchTerm) ||
+ check.category.toLowerCase().includes(searchTerm) ||
+ check.priority.toLowerCase().includes(searchTerm) ||
+ check.status.toLowerCase().includes(searchTerm) ||
+ check.owner.toLowerCase().includes(searchTerm)
); // Intentional bug: search should include title, category, priority, status, and owner.
if (selectedStatus !== "All") {
From a6b39a1d70125450bfc3a29d10b05a12b8d7f2cd Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:21:00 +0530
Subject: [PATCH 04/12] fix: filter checklist by status
---
js/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 529ba3d..46cb80e 100644
--- a/js/app.js
+++ b/js/app.js
@@ -172,7 +172,7 @@ function applyFilters() {
); // Intentional bug: search should include title, category, priority, status, and owner.
if (selectedStatus !== "All") {
- filtered = filtered.filter((check) => check.priority === selectedStatus);
+ filtered = filtered.filter((check) => check.status === selectedStatus);
} // Intentional bug: status filter compares against priority.
if (selectedPriority !== "All") {
From 8deb9b02ae86f91b29fb8de04ef6d88166795b65 Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:21:30 +0530
Subject: [PATCH 05/12] fix: slug status badge class names
---
js/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 46cb80e..3a56801 100644
--- a/js/app.js
+++ b/js/app.js
@@ -195,7 +195,7 @@ function renderRows(list) {
const rows = list.map((check) => {
const priorityClass = `priority-${check.priority.toLowerCase()}`;
- const statusClass = `status-${check.status.toLowerCase()}`; // Intentional bug: "In Progress" needs a slug class.
+ const statusClass = `status-${check.status.toLowerCase().replaceAll(" ", "-")}`; // Intentional bug: "In Progress" needs a slug class.
return `
From 343074c50b8661dd9d1aa0b09546e23bd7399cc3 Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:21:49 +0530
Subject: [PATCH 06/12] fix: calculate readiness from fixed checks
---
js/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 3a56801..c818261 100644
--- a/js/app.js
+++ b/js/app.js
@@ -235,7 +235,7 @@ function renderRows(list) {
function updateMetrics() {
const total = checks.length;
- const fixed = checks.filter((check) => check.status === "Complete").length; // Intentional bug: valid fixed status is "Fixed".
+ const fixed = checks.filter((check) => check.status === "Fixed").length; // Intentional bug: valid fixed status is "Fixed".
const criticalOpen = checks.filter(
(check) => check.priority === "Critical" && check.status !== "Fixed",
).length;
From 453e8960c51f7163fce01ee601f8ee03932a071e Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:22:07 +0530
Subject: [PATCH 07/12] fix: count checks due within seven days
---
js/app.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index c818261..f63d296 100644
--- a/js/app.js
+++ b/js/app.js
@@ -239,7 +239,10 @@ function updateMetrics() {
const criticalOpen = checks.filter(
(check) => check.priority === "Critical" && check.status !== "Fixed",
).length;
- const dueSoon = checks.filter((check) => daysUntil(check.dueDate) > 7).length; // Intentional bug: this should count items due within 7 days.
+ const dueSoon = checks.filter((check) => {
+ const days = daysUntil(check.dueDate);
+ return days >= 0 && days <= 7;
+ }).length; // Intentional bug: this should count items due within 7 days.
const score = total === 0 ? 0 : Math.round((fixed / total) * 100);
totalCount.textContent = total;
From 0dd2b4e80f2858f56ddcd72a3f655f03bf5614af Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:22:23 +0530
Subject: [PATCH 08/12] fix: wire delete action to row button
---
js/app.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/js/app.js b/js/app.js
index f63d296..307fc06 100644
--- a/js/app.js
+++ b/js/app.js
@@ -254,13 +254,13 @@ function updateMetrics() {
}
function handleTableClick(event) {
- const deleteButton = event.target.closest("[data-delete-id]"); // Intentional bug: button uses data-remove-id.
+ const deleteButton = event.target.closest("[data-remove-id]"); // Intentional bug: button uses data-remove-id.
if (!deleteButton) {
return;
}
- const id = Number(deleteButton.dataset.deleteId);
+ const id = Number(deleteButton.dataset.removeId);
const removed = checks.find((check) => check.id === id);
checks = checks.filter((check) => check.id !== id);
saveChecks();
From efdef8b3f866426d0384053ba5e6003c173aa479 Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:22:42 +0530
Subject: [PATCH 09/12] fix: persist status changes and refresh metrics
---
js/app.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 307fc06..3a42018 100644
--- a/js/app.js
+++ b/js/app.js
@@ -283,7 +283,8 @@ function handleStatusChange(event) {
}
check.status = statusSelect.value;
- renderRows(currentView);
+ saveChecks();
+ applyFilters();
logActivity(`Changed "${check.title}" to ${check.status}.`);
// Intentional bug: status changes should save, update filters, and refresh metrics.
}
From 6d65424e738f2c667cf545ca0fdec2966711dc28 Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:23:01 +0530
Subject: [PATCH 10/12] fix: use one local storage key
---
js/app.js | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/js/app.js b/js/app.js
index 3a42018..011215c 100644
--- a/js/app.js
+++ b/js/app.js
@@ -1,5 +1,4 @@
-const STORAGE_SAVE_KEY = "launchdesk-v1-items";
-const STORAGE_LOAD_KEY = "launchdesk-items-v1"; // Intentional bug: this key should match STORAGE_SAVE_KEY.
+const STORAGE_KEY = "launchdesk-v1-items";
const demoChecks = [
{
@@ -104,7 +103,7 @@ renderApp();
logActivity("Demo data loaded. Start by testing the checklist workflows.");
function loadChecks() {
- const saved = localStorage.getItem(STORAGE_LOAD_KEY);
+ const saved = localStorage.getItem(STORAGE_KEY);
if (!saved) {
return [...demoChecks];
@@ -119,7 +118,7 @@ function loadChecks() {
}
function saveChecks() {
- localStorage.setItem(STORAGE_SAVE_KEY, JSON.stringify(checks));
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(checks));
}
function handleAddCheck(event) {
From f3c86773ba158bd7f6373366414e991bb2a4849b Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:24:35 +0530
Subject: [PATCH 11/12] fix: load demo checks from correct json file
---
js/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 011215c..3ddc56c 100644
--- a/js/app.js
+++ b/js/app.js
@@ -292,7 +292,7 @@ async function resetDemoData() {
formMessage.textContent = "";
try {
- const response = await fetch("data/launch-seed.json"); // Intentional bug: real file is data/launch-checks.json.
+ const response = await fetch("data/launch-checks.json"); // Intentional bug: real file is data/launch-checks.json.
if (!response.ok) {
throw new Error(`Demo data request failed with ${response.status}`);
From 98e4642a48f9027ce4e509ff50b73b4194018c6d Mon Sep 17 00:00:00 2001
From: ChamalJulanJS <0168julajs@gmail.com>
Date: Fri, 19 Jun 2026 22:25:10 +0530
Subject: [PATCH 12/12] fix: export launch check titles
---
js/app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/app.js b/js/app.js
index 3ddc56c..4adaaf8 100644
--- a/js/app.js
+++ b/js/app.js
@@ -319,7 +319,7 @@ function exportCsv() {
"Due Date",
];
const rows = currentView.map((check) => [
- check.name, // Intentional bug: property should be check.title.
+ check.title, // Intentional bug: property should be check.title.
check.category,
check.priority,
check.status,