Enforces active voice (verb-first) for all Simple History logger messages and the Event Details API for details output. Triggers: creating a new logger class, writing or modifying a 'messages' array in get_info()/getInfo(), calling notice_message/warning_message/info_message, or implementing get_log_row_details_output().
Content & Writing
314 Stars
74 Forks
Updated Jan 16, 2026, 07:48 PM
Why Use This
This skill provides specialized capabilities for bonny's codebase.
Use Cases
Developing new features in the bonny repository
Refactoring existing code to follow bonny standards
Understanding and working with bonny's codebase structure
---
name: logger-messages
description: "Enforces active voice (verb-first) for all Simple History logger messages and the Event Details API for details output. Triggers: creating a new logger class, writing or modifying a 'messages' array in get_info()/getInfo(), calling notice_message/warning_message/info_message, or implementing get_log_row_details_output()."
allowed-tools: Read, Grep, Glob
---
# Logger Message Guidelines
Write clear, user-friendly messages for Simple History event logs.
## Core Principle: Active Voice
Write as if someone is telling you what they just did.
```
✅ DO ❌ DON'T
─────────────────────────────────────────────
Activated plugin Plugin was activated
Created menu Menu has been created
Updated settings Settings were updated
Published post Post has been published
```
## In Logger Classes
```php
public function getInfo() {
return [
'messages' => [
'plugin_activated' => __( 'Activated plugin', 'simple-history' ),
'plugin_deactivated' => __( 'Deactivated plugin', 'simple-history' ),
'post_updated' => __( 'Updated post "{post_title}"', 'simple-history' ),
],
];
}
```
## Message Key Uniqueness
Keys must be globally unique across all loggers (used as RFC 5424 MSGID).
```php
// ✅ Good - descriptive prefix
'plugin_activated', 'theme_switched', 'user_logged_in'
// ❌ Bad - too generic
'activated', 'updated', 'deleted'
```
Verify uniqueness: `grep -r "'your_key'" loggers/`
## Common Verbs
- **Create:** Created, Added, Generated
- **Modify:** Updated, Changed, Edited
- **Delete:** Deleted, Removed, Trashed
- **Toggle:** Activated, Deactivated, Enabled, Disabled
## Avoid
- ❌ "was [verb]" - passive
- ❌ "has been [verb]" - passive
- ❌ Technical jargon users won't understand
## Context Key Naming
Prefix all context keys with the entity name to avoid collisions and keep keys self-documenting.
```php
// ✅ Good - prefixed with entity
'plugin_name', 'plugin_current_version', 'theme_new_version'
'site_health_status', 'site_health_label', 'site_health_badge_label'
// ❌ Bad - too generic
'test', 'label', 'status', 'name', 'version'
```
## Event Details Output
Use the Event Details API for `get_log_row_details_output()`. Never build raw HTML with `SimpleHistoryLogitem__keyValueTable`.
```php
use Simple_History\Event_Details\Event_Details_Group;
use Simple_History\Event_Details\Event_Details_Group_Table_Formatter;
use Simple_History\Event_Details\Event_Details_Item;
public function get_log_row_details_output( $row ) {
$group = new Event_Details_Group();
$group->set_formatter( new Event_Details_Group_Table_Formatter() );
$group->add_items(
array(
// Read value directly from context key.
new Event_Details_Item( 'status', __( 'Status', 'simple-history' ) ),
// Read new/prev pair from context (looks for key_new and key_prev).
new Event_Details_Item( array( 'setting_name' ), __( 'Setting', 'simple-history' ) ),
)
);
return $group;
}
```
**Formatters:**
- `Event_Details_Group_Table_Formatter` — key-value table (default)
- `Event_Details_Group_Diff_Table_Formatter` — before/after with diffs
- `Event_Details_Group_Inline_Formatter` — compact inline text
**Manual values** (when context keys don't match conventions):
```php
( new Event_Details_Item( null, __( 'Label', 'simple-history' ) ) )
->set_new_value( $value )
```
See `docs/architecture/event-details.md` for full API reference.
## Detailed Resources
- [examples.md](examples.md) - Extensive examples across all WordPress contexts
- [integration.md](integration.md) - Complete logger class implementation