diff --git a/.changeset/27356-studio-flow-help-learn-more.md b/.changeset/27356-studio-flow-help-learn-more.md
new file mode 100644
index 00000000000..52ebeed6c07
--- /dev/null
+++ b/.changeset/27356-studio-flow-help-learn-more.md
@@ -0,0 +1,16 @@
+---
+'@object-ui/app-shell': patch
+'@object-ui/i18n': patch
+---
+
+feat(studio): a long flow-node help opens clamped behind "Learn more", and a list column's description is shown under the column instead of filling its placeholder
+
+Clause-②: no
+Metadata-protocol: none
+
+In Studio's flow node inspector:
+
+- **Long help.** A field's help longer than 120 characters opens clamped to two lines with a **Learn more** toggle (**Show less** to fold it again). Shorter help renders in full as before. The whole text stays on the page either way, so a screen reader and a text search still reach it.
+- **List column descriptions.** In a repeated list such as an approval node's Approvers, a column's schema description used to fill the input's placeholder, where a paragraph read as a cut-off example value and disappeared on the first keystroke. It is now the column's help, shown under the column with the same Learn more toggle, and the input keeps its own placeholder.
+
+The words themselves are unchanged: they are the engine-published schema descriptions.
diff --git a/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowFieldHelp.learnMore-27356.test.tsx b/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowFieldHelp.learnMore-27356.test.tsx
new file mode 100644
index 00000000000..04b64109c45
--- /dev/null
+++ b/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowFieldHelp.learnMore-27356.test.tsx
@@ -0,0 +1,101 @@
+// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
+
+/**
+ * The flow inspector's help lines (#27356 row 15).
+ *
+ * 1. A schema description on an objectList column is the column's help, shown
+ * under the column, and never its placeholder: a paragraph squeezed into
+ * an input's placeholder reads as a cut-off example value and vanishes on
+ * the first keystroke.
+ * 2. Help longer than `FLOW_HELP_CLAMP_CHARS` opens clamped to two lines with a
+ * "Learn more" toggle; shorter help renders in full with no toggle. The
+ * full text is in the DOM either way.
+ */
+
+import { describe, it, expect, vi, afterEach } from 'vitest';
+import { render, screen, cleanup, fireEvent, within } from '@testing-library/react';
+import { z } from 'zod';
+import { ApprovalNodeConfigSchema } from '@objectstack/spec/automation';
+import { FlowObjectListField } from './FlowObjectListField';
+import { FlowNodeConfigField } from './FlowNodeConfigField';
+import { FLOW_HELP_CLAMP_CHARS } from './FlowFieldHelp';
+import { jsonSchemaToFlowFields } from './json-schema-to-fields';
+import type { FlowConfigField } from './flow-node-config';
+
+afterEach(cleanup);
+
+// The approval node's fields as the engine publishes them: the installed
+// contract's own JSON Schema, not a copy of it.
+const schema = z.toJSONSchema(ApprovalNodeConfigSchema, { io: 'input' });
+const served = jsonSchemaToFlowFields(schema)!;
+const approvers = served.find((f) => f.id === 'approvers')!;
+const orgCol = approvers.columns!.find((c) => c.key === 'organization')!;
+const orgDescription = (
+ schema as unknown as {
+ properties: { approvers: { items: { properties: { organization: { description: string } } } } };
+ }
+).properties.approvers.items.properties.organization.description;
+
+describe('objectList column descriptions are help, not placeholders (#27356 row 15)', () => {
+ it('maps the served approver `organization` description to the column help', () => {
+ expect(orgDescription.length).toBeGreaterThan(0);
+ expect(orgCol.help).toBe(orgDescription);
+ expect(orgCol.placeholder).toBeUndefined();
+ });
+
+ it('renders the description under the column, with no input carrying it as a placeholder', () => {
+ const { container } = render(
+ ,
+ );
+ const placeholders = Array.from(container.querySelectorAll('[placeholder]')).map((el) => el.getAttribute('placeholder'));
+ expect(placeholders).not.toContain(orgDescription);
+ const helps = screen.getAllByTestId('flow-field-help').map((el) => el.querySelector('p')?.textContent);
+ expect(helps).toContain(orgDescription);
+ });
+});
+
+const field = (help: string): FlowConfigField => ({
+ id: 'excludeSubmitter',
+ path: ['config', 'excludeSubmitter'],
+ label: 'Exclude submitter',
+ kind: 'boolean',
+ help,
+});
+
+describe('long help opens clamped behind "Learn more" (#27356 row 15)', () => {
+ it('clamps a long help and toggles it open and closed', () => {
+ const long = 'Segregation of duties for this step. '.repeat(5).trim();
+ expect(long.length).toBeGreaterThan(FLOW_HELP_CLAMP_CHARS);
+ render( {}} />);
+ const help = screen.getByTestId('flow-field-help');
+ const text = help.querySelector('p')!;
+ expect(text.textContent).toBe(long);
+ expect(text.className).toContain('line-clamp-2');
+ const toggle = within(help).getByRole('button', { name: 'Learn more' });
+ expect(toggle.getAttribute('aria-expanded')).toBe('false');
+ expect(toggle.getAttribute('aria-controls')).toBe(text.id);
+
+ fireEvent.click(toggle);
+ expect(text.className).not.toContain('line-clamp-2');
+ const less = within(help).getByRole('button', { name: 'Show less' });
+ expect(less.getAttribute('aria-expanded')).toBe('true');
+
+ fireEvent.click(less);
+ expect(text.className).toContain('line-clamp-2');
+ });
+
+ it('renders a short help in full, with no toggle', () => {
+ render( {}} />);
+ const help = screen.getByTestId('flow-field-help');
+ expect(help.querySelector('p')!.className).not.toContain('line-clamp-2');
+ expect(within(help).queryByRole('button')).toBeNull();
+ });
+});
diff --git a/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowFieldHelp.tsx b/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowFieldHelp.tsx
new file mode 100644
index 00000000000..c4b6a6f0cf7
--- /dev/null
+++ b/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowFieldHelp.tsx
@@ -0,0 +1,45 @@
+// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
+
+/**
+ * FlowFieldHelp — the help line under a flow inspector field or list column.
+ *
+ * Help text is often the engine-published schema description, which can run to
+ * a paragraph. A help longer than {@link FLOW_HELP_CLAMP_CHARS} opens clamped to
+ * two lines with a "Learn more" toggle; the full text stays in the DOM either
+ * way, so a screen reader and a text search still reach all of it.
+ */
+
+import * as React from 'react';
+import { cn } from '@object-ui/components';
+import { t, useMetadataLocale } from '../i18n.js';
+
+/** Help at or under this many characters renders in full, with no toggle. */
+export const FLOW_HELP_CLAMP_CHARS = 120;
+
+export function FlowFieldHelp({ text, className }: { text: string; className?: string }) {
+ const locale = useMetadataLocale();
+ const [expanded, setExpanded] = React.useState(false);
+ const id = React.useId();
+ const long = text.length > FLOW_HELP_CLAMP_CHARS;
+ return (
+
+
+ {text}
+
+ {long && (
+
+ )}
+
+ );
+}
diff --git a/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeConfigField.tsx b/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeConfigField.tsx
index f0420f0e674..ea4ec5df2c9 100644
--- a/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeConfigField.tsx
+++ b/ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeConfigField.tsx
@@ -31,6 +31,7 @@ import {
} from '@objectstack/spec/automation';
import { FlowKeyValueField, type FlowKeyValueFieldProps } from './FlowKeyValueField.js';
import { FlowExprIssue } from './FlowExprIssue.js';
+import { FlowFieldHelp } from './FlowFieldHelp.js';
import {
isEditableValueEnvelope,
isValueEnvelopeSlot,
@@ -983,9 +984,7 @@ export function FlowNodeConfigField({ field, value, onCommit, disabled, locale,
{describeUnknownRefs(unknownRefs, locale)}