Knack Reporting Sync
SKILL.md
Knack Reporting Sync
Purpose
Automates Digital Champion Grant and internal quarterly reporting. Ensures NCDIT compliance and generates stakeholder-ready reports from HTI operational data.
Grant Context
Funding Source: NC Department of Information Technology (NCDIT) Program: Digital Champion Grant (ARPA-funded) Grant Period: 2024-2026 (24 months) Reporting Frequency: Quarterly
Required Metrics:
- Laptops acquired
- Devices converted to HTI Chromebooks
- Units ready for donation
- Devices presented/delivered
- Devices discarded/recycled
- Digital literacy training hours
- Participants trained
- Geographic distribution (15 counties)
Core Functions
generate_quarterly_report
Purpose: Create comprehensive QAR (Quarterly Accountability Report)
Parameters:
quarter(string, required): "Q1" | "Q2" | "Q3" | "Q4"year(string, required): "2024" | "2025" | "2026"format(string, optional): "json" | "pdf" | "html" | "excel"
Example:
const report = await generate_quarterly_report("Q1", "2025", {
format: "pdf",
template: "ncdit_compliance",
include_narrative: true
});
Output Structure:
{
metadata: {
organization: "HUBZone Technology Initiative",
grant_id: "NCDIT-DC-2024-HTI",
period: "Q1 2025",
date_generated: "2025-04-05",
contact: "admin@hubzonetech.org"
},
device_metrics: {
acquired: 875,
converted: 623,
ready: 89,
presented: 534,
discarded: 152,
conversion_rate: 71.2,
success_rate: 85.7
},
training_metrics: {
hours_delivered: 42,
participants: 156,
sessions: 14,
avg_attendance: 11.1
},
geographic_distribution: {
counties_served: 8,
county_breakdown: [
{ county: "Wake", devices: 234, training_hours: 12 },
{ county: "Durham", devices: 189, training_hours: 8 },
// ... 13 more
]
},
progress_toward_goals: {
laptops: { current: 1250, target: 3500, pct: 35.7 },
converted: { current: 890, target: 2500, pct: 35.6 },
train_hours: { current: 78, target: 156, pct: 50.0 }
},
narrative: "During Q1 2025, HTI acquired 875 laptops from 12 donor..."
}
cross_reference_targets
Purpose: Validate progress against grant-defined goals
Parameters:
goals(object, required): Target metrics from grant agreementactual(object, optional): Current metrics (default: fetch from Knack)
Example:
const validation = await cross_reference_targets({
goals: {
laptops: 3500,
converted: 2500,
train_hours: 156,
counties: 15
}
});
// Output:
// {
// laptops: { current: 1250, target: 3500, variance: -2250, status: "behind" },
// converted: { current: 890, target: 2500, variance: -1610, status: "behind" },
// train_hours: { current: 78, target: 156, variance: -78, status: "on_track" },
// counties: { current: 8, target: 15, variance: -7, status: "behind" },
// overall_status: "needs_attention"
// }
validate_data_integrity
Purpose: Ensure report accuracy before submission
Checks:
- No duplicate device records
- All devices have valid status
- Training sessions have required fields
- County assignments match 15-county list
- Date ranges are logical (acquired < converted < presented)
Example:
const validation = await validate_data_integrity({
dataset: await fetch_all_pages("object_1")
});
// Output:
// {
// valid: false,
// errors: [
// { record_id: "rec_123", issue: "Missing county assignment" },
// { record_id: "rec_456", issue: "Converted date before acquired date" }
// ],
// warnings: [
// { record_id: "rec_789", issue: "Unusually high discard rate" }
// ]
// }
export_ncdit_format
Purpose: Format report for NCDIT submission portal
NCDIT Requirements:
- Excel template with specific columns
- Financial data separated from operational
- Signature page with authorized representative
- Backup documentation (receipts, training rosters)
Example:
const ncdit_export = await export_ncdit_format({
quarter: "Q1",
year: "2025",
include_attachments: true
});
// Generates:
// - HTI_Q1_2025_Operational_Report.xlsx
// - HTI_Q1_2025_Financial_Report.xlsx
// - HTI_Q1_2025_Training_Rosters.pdf
// - HTI_Q1_2025_Signature_Page.pdf
generate_board_summary
Purpose: Executive summary for HTI board meetings
Example:
const board_report = await generate_board_summary({
quarter: "Q1",
year: "2025",
include_financials: true,
include_forecast: true
});
Output Sections:
- Executive Summary: 1-paragraph overview
- Key Metrics: 4-6 headline KPIs
- Progress vs. Goals: Visual indicators
- Operational Highlights: Notable donations, partnerships
- Challenges & Risks: Areas needing attention
- Financial Summary: Grant spending, match progress
- Next Quarter Priorities: Action items
Report Templates
NCDIT Quarterly Template
const ncdit_template = {
sections: [
"Grant Information",
"Reporting Period",
"Device Acquisition & Conversion",
"Distribution & Impact",
"Training & Education",
"Geographic Coverage",
"Financial Summary",
"Challenges & Adaptations",
"Next Quarter Plans"
],
format: "excel",
branding: false // NCDIT format, not HTI
};
HTI Internal Template
const internal_template = {
sections: [
"Executive Summary",
"Operational Metrics",
"Business Development",
"Training & Outreach",
"County Expansion Progress",
"Financial Health",
"Donor Relations",
"Team Updates"
],
format: "pdf",
branding: true, // HTI colors, logo
audience: "board"
};
Donor Impact Report
const donor_template = {
sections: [
"Thank You Message",
"Your Impact This Quarter",
"Success Stories",
"Devices in Action (photos)",
"Training Highlights",
"Looking Ahead"
],
format: "html", // Email-friendly
branding: true,
tone: "gratitude-focused"
};
Automated Scheduling
Set Up Quarterly Automation
// Run automatically 5 days after quarter end
const schedule = {
Q1: { deadline: "04-05", auto_generate: "04-01" },
Q2: { deadline: "07-05", auto_generate: "07-01" },
Q3: { deadline: "10-05", auto_generate: "10-01" },
Q4: { deadline: "01-05", auto_generate: "01-01" }
};
cron.schedule('0 9 1 1,4,7,10 *', async () => {
const quarter = getCurrentQuarter();
const year = getCurrentYear();
console.log(`Auto-generating ${quarter} ${year} report...`);
const report = await generate_quarterly_report(quarter, year);
await notify_admin({
subject: `${quarter} ${year} Report Ready for Review`,
report_url: report.url
});
});
Data Validation Rules
Device Lifecycle Logic
const validation_rules = {
acquisition: {
required_fields: ["donor", "acquisition_date", "quantity", "condition"],
date_range: "within grant period (2024-2026)"
},
conversion: {
required_fields: ["converted_date", "os_installed", "tested"],
logic: "converted_date >= acquisition_date"
},
presentation: {
required_fields: ["recipient", "county", "presented_date"],
logic: "presented_date >= converted_date"
},
discard: {
required_fields: ["discard_reason", "discard_date"],
allowed_reasons: ["Beyond repair", "Missing parts", "Too old"]
}
};
Training Session Validation
const training_validation = {
required_fields: [
"session_date",
"county",
"duration_hours",
"participants",
"topic"
],
logic: {
duration: "between 1 and 8 hours",
participants: "at least 1",
date: "within grant period"
}
};
Grant Compliance Checklist
Pre-Submission Verification
async function verify_report_compliance(report) {
const checks = {
data_complete: await check_all_fields_present(report),
dates_valid: await validate_date_logic(report),
totals_match: await cross_check_sums(report),
counties_valid: await verify_county_list(report),
narrative_included: report.narrative && report.narrative.length > 100,
financials_attached: report.attachments.includes("financial_report"),
signature_present: report.signature && report.signature.date
};
const all_passed = Object.values(checks).every(v => v === true);
return {
ready_for_submission: all_passed,
checks: checks
};
}
Narrative Generation
Auto-Generate Quarterly Narrative
async function generate_narrative({ metrics, quarter, year }) {
const template = `
During ${quarter} ${year}, HUBZone Technology Initiative:
- Acquired ${metrics.acquired} laptops from ${metrics.donors} donor organizations
- Successfully converted ${metrics.converted} devices into HTI Chromebooks (${metrics.conversion_rate}% conversion rate)
- Delivered ${metrics.presented} Chromebooks to residents and organizations across ${metrics.counties_served} counties
- Conducted ${metrics.training_hours} hours of digital literacy training, serving ${metrics.participants} participants
${metrics.highlights.map(h => `- ${h}`).join('\n')}
Challenges this quarter: ${metrics.challenges}
Looking ahead to ${nextQuarter}: ${metrics.next_priorities}
`;
return template;
}
Integration Points
- knack_reader: Fetch all data for reports
- knack_pagination: Retrieve complete datasets
- knack_filter_sort: Filter by quarter/year
- knack_dashboard_ai: Generate metrics and insights
- knack_goal_tracker: Progress vs. targets
- knack_data_cleaner: Validate before export
- knack_exporter: Multi-format output (PDF, Excel, HTML)
Error Handling
try {
const report = await generate_quarterly_report("Q1", "2025");
} catch (error) {
if (error.type === "DATA_INCOMPLETE") {
console.error("Missing required data:", error.missing_fields);
} else if (error.type === "VALIDATION_FAILED") {
console.error("Data validation errors:", error.errors);
} else {
console.error("Report generation failed:", error);
}
}
Best Practices
- Generate early: Create draft 1 week before deadline
- Manual review: Always review auto-generated narratives
- Backup data: Save source data with each report
- Version control: Track report revisions
- Audit trail: Log all report generations
Next-Quarter Planning
Auto-Generate Priorities
async function suggest_next_quarter_priorities({ current_metrics, goals }) {
const gaps = await identify_gaps(current_metrics, goals);
return {
acquisition: gaps.laptops > 500 ? "Intensify donor outreach" : "Maintain pace",
training: gaps.train_hours > 20 ? "Schedule additional sessions" : "On track",
counties: gaps.counties > 5 ? "Expand to new counties" : "Deepen existing",
conversion: current_metrics.conversion_rate < 70 ? "Review testing process" : "Excellent"
};
}